窗口/对话框程序可以在命名空间中吗?

时间:2012-10-05 14:04:25

标签: c++ winapi namespaces function-pointers signature

在我尝试创建窗口包装器类之前,我了解到您无法将对话框过程传递给类中的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
            );
        }
    };
}

我不确定命名空间是否像类那样改变了函数类型签名。

1 个答案:

答案 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
        );
    }
};