Processing System Messages

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

More by Author

Must Read