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. |