アプリ版:「スタンプのみでお礼する」機能のリリースについて

 Win32APIをC++で作成しようとしているのですが、途中どのようにしたらいいのか分からないのでここで質問させていただきました。
 Win32をC++で作成するためクラス内にウィンドウの登録、設定の関数を用意したのはいいのですが、CALLBACK関数を含めて実行しようとするとウィンドウの登録の際に、エラーが起きるようです。
/*//////////////////////////////////////////
ウィンドウ・クラスの登録
//////////////////////////////////////////*/
ATOM windCreate::InitApp(void)
{
        (省略)
     wc.lpfnWndProc = WndProc; //ここでエラー
        (省略)
     return RegisterClassEx(&wc);
}
エラー内容は下記の通りです。
error C2440: '=' : 'LRESULT (__stdcall windCreate::* )(HWND,UINT,WPARAM,LPARAM)' から 'WNDPROC' に変換できません。

 クラスの宣言は以下の通りです。
class windCreate{
    // WinMain インスタンスハンドルへのアクセス
     public:
        HINSTANCE hInst;
     private:
        WNDCLASSEX wc;
        LPSTR szClassName;
        HWND hWnd;
        RECT w_rect;
        SIZE window_size;
     public:
        ATOM InitApp(void);
        BOOL InitInstance(int nCmdLine);
      //ここがシステムから呼び出されるコールバック関数                              LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
         ---------(以下省略)---------
};
 ウィンドウからのメッセージ受取を行う関数なんですが、どうしたら
エラーなく実行できるのでしょうか?

A 回答 (2件)

static がついているかどうかでどのようにアクセスが変わるかを考えればわかると思いますが....


static なメンバ関数と static でないメンバ関数とでは呼び出し方が異なります. つまり, static なメンバ関数は呼び出すときにそのクラスのオブジェクトを必要としませんが, static でないメンバ関数を呼び出すためにはそのクラスのオブジェクトを必要とします.
ところが, Windows のコールバック関数では「どのオブジェクトに対して呼び出すのか」を指定することができないため, コールバック関数として static でないメンバ関数を与えることができません. これに対し static なメンバ関数ではオブジェクトを必要としないので, コールバック関数として使うことができます.
    • good
    • 0
この回答へのお礼

 成程、そういうことでしたか。static 静的にすればオブジェクトどうし、値が共有されるというのは分かっていたんですが。staticにして宣言すればオブジェクトあるなしに呼び出せるんですね。
 教えていただいてどうも有難うございました。

お礼日時:2008/12/12 20:37

 こんにちは。



class windCreate{
     //↓publicでstaticなメンバ関数にしないといけません。
     static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
};

この回答への補足

static を付けて、ビルドを試みると巧く行きました。
 腑に落ちないので補足として質問するのですが、どうしてstaticを付けると巧く行くのでしょう?

補足日時:2008/12/12 16:57
    • good
    • 0
この回答へのお礼

 お陰でERRORが取り除かれました。
これでclass内でコールバック関数を扱うことができます。
ありがとうございました。

お礼日時:2008/12/12 17:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!