2017-08-24 6 views
0

D3DAppクラスに含まれるメソッド内にWNDCLASSEXを作成する過程にあります。これは、別のクラスから派生させようとしています。エンジン、ゲーム、等...(また、基本クラスで保護されています)InitMainWindowと呼ばれる:D3DAppクラスの問題

bool D3DApp::InitMainWindow() { 

    WNDCLASSEX wc; 

    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WindowProc; // This is where the error is! 
    wc.hInstance = mAppInst; 
    wc.hCursor = LoadCursor(mAppInst, IDC_ARROW); 
    wc.lpszClassName = L"MainWindow"; 

    RegisterClassEx(&wc); 
    RECT rect = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT }; 
    AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); 
    mMainWnd = CreateWindowEx(NULL, L"MainWindow", L"Test", WS_OVERLAPPEDWINDOW, 300, 300, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, mAppInst, NULL); 
    ShowWindow(mMainWnd, NULL); 

    return true; 
} 

マイWNDPROCコールバックの宣言と定義がInitMainWindow()は、位置として定義されているのと同じD3DApp基本クラス内にありますこうした:

virtual LRESULT WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

私はWNDCLASSEX構造体の中のlpfnWndProc変数を記入しています私は

次 '=' を記述C2440のエラーが表示されます(__cdecl D「LRESULTから変換することはできません3DApp :: *)(HWND、UINT、WPARAM、LPARAM)WNDPROC '

」から' 私はD3DAppからクラスの導出に私のWNDPROCコールバックの定義を作成する必要がありますか?または、このコールバックを基本クラスと派生クラスから完全に削除して、WinMain関数の範囲外に配置する必要がありますか?私はこのエラーを修正する方法について約2日間研究しており、可能な修正を見つけるのに運がなかった...私のC++スキルは、私が思うほど優れていないかもしれないと思う。しかし、誰かが私の問題が驚くべきところを理解するのを助けることができれば!

PSとはい、私はいくつかのエラーが何をチェックしている知っているが、私はちょうどそれが最初に私のコンパイラのために働くことを確認したい:)

+0

このウィンドウプロシージャを静的として宣言し、そこから仮想キーワードを削除するか、宣言してクラス外に定義してください。メンバー以外の機能 – Asesh

+0

私が受け取っていたエラーを修正したので、助けてくれてありがとう。 MSDN形式のドキュメントは、私が理解するのが非常に混乱しています。あなたのような人々が、このような問題を手助けしてくれることを喜んで感謝しています。 @Asesh – Sharpie

+0

下記の答えに詳しい情報を追加しました – Asesh

答えて

0

はここでWNDPROCの署名です:

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); 

が、あなたの宣言は異なります。

LRESULT WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

あなたはこのようなクラスの外でそれを宣言する必要があり、次のいずれか

LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 

または静的として宣言し、仮想キーワードを削除してください。プロジェクトが使用するようにコンフィグレーションされているので、__stdcall呼び出し規約に解決するCALLBACKを追加する必要があります。