0

これは、この質問の続きです。

私には次の割り当てがあります。

WNDCLASSEX wndClass =
{
    sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0, 0,
    GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
    "D3D Tutorial", NULL
};
wc = wndClass;

これにより、次のエラーが発生します。

1> e:\ rat_engine \ rat_engine \ rat_engine \ rat_rendererdx9.cpp(19):エラーC2440:「初期化中」:「オーバーロードされた関数」から「WNDPROC」に変換できません

1>スコープ内のこの名前の関数はどれもターゲットタイプと一致しません

MsgProcに下線が引かれているので、次の関数を参照する必要があります。

LRESULT WINAPI RAT_RendererDX9::MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            CleanUp();
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

チュートリアルでは、このように機能し、ほぼ正確にコピーしました。では、エラーはどこから発生し、どうすれば修正できますか?

編集:

MsgProcの宣言は次のとおりです。

private:
    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
4

2 に答える 2

3

あなたの宣言から、MsgProcそれは通常のメンバー関数であるように見えます。つまり、「隠された」thisポインターを取ります。それはそれをWNDPROCと互換性がなくし、それがコンパイラが文句を言う理由です。

としてマークを付けてみstaticます。もちろん、これは、クラスの非静的メンバーに簡単にアクセスできないことを意味します。これをthis行うには、インスタンスのポインターのコピーをどこかに隠しておく必要があります。

CALLBACK代わりに必要な場合もありますがWINAPI、現時点では、これを確認するためのコンパイラに簡単にアクセスすることはできません。

于 2013-02-06T23:17:44.550 に答える
0

私には、クラスのインスタンス/オブジェクトをHWNDにバインドするのが最もエレガントに思えます。SetWindowLongPtrインスタンスへのポインタを設定および取得するには、 /を使用できますGetWindowLongPtr

したがって、ウィンドウを作成した後、

SetWindowLongPtr(hWnd, GWLP_USERDATA, static_cast<LONG_PTR>(this));

そしてあなたの中WindowProcedureで、あなたは電話します

YourClass* instance = static_cast<YourClass*> (GetWindowLongPtr(hWnd, GWLP_USERDATA));

注意してくださいWindowProcedure:ウィンドウを作成するときにすでに呼び出されていますが、明らかに、SetWindowLongPtr後でしか呼び出すことができません。したがって、WindowProcedure最初に呼び出されたときGetWindowLongPtrに失敗します。このような場合でも関数が機能することを確認してください。

于 2016-09-23T16:57:41.937 に答える