2009-07-13 53 views
2

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

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

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

回答

4

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

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

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