PRB: COleMessageFilter Doesn't Process WM_PAINT (152074)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1

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.

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();
				

Modification Type:MajorLast Reviewed:10/24/2003
Keywords:kbcode kbprb KB152074