我有一个预制的模板资源对话框,我想使用DialogBoxParam来显示它,但是我在互联网上找不到任何好的示例。该对话框是一个简单的登录对话框,因此有人可以解释如何构建我的lpDialogFunc以及要放入dwInitParam的内容吗?

最佳答案

您已将此问题标记为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);
  }
};

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

关键消息通常是WM_INITDIALOG,它是在创建对话框后立即发送的,因此是初始化对话框上的任何控件的理想时间-填充下拉控件,或者是SetWindowText来初始化具有默认值的文本框。
和WM_COMMAND(由按钮之类的控件发送),在单击它们时传递其ID,在这里您可以处理OK和CANCEL按钮。

一旦DialogBoxParam返回,该对话框及其所有子控件都将被销毁,因此通常在调用EndDialog之前,应提取OnCommand处理程序中的所有输入字段并将它们存储在类成员中。

关于c++ - 如何使用DialogBoxParam?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11843216/

10-10 03:44