Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用DialogBoxParam?_C++_Windows_Winapi_Dialog_Embedded Resource - Fatal编程技术网

C++ 如何使用DialogBoxParam?

C++ 如何使用DialogBoxParam?,c++,windows,winapi,dialog,embedded-resource,C++,Windows,Winapi,Dialog,Embedded Resource,我有一个预先制作的模板资源对话框,我想使用DialogBoxParam来显示它,但是我在互联网上找不到任何好的例子。该对话框是一个简单的登录对话框,因此有人可以解释如何构建我的lpDialogFunc以及在dwInitParam中放置什么吗?您可以这样做。dwInitParam指定要传递给WM_INITDIALOG消息的lParam参数中的对话框的值。您可以传递任何值,也可以只传递NULL INT_PTR CALLBACK editDlg(HWND hwnd,UINT msg,WPARAM wP

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

您可以这样做。dwInitParam指定要传递给WM_INITDIALOG消息的lParam参数中的对话框的值。您可以传递任何值,也可以只传递NULL

INT_PTR CALLBACK editDlg(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {

        switch (msg) {
            case WM_INITDIALOG:                  
                return 1;
            break;
        }
        return 0;
    }

if(DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_EDIT),hwndMain,editDlg,NULL)==IDOK) 
{
}

你可以这样做。dwInitParam指定要传递给WM_INITDIALOG消息的lParam参数中的对话框的值。您可以传递任何值,也可以只传递NULL

INT_PTR CALLBACK editDlg(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {

        switch (msg) {
            case WM_INITDIALOG:                  
                return 1;
            break;
        }
        return 0;
    }

if(DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_EDIT),hwndMain,editDlg,NULL)==IDOK) 
{
}

您将此问题标记为C++,但没有指定任何特定的框架,如ATL或MFC。

这样,在提供C++的问题的同时,不使用框架,首先要创建一个类来包装对话框,同时为对话PROC提供一个可靠的检索类指针的方法。windows API是一个C API,不能直接调用类成员,因此有必要创建静态方法,然后从某处检索该指针指向的类

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,它在对话框创建后立即发送,因此这是初始化对话框上任何控件的理想时间-填充下拉控件,或使用默认值设置WindowText初始化文本框。 还有WM_命令,它是由按钮等控件发送的,当它们被点击时,传递它们的id,这是处理OK和CANCEL按钮的地方


> DealBoxPARAM返回后,对话框及其所有子控件都被销毁,因此通常在调用OnCudio处理程序之前将所有输入字段提取并存储在类成员中。调用/EP> < P>您将此问题标记为C++,但没有指定任何特定的框架,如ATL或MFC。

这样,在提供C++的问题的同时,不使用框架,首先要创建一个类来包装对话框,同时为对话PROC提供一个可靠的检索类指针的方法。windows API是一个C API,不能直接调用类成员,因此有必要创建静态方法,然后从某处检索该指针指向的类

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,它在对话框创建后立即发送,因此这是初始化对话框上任何控件的理想时间-填充下拉控件,或使用默认值设置WindowText初始化文本框。 还有WM_命令,它是由按钮等控件发送的,当它们被点击时,传递它们的id,这是处理OK和CANCEL按钮的地方


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

问题第二部分的另一个用例:在dwInitParam中放置什么

如果您更喜欢OO编程,并且不想使用对话框的全局范围,可以将其传递给形式参数dwInitParam

获取指向调用方的指针:

将消息委派给调用方:


另一种方法是将调用者置于全局范围内,并将所有对话框限制为一个调用者。

问题第二部分的另一个用例:在dwInitParam中放置什么

如果您更喜欢OO编程,并且不想使用对话框的全局范围,可以将其传递给形式参数dwInitParam

获取指向调用方的指针:

将消息委派给调用方:


另一种方法是将调用者置于全局范围内,并对所有对话框限制为单个调用者。

我的模板有按钮和输入框,我如何处理输入?您可以在WM_INITDIALOG handler中初始化输入框。我的模板有按钮和输入框,如何处理输入?您可以在WM_INITDIALOG handler中初始化输入框。我没有使用MFC/ATL,只是简单的WinAPI,这是一个非常有用的示例,但我想在控件上设置图像。我使用的是这里,但不起作用控件是按钮:hwLogo=GetDlgItemhwnd,1241;hBitmap=HBITMAPLoadImagehDll,MAKEINTRESOURCE1011,图像\u位
P、 0,0,0;sendmageshwlogo、BM_SETIMAGE、WPARAMIMAGE_位图、LPARAMhBitmap;这值得提出自己的问题。在资源文件中,按钮上是否设置了BS_图标或BS_图像样式?对于对话框,您应该真正使用DWLP_用户来存储类指针,而不是GWLP_用户数据,因为从技术上讲,窗口类归shell所有,而不是您的应用程序。我不是使用MFC/ATL,只是简单的WinAPI,非常有用的示例,但是我想在控件上设置图像,这是我使用的但不起作用的控件是按钮:hwLogo=GetDlgItemhwnd,1241;hBitmap=HBITMAPLoadImagehDll,MAKEINTRESOURCE1011,图像\位图,0,0,0;sendmageshwlogo、BM_SETIMAGE、WPARAMIMAGE_位图、LPARAMhBitmap;这值得提出自己的问题。在资源文件中,按钮上是否设置了BS_图标或BS_图像样式?对于对话框,您应该真正使用DWLP_USER来存储类指针,而不是GWLP_USERDATA,因为从技术上讲,窗口类属于shell,而不是您的应用程序。