PRB: COleMessageFilter Doesn't Process WM_PAINTLast reviewed: July 10, 1997Article ID: Q152074 |
4.00 4.10
WINDOWS NT
kbole kbprb kbcode
The information in this article applies to:
SYMPTOMSIf an automation client calls a method of an automation server that brings up a modal dialog, the client area below the dialog may not re-paint itself if the dialog is moved over it.
CAUSEThe painting problem occurs because the WM_PAINT messages are in the queue, but are not dispatched.
RESOLUTIONOne solution is to retrieve and dispatch all WM_PAINT messages when IMessageFilter::MessagePending is called. The sample code below demonstrates one way for this resolution to be implemented.
MORE INFORMATIONTo fix the problem with MFC, create a new class that overrides COleMessageFilter::OnMessagePending() as described below. Then revoke the old message filter and register this new one.
Sample Code
// // definition of new COleMessageFilter-derived class // class CMyMessageFilter : public COleMessageFilter { public: virtual BOOL OnMessagePending(const MSG* pMsg); }; // // add a member variable to the CWinApp-derived class // public: CMyMessageFilter MMF; // // add to the CWinApp::InitInstance after calling AfxOleInit // COleMessageFilter* OldFilter = AfxOleGetMessageFilter(); OldFilter->Revoke(); MMF.Register(); // // Definition of OnMessageFilter // CMyMessageFilter::OnMessagePending(const MSG* pMsg) { MSG msg; while (PeekMessage(&msg, NULL, WM_PAINT, WM_PAINT, PM_REMOVE | PM_NOYIELD)) { DispatchMessage(&msg); } if (pMsg->message == WM_PAINT) return TRUE; return FALSE; } // // add to CWinApp::ExitInstance // MMF.Revoke(); return CWinApp::ExitInstance(); |
Additional reference words: 2.00 2.10 2.20 4.00 4.10
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |