友人、Windows API のラッパーを実装しようとしていて、親ウィンドウから子ウィンドウ イベントをキャプチャしたいので、簡単なイベント ハンドラーを作成しました。関数ポインターを使用して、コールバック関数を格納しました。私は静的関数でそれをしました。以下のコードを参照してください。
class Widget;
typedef void (*EventProc)(MSG* EventArgs);
class Widget
{
public:
/// Constructors destructor and methods for Registering and Creating Windows
static LRESULT CALLBACK MainProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
MSG struct_msg;
struct_msg.hWnd=hWnd;
struct_msg.message=msg;
struct_msg.wParam=wParam;
struct_msg.lParam=lParam;
Widget* wid=(Widget*)GetWidgetPointerFromHWND(hWnd);
switch(msg)
{
case WM_CREATE:
if(Created!=NULL)
(*(wid->Created))(&struct_msg);break;
case WM_DESTROY:
if(Destroyed!=NULL)
(*(wid->Destroyed))(&struct_msg);break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0;
}
EventProc Created;
EventProc Destroyed;
};
class CustomControl: public Widget
{
/// Constructor destructor and other methods
};
class Window: public Widget
{
public:
static void ChildCreated(Widget* Sender,Widget* Self,MSG* EventArgs)
{
MessageBox(0,0,0,0);
}
Window()
{
control1=new CustomControl(100,100,200,200); //left,top,width,height
this->AddChild(control1);
control1->Created = ChildCreated;
}
private:
CustomControl control1;
};
これは機能しますが、静的関数にはこのポインターがないため、クラス Windowの変数とメンバー関数にアクセスできませんでした。コールバック関数(Event Handler)としてメンバ関数を作りたいです。私が解決しようとしていることを理解していただければ幸いです。私を助けてください。