永远不要用ATL CWindowImpl结束WM_PAINT循环

时间:2009-07-13 02:26:52

标签: windows atl

我有一个非常简单的Win32应用程序,它使用CAtlExeModuleT。该模块只是创建一个从CWindowImpl派生的类CTestWindow。它只有一个WM_PAINT消息处理程序。在我创建窗口并显示它之后,无限地调用OnPaint方法(WM_PAINT消息)并消耗100%的CPU。

创建窗口的代码非常简单:

    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 个答案:

答案 0 :(得分:4)

我的猜测是你不是validating the window in your paint handler

  

应用程序必须调用BeginPaint   和EndPaint响应WM_PAINT   消息,或将消息传递给   DefWindowProc函数验证   窗口。 DefWindowProc验证了   更新区域;它可以发送   如果窗口是WM_ERASEBKGND消息   背景需要删除。

这意味着操作系统会认为窗口仍需要绘制,并再次打电话给你。