gpt4 book ai didi

c++ - 如何使用对话框参数?

转载 作者:可可西里 更新时间:2023-11-01 10:59:13 27 4
gpt4 key购买 nike

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

最佳答案

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

因此,本着为问题提供 c++/OOP 答案的精神,在不使用框架的情况下,首先要做的是创建一个类来包装对话框,并为对话框过程提供一种方法可靠地检索指向类的指针。 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 返回,对话框及其所有子控件都已销毁,因此您通常会提取 OnCommand 处理程序中的所有输入字段并将它们存储在类成员中,然后再调用 EndDialog .

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com