在我尝试创建窗口包装器类之前,我了解到您无法将对话框过程传递给类中的CreateDialogParam()
,因为它是类成员会更改签名,因此不匹配DLGPROC
的那个。我使用了一种解决方法,其中所有对话框都使用一个全局过程,该过程使用映射从传递给全局过程的窗口句柄中查找类成员过程。它会在map中找到正确的类指针,并将参数传递给它的过程并返回结果。
现在我使用的是同样的方法但是,在这个项目中,一切都将在命名空间中。这有效吗?
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
);
}
};
}
我不确定命名空间是否像类那样改变了函数类型签名。
答案 0 :(得分:2)
是的,它确实会改变您解决该功能的方式,但在这种情况下,您不需要符合条件,因为您已经在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
);
}
};