2011-09-06 58 views
7

私はこのWin32プログラムをWinApiで作成しようとしていますが、次のチュートリアルでは問題があるようです。C2440 C++ WinApiでLRESULTをWNDPROCに変換できません

MainWindow.h:

class MainWindow 
{ 
    public: 
    MainWindow(HINSTANCE); 
    ~MainWindow(void); 

    LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM); 

    // [...] 

MainWindow.cpp:

MainWindow::MainWindow(HINSTANCE hInstance) : hwnd(0) 
{ 
    WNDCLASSEX WndClsEx; 
    // [...] 
    WndClsEx.lpfnWndProc = &MainWindow::WndProcedure; 
    // [...] 
} 

LRESULT CALLBACK MainWindow::WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    // [...] 
} 
チュートリアルが言うとおりに私が署名を以下てるので、私はしかし、メインウィンドウ:: WndProcedureが間違って参照する必要があります

コンストラクタ内のlpfnWndProc行は、コンパイル時エラーを返します。

エラーC2440: '=': 'LRESULT(__stdcall MainWindow :: * )(HWND、UINT、WPARAM、LPARAM) 'から' WNDPROC '

+0

エラーが発生しているラインは何ですか?私はそれがあなたが投稿したものだとは思わない。 – Mat

+4

クラスメソッドに渡されるウィンドウメッセージを取得する慣用方法については、Raymond Chens [scratch program](http://blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx)を参照してください(Toメソッドの署名に 'static'が追加された後の次の論理的な質問に答えてください)。 – user786653

答えて

12

static LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM); 

によってこのポインタを

LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM); 

を置き換えるあなたの関数呼び出しで、それはこのポインタを静的宣言することで、隠しパラメータがもはやパラメータと2の署名ではありません関数が一致します。

3

非スタティックメンバー関数をウィンドウプロシージャとして使用することはできません。 WndProcedurestaticと宣言すると、コンパイルする必要があります。非メンバ関数も同様に機能します。

非スタティックメンバー関数は、スタティックメンバーとは異なる署名を持っています。これは、明示的に定義されたパラメータに加えて暗黙のthisパラメータを受け取るためです。

3

あなたのWndProcedure関数はグローバル関数かスタティックメンバ関数でなければならないからです。

関連する問題