If 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.
Back to the top
The painting problem occurs because the WM_PAINT messages are in the queue,
but are not dispatched.
Back to the top
One 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.
Back to the top
To 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.
Back to the top
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.
//
BOOL 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();
Back to the top