Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с рисованием

16K
07 сентября 2006 года
Lightmare
13 / / 26.08.2006
Вот есть в программе два условных кода в OnIdle и в OnPaint:
Код:
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();
}

Но почему-то линия в OnPaint рисуется, а в OnIdle нет. Подскажите, пожалуйста, как это исправить.
398
07 сентября 2006 года
Alexandoros
630 / / 21.10.2005
UpdateWindow?
16K
07 сентября 2006 года
Lightmare
13 / / 26.08.2006
А куда его вставить?
398
07 сентября 2006 года
Alexandoros
630 / / 21.10.2005
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();

pMainWnd->Invalidate();
pMainWnd->UpdateWindow()
return FALSE;
}

Но не ручаюсь.
16K
07 сентября 2006 года
Lightmare
13 / / 26.08.2006
Не помогает :(
395
07 сентября 2006 года
RelB
367 / / 09.11.2002
А почему ты не хочешь в OnIdle вызывать Invalidate, а затем автоматом вызовется OnPaint и там все отрисовать?
Просто в CPaintDC будет рисовать только туда, где необходима отрисовка (вызываются функции BeginPaint и т.п.), а в onIdle винда думает что отрисовывать ничего не нужно, вот и не дает тебе рисовать
14K
08 сентября 2006 года
wrap
35 / / 02.06.2006
В OnIdle() контекст устройства надо получать так:
 
Код:
CClientDC  dc(m_pMainWnd);
350
08 сентября 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=Lightmare]Вот есть в программе два условных кода в OnIdle и в OnPaint:
Код:
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();
}

Но почему-то линия в OnPaint рисуется, а в OnIdle нет. Подскажите, пожалуйста, как это исправить.[/QUOTE]
Вообще-то так не принято делать. Рисование обычно производят по возможности только на OnPaint, а в прочих местах вызывают Invalidate(). Это во-первых.
Во-вторых. На OnPaint контекст устройства принято получать через BeginPaint и отдавать его с помощью EndPaint. Кроме того, ты с помощью BeginPaint можешь узнать область, в которой нужно производить рисование (т. е. не всегда обязательно перерисовывать полностью всё окно), а с помощью EndPaint объявляешь эти области "валидными", не требующими дальнейшей прорисовки. Если этого не сделать, область так и будет считаться требующей перерисовки ("инвалидной").
 
Код:
void CMainWnd::OnPaint()
{
  PAINTSTRUCT ps;
  BeginPaint (&ps);
// Здесь рисуем
// В структуре ps сидит информация об области, требующей перерисовки
  EndPaint (&ps);
}
533
09 сентября 2006 года
Visualex
254 / / 07.01.2005
Перерисовку экрана лучше производить в функции OnPaint, если хочешь вынести отдельно код, то в функции OnPaint вызови OnIdle(CDC idle_dc), с передачей контекста в нее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог