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

Posted

技术标签:

【中文标题】如何在 Win32 中使用对话框资源?【英文标题】:How do I use Dialog resources in Win32? 【发布时间】:2011-11-18 03:08:19 【问题描述】:

在没有资源的情况下,我可以创建包含 CreateWindow()CreateWindowEx()WndProc() 的复杂数组的 UI 来处理我的事件。

我注意到如果我在资源视图中右键单击并单击“添加资源”,我可以绘制一个包含所有控件的对话框。如果我可以像通常使用 C# 那样绘制界面,这将为我节省大量时间。

使用资源编辑器绘制界面后,如何从代码中创建窗口?有人可以提供一个非常简单的按钮示例,并说明如何处理该按钮上的 WM_COMMAND 事件吗?

另外,这通常是人们创建 GUI 的方式吗?这样做是否有任何灵活性损失?即使在 C# 中,我也经常需要用我自己的代码生成的 UI 来补充设计器生成的 UI,但大多数时候我很乐意使用设计器。

【问题讨论】:

【参考方案1】:

在资源编辑器中创建对话框后,调用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。

【讨论】:

【参考方案2】:

如果您已将按钮或任何控件放在某个对话框上,则该控件已处于创建状态。要在此对话框上处理这些子控件的消息,您必须在实现对话框的类中重写 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;



【讨论】:

以上是关于如何在 Win32 中使用对话框资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Win32 API 的对话框中显示自定义消息?

win32day09-对话框/子控件/静态块/按钮/文本编辑框

win32day08-位图的使用/坐标系和映射模式/文字和字体/对话框

为自定义 Win32 模式对话框模仿 ::DialogBox()

win32 选项卡问题 在线等

如何更改 win32 窗口上的文本?