Processing System Messages

Tuesday Jul 22nd 2003 by Pratap J. Prabhu
Share:

When running in a loop within a dialog box, the command buttons do not work. While other authors have shown how to use separate threads to run a modal dialog box, this article shows how to process the Message Loop within the same dialog by adding a simple function and making calls to it.

Environment: VC6

The Requirement

I needed to run a loop in a modal dialog box, but found that although the UpdateWindow() function updated the window (and did not leave me with a White Box on the screen), the buttons onscreen were unresponsive. I searched the Internet and found articles on how to open a dialog in another thread and to keep monitoring the secondary dialog, but was not happy with the solution.

The Solution

I finally came up with a solution to process the dialog box's messages in a function within the dialog box itself. It works great.

My solution consists of adding a function to the existing dialog class and calling it to process the messages.

  BOOL CMyDialog::ProcessDialogMessages()
  {
    Sleep(0);                                  // Yield to other
                                               // system processes

    // Process the message queue
    MSG dlgMsg;
    if (::PeekMessage (&dlgMsg, NULL, 0, 0, PM_NOREMOVE))
                                               // If there are
                                               // pending messages
    {
       if (!AfxGetApp ()->PumpMessage ()) {    // Allow them to be
                                               // processed
          ::PostQuitMessage (0);               // When no more
                                               // messages exist,
                                               // return WM_QUIT
                                               // should return 0
          return TRUE;                         // Return the caller,
                                               // indicating that
                                               // we just processed
                                               // a Message and that
                                               // there may be more
    }
  }

   // Simulate idle processing.
   LONG lIdle = 0;
   while (AfxGetApp ()->OnIdle (lIdle++));
     return FALSE;                             // Return to Caller,
                                               // saying that we
                                               // did not process
                                               // any messages
  }

Downloads

Download demo project - 4 Kb
Download source - 26 Kb
Share:
Home
Mobile Site | Full Site
Copyright 2017 © QuinStreet Inc. All Rights Reserved