• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 937
  • Last Modified:

BN_CLICKED and the message queue

I'm trying to perfom an operation if a certain button is clicked within a Dialog created with the CDialog constructor and Create. After creating the dialog, I'm going into a loop which processes messages using PeekMessage. The problem is, the WM_COMMAND and BN_CLICKED messages never show themselves with PeekMessage. Can someone please tell me what I am doing incorrectly:

CDialog *dlgProductKey = new CDialog();
MSG msg;
            
dlgProductKey->Create(IDD_ENTERKEY, this);
dlgProductKey->ShowWindow(SW_SHOW);

while (dlgProductKey->IsWindowVisible()) {

    if (PeekMessage(&msg, dlgProductKey->m_hWnd, 0, 0, PM_REMOVE)) {

      if (msg.message == WM_COMMAND && HIWORD(msg.wParam) == BN_CLICKED){
             MessageBox("Button was clicked");
      }
                  
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
}


When I use the Microsoft Message Spy, I can clearly see that the dlgProductKey dialog is receiving the WM_COMMAND|BN_CLICKED message. Do I have to subclass the dialog, or is there an easier way (like the method I am attempting). I was hoping not to create a new class for the IDD_ENTERKEY dialog resource.
0
Skonen
Asked:
Skonen
1 Solution
 
nonubikCommented:
The simplest way is to add an event handler to your button.
Go to your dialog resource, right click on the desired button and choose 'Events..' Then select BN_CLICKED and choose 'Add and edit'. You will be asked for the handler method name.
0
 
SkonenAuthor Commented:
That only works if the dialog resource has an associated class, I can do that quicker than you can blink. But now it isn't so much over how to do it the fastest, I am just wondering what I'd have to do to make the code above work properly.
0
 
OnegaZhangCommented:
I think you need to call IsDialogMessage in the message loop.

welcome to www.fruitfruit.com
0
 
nonubikCommented:
>Do I have to subclass the dialog
Yes, if you do not intend to cerate a CDialog class for the resource.
0
 
MikeAThonCommented:
I think OnegaZhang is correct: you need to call IsDialogMessage.

But since this is an MFC app, you might get better results by calling CWinThread::PumpMessage:

while (dlgProductKey->IsWindowVisible()) {

    if (PeekMessage(&msg, dlgProductKey->m_hWnd, 0, 0, PM_NOREMOVE)) {  // <<-- note change to PM_NOREMOVE

     if (msg.message == WM_COMMAND && HIWORD(msg.wParam) == BN_CLICKED){
           MessageBox("Button was clicked");
     }
               
     AfxGetApp()->PumpMessage();

    }
}
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now