こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

コールバック関数のメンバ関数化

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

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

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

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

投稿日時 - 2009-08-08 20:10:34

QNo.5192062

困ってます

質問者が選んだベストアンサー

Windows Template Library (WTL) では、thunkという超無理やりな仕組み(実行コードを動的に生成する)で、ご質問の内容を実現してます。
http://hp.vector.co.jp/authors/VA022575/c/msgmap.html

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

投稿日時 - 2009-08-08 22:44:06

お礼

出来ました。

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

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

投稿日時 - 2009-08-08 23:25:07

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2009-08-08 22:06:58

お礼

出来ました。

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

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

投稿日時 - 2009-08-08 23:31:39