• ベストアンサー

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

コールバック関数のメンバ関数化について質問です。 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

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

Windows Template Library (WTL) では、thunkという超無理やりな仕組み(実行コードを動的に生成する)で、ご質問の内容を実現してます。 http://hp.vector.co.jp/authors/VA022575/c/msgmap.html まあ、普通は、そのページに書いてある >SetWindowLongPtr()でGWLP_USERDATAにthisをセットしておく みたいな手段で、thisポインタとHWNDを関連付けておいて、 #1さんのように、いったん、staticメンバにコールバックしてから、メンバ関数を呼び出す、いうのがまともな解決策でしょう。

noname#154655
質問者

お礼

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

その他の回答 (1)

回答No.1

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

noname#154655
質問者

お礼

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

関連するQ&A