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

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

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

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

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

【问题讨论】:

    标签: c++ windows winapi resources


    【解决方案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;
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        相关资源
        最近更新 更多