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

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

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

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; } 

我的猜测是,你没有验证你的绘图处理程序中的窗口 。

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

这将意味着操作系统会认为窗口仍然需要着色,并再次打电话给您。