0

以前、ウィンドウ ラッパー クラスを作成しようとしたときに、ダイアログ プロシージャをCreateDialogParam()クラスに渡すことができないことを知りました。これは、クラス メンバーであると署名が変更され、 の署名と一致しないためですDLGPROC。グローバル プロシージャに渡されたウィンドウ ハンドルからクラス メンバー プロシージャを見つけるために、マップを使用する 1 つのグローバル プロシージャをすべてのダイアログで使用する回避策を使用しました。マップ内で正しいクラス ポインターを見つけ、引数をそのプロシージャーに渡し、結果を返します。

今、私はこれと同じ方法を使用しています、このプロジェクトではすべてが名前空間になります。これは有効ですか?

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 に答える