0

在我尝试创建一个窗口包装类之前,我了解到你不能将一个对话框过程传递给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
            );
        }
    };
}

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

4

1 回答 1

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
        );
    }
};
于 2012-10-05T14:07:32.907 回答