Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I use Dialog resources in Win32?

Without resources I can create my UI with a complex array of CreateWindow() and CreateWindowEx(), and WndProc() to process my events.

I noticed if I right-click in the resource view and click "add resource", I can draw a dialog box with all the controls. This would save me a huge amount of time if I could draw the interface like I normally do with C#.

After I've drawn the interface with the resource editor, how do I then create the window from code? Can someone provide a very simple example with a button, and show how to handle a WM_COMMAND event on that button please?

Also, is this generally how people create the GUI? Is there any loss in flexible to do this way? Even in C# I often have to supplement designer-generated UI with my own code-generated UI, but the majority of the time I'm quite happy to use designer.

like image 735
user1002358 Avatar asked Nov 18 '11 03:11

user1002358


2 Answers

After creating the dialog in the resource editor, call CreateDialog(modeless dialog;you need to dispatch the messages manually just like when you use CreateWindow) or DialogBox(modal dialog; the function does not return until you close the dialog. it does the dispatching for you) to make the dialog show up. Just like you pass in the window proc to RegisterClass, you pass the dialog proc to those functions for the dialog call back. An example of DialogProc looks likes this:

BOOL DialogProc( HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam ){
    switch( iMessage ){
    case WM_COMMAND:
        switch( LOWORD( wParam ) ){
        case BTOK:
            MessageBox( hDlg, "Hello, World!", NULL, NULL );
            return TRUE;
            break;
        }
        break;
    }
    return FALSE;
}

This is a basic way of creating a dialog. More sophisticated method would normally involve OOP, usually wrapping each resource( button, window, etc) as a C++ object or using MFC.

like image 74
JosephH Avatar answered Nov 07 '22 13:11

JosephH


If you have placed your button or any control on some dialog, that control is already in created state. For handling the messages of these child controls on this dialog , you have to override OnCommand Method in the class which is implementing your dialog.

For Example:

//CDialog_ControlDlg is my Dialog class derived from CDialog

//IDC_BUTTON_SAMPLE is the ID of the button which was palced on the dialog in the resource Editor..

BOOL CDialog_ControlDlg::OnCommand(WPARAM wParam,LPARAM lparam){
      int iNotiFicationMsg=HIWORD(wParam);//This is thenotification Msg from the child control
      int iCommandId=LOWORD(wParam);//And Control ID of the Child control which caused that Msg
      BOOL result=FALSE;
      switch(iCommandId){
    case IDC_BUTTON_SAMPLE:
        if(iNotiFicationMsg==BN_CLICKED)
        {
         //Your Code for handling this type of Msg for this control..

        }
        break;
    default:
    {
        //Specific Code;

    }

    return result;
}

}
like image 38
Manish Avatar answered Nov 07 '22 14:11

Manish