Никогда не заканчивающийся цикл WM_PAINT с ATL CWindowImpl - PullRequest
2 голосов
/ 13 июля 2009

У меня есть очень простое приложение Win32, которое использует CAtlExeModuleT. Модуль просто создает класс CTestWindow, производный от CWindowImpl. Он просто имеет один обработчик сообщений для WM_PAINT. После того, как я создал окно и отобразил его, метод OnPaint (сообщение WM_PAINT) вызывается бесконечно, и он потребляет 100% ЦП.

Код, который создает окно, очень прост:

    m_pMainWnd = new CTestWindow();
if(NULL == m_pMainWnd->Create(NULL, CWindow::rcDefault, _T("Test Window"), WS_OVERLAPPEDWINDOW, 0, hMenu)){
    DWORD dwErr = GetLastError();
    return E_FAIL;
}
m_pMainWnd->ShowWindow(nShowCmd);

Обработчик сообщений OnPaint также очень прост (он ничего не делает):

LRESULT CTestWindow::OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    // TODO: Add your message handler code here and/or call default

    return 0;
}

1 Ответ

4 голосов
/ 13 июля 2009

Я предполагаю, что вы не проверяете окно в вашем обработчике рисования .

Приложение должно вызывать BeginPaint и EndPaint в ответ на WM_PAINT сообщения или передать сообщение Функция DefWindowProc для проверки окно. DefWindowProc проверяет обновить регион; он может отправить WM_ERASEBKGND сообщение, если окно фон необходимо стереть.

Это будет означать, что ОС будет думать, что окно все еще нужно покрасить, и позвонит вам снова.

...