Перепрошивка в OnPaint - PullRequest
       36

Перепрошивка в OnPaint

1 голос
/ 06 февраля 2012

У меня есть дети класса CWind, где я подписываюсь на событие OnPaint:

BEGIN_MESSAGE_MAP(MyListBox, CWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

Если в обработчике OnPaint я рисую что-то простое в окне, например, border, все хорошо.Но если я добавлю Sleep(50); (делая это, я симулирую некоторые сложные операции рисования), мое окно будет мигать.Я не могу понять, почему это происходит ... Может быть, проблема в том, что функция OnPaint вызывается часто, примерно 2-3 раза в секунду.

Обновление: я использую двойной разделитель: сначала я рисую содержимое окна в PaintDeviceContentа затем скопируйте этот DC в DC окна.

Update2: вот код:

void CDirectionsListBox::OnPaint() 
{ 
    CRect rectClient;
    GetClientRect(rectClient);

    CPaintDC dc(this); // device context for painting

    CDC DCMem;
    DCMem.CreateCompatibleDC( &dc );

    // Draw window here, workign with DCMem

    dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &DCMem, 0, 0, SRCCOPY);
}

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

По умолчанию фон закрашивается путем очистки клиентской области с помощью кисти фона. Вы хотите выключить это. Обращайтесь с WM_ERASEBKGND и ничего не делайте, так как вы все равно собираетесь прыгать поверх любого существующего изображения.

Также см. Как избежать мерцания при обработке WM_ERASEBKGND в диалоге Windows

1 голос
/ 06 февраля 2012

Причина, по которой ваше окно мигает, заключается в том, что он пытается отобразить вещи, которые еще не закончили рисовать.

При рисовании с использованием MFC вам необходимо вручную удвоить буфер окна, в которое вы рисуете, если операция рисования нетривиальна. По сути, вы хотите создать контекст рисования в памяти и использовать его вместо этого. Когда рисунок завершен, вы копируете найденное в контексте памяти в контекст окна.

...