BOOL CMyApp::OnIdle(LONG lCount)
{
if(CWinApp::OnIdle(lCount))return TRUE;
CPaintDC dc2((CMainWnd*)m_pMainWnd);
CPen Pen2;
Pen2.CreatePen(PS_GEOMETRIC, 1, RGB(0, 200, 0));
dc2.SelectObject(&Pen2);
dc2.MoveTo(10, 10);
dc2.LineTo(50, 10);
Pen2.DeleteObject();
return FALSE;
}
Проблема с рисованием
Код:
Код:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
CPen Pen;
Pen.CreatePen(PS_GEOMETRIC, 1, RGB(200, 0, 0));
dc.SelectObject(&Pen);
dc.MoveTo(10, 10);
dc.LineTo(10, 50);
Pen.DeleteObject();
}
{
CPaintDC dc(this);
CPen Pen;
Pen.CreatePen(PS_GEOMETRIC, 1, RGB(200, 0, 0));
dc.SelectObject(&Pen);
dc.MoveTo(10, 10);
dc.LineTo(10, 50);
Pen.DeleteObject();
}
Но почему-то линия в OnPaint рисуется, а в OnIdle нет. Подскажите, пожалуйста, как это исправить.
UpdateWindow?
А куда его вставить?
{
if(CWinApp::OnIdle(lCount))return TRUE;
CPaintDC dc2((CMainWnd*)m_pMainWnd);
CPen Pen2;
Pen2.CreatePen(PS_GEOMETRIC, 1, RGB(0, 200, 0));
dc2.SelectObject(&Pen2);
dc2.MoveTo(10, 10);
dc2.LineTo(50, 10);
Pen2.DeleteObject();
pMainWnd->Invalidate();
pMainWnd->UpdateWindow()
return FALSE;
}
Но не ручаюсь.
Не помогает :(
Просто в CPaintDC будет рисовать только туда, где необходима отрисовка (вызываются функции BeginPaint и т.п.), а в onIdle винда думает что отрисовывать ничего не нужно, вот и не дает тебе рисовать
Код:
CClientDC dc(m_pMainWnd);
Код:
BOOL CMyApp::OnIdle(LONG lCount)
{
if(CWinApp::OnIdle(lCount))return TRUE;
CPaintDC dc2((CMainWnd*)m_pMainWnd);
CPen Pen2;
Pen2.CreatePen(PS_GEOMETRIC, 1, RGB(0, 200, 0));
dc2.SelectObject(&Pen2);
dc2.MoveTo(10, 10);
dc2.LineTo(50, 10);
Pen2.DeleteObject();
return FALSE;
}
{
if(CWinApp::OnIdle(lCount))return TRUE;
CPaintDC dc2((CMainWnd*)m_pMainWnd);
CPen Pen2;
Pen2.CreatePen(PS_GEOMETRIC, 1, RGB(0, 200, 0));
dc2.SelectObject(&Pen2);
dc2.MoveTo(10, 10);
dc2.LineTo(50, 10);
Pen2.DeleteObject();
return FALSE;
}
Код:
void CMainWnd::OnPaint()
{
CPaintDC dc(this);
CPen Pen;
Pen.CreatePen(PS_GEOMETRIC, 1, RGB(200, 0, 0));
dc.SelectObject(&Pen);
dc.MoveTo(10, 10);
dc.LineTo(10, 50);
Pen.DeleteObject();
}
{
CPaintDC dc(this);
CPen Pen;
Pen.CreatePen(PS_GEOMETRIC, 1, RGB(200, 0, 0));
dc.SelectObject(&Pen);
dc.MoveTo(10, 10);
dc.LineTo(10, 50);
Pen.DeleteObject();
}
Но почему-то линия в OnPaint рисуется, а в OnIdle нет. Подскажите, пожалуйста, как это исправить.[/QUOTE]
Вообще-то так не принято делать. Рисование обычно производят по возможности только на OnPaint, а в прочих местах вызывают Invalidate(). Это во-первых.
Во-вторых. На OnPaint контекст устройства принято получать через BeginPaint и отдавать его с помощью EndPaint. Кроме того, ты с помощью BeginPaint можешь узнать область, в которой нужно производить рисование (т. е. не всегда обязательно перерисовывать полностью всё окно), а с помощью EndPaint объявляешь эти области "валидными", не требующими дальнейшей прорисовки. Если этого не сделать, область так и будет считаться требующей перерисовки ("инвалидной").
Код:
void CMainWnd::OnPaint()
{
PAINTSTRUCT ps;
BeginPaint (&ps);
// Здесь рисуем
// В структуре ps сидит информация об области, требующей перерисовки
EndPaint (&ps);
}
{
PAINTSTRUCT ps;
BeginPaint (&ps);
// Здесь рисуем
// В структуре ps сидит информация об области, требующей перерисовки
EndPaint (&ps);
}
Перерисовку экрана лучше производить в функции OnPaint, если хочешь вынести отдельно код, то в функции OnPaint вызови OnIdle(CDC idle_dc), с передачей контекста в нее.