我有一个非常简单的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;
}
答案 0 :(得分:4)
我的猜测是你不是validating the window in your paint handler。
应用程序必须调用BeginPaint 和EndPaint响应WM_PAINT 消息,或将消息传递给 DefWindowProc函数验证 窗口。 DefWindowProc验证了 更新区域;它可以发送 如果窗口是WM_ERASEBKGND消息 背景需要删除。
这意味着操作系统会认为窗口仍需要绘制,并再次打电话给你。