如何使用DialogBoxParam?

Neo*_*Neo 1 c++ windows winapi dialog embedded-resource

我有一个预先制作的模板资源对话框,我想DialogBoxParam用来显示它,但我找不到任何关于互联网的好例子.该对话框是一个简单的登录对话框,所以有人可以解释如何构建我的内容lpDialogFunc以及放入什么内容dwInitParam吗?

Chr*_*cke 6

您已将此问题标记为C++,但未指定任何特定框架(例如ATL或MFC).

因此,本着为问题提供c ++/OOP答案的精神,不使用框架,首先要做的是创建一个包装对话框的类,并为对话框proc提供可靠的检索方式指向类的指针.Windows API是一个C API,不能直接调用类成员,因此有必要创建静态方法,然后可以this从某个地方检索类指针.

class MyDialog {
  HWND _dlg;
public:
  int RunModal(HINSTANCE resModule, UINT resId,HWND parent){
    return DialogBoxParam(resModule,MAKEINTRESOURCE(resId),parent,&StaticDialogProc,(LPARAM)this);
  }
protected:
  static INT_PTR CALLBACK StaticDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){
    MyDialog* self;
    if(uMsg == WM_INITDIALOG){
      self = (MyDialog*)lParam;
      self->_dlg = hwndDlg;
      SetWindowLongPtr(hwndDlg,DWLP_USER,lParam);
    }
    else
      self = (MyDialog*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA);

    if(self)
      return self->DialogProc(uMsg,wParam,lParam);

    return FALSE;
  }

  virtual UINT_PTR DialogProc(UINT uMsg,WPARAM wParam,LPARAM lParam){
    switch(uMsg){
    case WM_INITDIALOG:
      OnInitDialog();
      break;
    case WM_COMMAND:
      OnCommand(LOWORD(wParam),HIWORD(wParam),(HWND)lParam);
      break;
    default:
      return FALSE;
    }
    return TRUE;
  }

  virtual void OnInitDialog(){
  }
  virtual void OnCommand(int id, USHORT notifyCode,HWND control){
    EndDialog(_hdlg,id);
  }
};
Run Code Online (Sandbox Code Playgroud)

现在,Windows可以向对话框发送数百个窗口消息.将每条消息的处理程序添加到DialogProc并调用特定的虚函数,以便派生类可以通过覆盖虚拟来以不同方式处理消息.

要处理的关键消息通常WM_INITDIALOG在创建对话框后立即发送,因此是初始化对话框上任何控件的理想时间 - 填充下拉控件或SetWindowText使用默认值启动文本框.和WM_COMMAND,这是由如按钮,被点击时,他们控制发送,传递他们的ID,这是您将处理确定和取消按钮.

一旦DialogBoxParam返回时,对话框及其所有子控件已被破坏,所以你通常会提取所有的输入字段按需处理程序,并调用之前类会员将其存储EndDialog.

  • 对于对话框,您确实应该使用“DWLP_USER”来存储类指针,而不是“GWLP_USERDATA”(因为从技术上讲,窗口类归外壳程序所有,而不是您的应用程序)。 (2认同)