之前,当我尝试创建一个窗口包装类时,我了解到不能将对话过程传递给类中的CreateDialogParam()
,因为它是类成员,会更改签名,因此与DLGPROC
的签名不匹配。我使用了一种变通方法,所有对话框都使用一个全局过程,该全局过程使用映射从传递给全局过程的窗口句柄中查找类成员过程。它将在映射中找到正确的类指针,并将参数传递给其过程并返回结果。
现在我使用相同的方法,但,在这个项目中,所有东西都将在一个命名空间中。这个有效吗?
namespace MyNamespace
{
INT_PTR MyProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
return 0;
}
class MyDlg
{
public:
HWND hwnd;
MyDlg(void) {
hwnd = CreateDialogParam(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_MYDLG),
HWND_DESKTOP,
(DLGPROC)MyProc, // Maybe 'MyNamespace::MyProc'?
NULL
);
}
};
}
我不确定名称空间是否会像类一样更改函数类型签名
是的,它确实改变了处理函数的方式,但在这种情况下,您不需要限定,因为您已经在MyNamespace
中了。因此:
有效:
namespace MyNamespace
{
INT_PTR MyProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
class MyDlg
{
//....
MyDlg(void) {
hwnd = CreateDialogParam(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_MYDLG),
HWND_DESKTOP,
(DLGPROC)MyProc,
NULL
);
}
};
}
无效:
namespace MyNamespace
{
INT_PTR MyProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
}
class MyDlg
{
//....
MyDlg(void) {
hwnd = CreateDialogParam(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_MYDLG),
HWND_DESKTOP,
(DLGPROC)MyProc, // need to use 'MyNamespace::MyProc'?
NULL
);
}
};