プロが教えるわが家の防犯対策術!

コールバック関数のメンバ関数化について質問です。

WindowsAPIでウィンドウプロシージャ(コールバック関数)をクラスのメンバ関数に
しようと思っているのですが、出来るのでしょうか?

たとえば、
http://wisdom.sakura.ne.jp/system/winapi/win32/w …
このサイトにある
LRESULT CALLBACK WndProc(HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam);
をクラスのメンバ関数にしたいです。

開発環境
XP
C,C++
Visual Studio 2005

A 回答 (2件)

Windows Template Library (WTL) では、thunkという超無理やりな仕組み(実行コードを動的に生成する)で、ご質問の内容を実現してます。


http://hp.vector.co.jp/authors/VA022575/c/msgmap …

まあ、普通は、そのページに書いてある
>SetWindowLongPtr()でGWLP_USERDATAにthisをセットしておく
みたいな手段で、thisポインタとHWNDを関連付けておいて、
#1さんのように、いったん、staticメンバにコールバックしてから、メンバ関数を呼び出す、いうのがまともな解決策でしょう。
    • good
    • 0
この回答へのお礼

出来ました。

staticを使用するのは分かっていたのですが、
どう取り出す(渡す)のか悩んでいたので助かりました。
グローバル変数にはしたくなかったので出来る方法があって良かったです。

ありがとうございました。

お礼日時:2009/08/08 23:25

 こんばんは。


 クラスでウィンドウを開くということでしょうか。
 でしたら、staticメンバ関数にして、其の中からメンバ関数の方へ迂回するのが一番良いでしょう。
 どちらにしろ、staticメンバ関数内ではthisポインタに触れないので、何らかの手段でthisポインタを取り出し、外部からアクセスする形になります。
    • good
    • 0
この回答へのお礼

出来ました。

staticを使用することは分かっていたのですが、
どう取り出す(渡す)のか悩んでいました。
SetWindowLongPtr()を使用すればいいと「rabbit_cat」様に
教えて頂いて出来ました。

回答ありがとうございました。

お礼日時:2009/08/08 23:31

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