我有一个预制的模板资源对话框,我想使用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/