C++ 如何使用DialogBoxParam?
我有一个预先制作的模板资源对话框,我想使用DialogBoxParam来显示它,但是我在互联网上找不到任何好的例子。该对话框是一个简单的登录对话框,因此有人可以解释如何构建我的lpDialogFunc以及在dwInitParam中放置什么吗?您可以这样做。dwInitParam指定要传递给WM_INITDIALOG消息的lParam参数中的对话框的值。您可以传递任何值,也可以只传递NULLC++ 如何使用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
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,而不是您的应用程序。