Microsoft KB Archive/152074

= PRB: COleMessageFilter Doesn't Process WM_PAINT =

Article ID: 152074

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 4.0 Standard Edition

 Microsoft Visual C++ 4.1 Subscription 

-



This article was previously published under Q152074



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



CAUSE
The painting problem occurs because the WM_PAINT messages are in the queue, but are not dispatched.



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

<div class="moreinformation_section">

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

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;

Additional query words: 2.00 2.10 2.20 4.00 4.10

Keywords: kbcode kbprb KB152074

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.