2009-07-13 1 views
2

CAtlExeModuleTを使用する非常に単純なWin32アプリケーションがあります。このモジュールはCWindowImplから派生したCTestWindowクラスを作成するだけです。 WM_PAINT用の単一のメッセージハンドラを持つだけです。ウィンドウを作成して表示した後、OnPaintメソッド(WM_PAINTメッセージ)は無限に呼び出され、そこで100%CPUを消費します。ATL CWindowImplでWM_PAINTループを終了しない

ウィンドウを作成するコードは非常に簡単です:

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ではありません。

アプリケーションは WM_PAINTメッセージに応答してBeginPaint関数 とEndPaintを呼び出す、または ウィンドウを検証する DefWindowProc関数関数にメッセージを渡す必要があります。 DefWindowProcは、更新領域 を検証します。ウィンドウ の背景を消去する必要がある場合は、 WM_ERASEBKGNDメッセージを送信できます。

これは、OSがまだウィンドウをペイントする必要があると判断して、もう一度お電話することを意味します。

関連する問題