如何在Win32中使用对话框资源?

7
没有资源,我可以使用复杂的CreateWindow()CreateWindowEx()数组以及WndProc()处理事件来创建我的UI。
我注意到,如果我在资源视图中右键单击并点击“添加资源”,我可以绘制一个带有所有控件的对话框。如果我可以像在C#中一样绘制界面,这将节省大量时间。
在我用资源编辑器绘制完界面之后,如何从代码中创建窗口呢?能否提供一个非常简单的包含按钮的示例,并展示如何处理该按钮上的WM_COMMAND事件?
此外,这通常是人们创建GUI的方式吗?采用这种方式是否存在灵活性问题?即使在C#中,我也经常需要用自己编写的代码生成UI来补充设计师生成的UI,但大部分时间我很愿意使用设计师。
2个回答

5
在资源编辑器中创建对话框后,调用CreateDialog(非模态对话框;您需要像使用CreateWindow时一样手动分派消息)或DialogBox(模态对话框;该函数直到关闭对话框才返回。它会为您分派消息),使对话框显示出来。就像您将窗口过程传递给RegisterClass一样,您将对话框过程传递给这些对话框回调函数。DialogProc的示例如下:
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;
}

这是创建对话框的基本方法。更复杂的方法通常涉及OOP,通常将每个资源(按钮、窗口等)封装为C++对象或使用MFC。


1
如果您已经将按钮或任何控件放置在某个对话框上,则该控件已经处于已创建状态。为了处理此对话框上这些子控件的消息,您必须在实现您的对话框的类中覆盖 OnCommand 方法。
例如:
//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;
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接