私のプロジェクト設定には、このように見えるウィンドウのコンストラクタがあります。私のプロジェクトには多くのウィンドウがあり、常に追加または削除しています。
LRESULT CPicture::Msg(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_CREATE, OnCreate);
HANDLE_MSG(hWnd, WM_PAINT, OnPaint);
HANDLE_MSG(hWnd, WM_SIZE, OnSize);
HANDLE_MSG(hWnd, WM_CLOSE, OnDestroy);
default:
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
}
すべての有効なイベントの例を次に示します。
// Csx / Dsx
virtual BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) {return FALSE;};
virtual void OnDestroy(HWND hWnd){};
// Painting
virtual void OnPaint(HWND hWnd){};
virtual BOOL OnEraseBkgnd(HWND hWnd, HDC hDC) {return FALSE;};
// Movement / Sizing
virtual void OnMove(HWND hWnd, int x, int y) {};
virtual void OnSize(HWND hWnd, UINT state, int nWidth, int nHeight){};
virtual void OnGetMinMaxInfo(HWND hWnd, LPMINMAXINFO lpMinMaxInfo){};
// Focus
virtual void OnSetFocus(HWND hWnd, HWND hWndOldFocus){};
virtual void OnKillFocus(HWND hWnd, HWND hWndNewFocus){};
...そしてもっとたくさん。プリプロセッサ マクロを使用して、これらの関数のいずれかが子クラスでオーバーライドされたことを検出し、そのハンドラをメッセージ ループに自動的に追加することはできますか?
定義されていなくてもすべてのメッセージを処理するのは本当に悪い考えだと誰かに言われたMsg()
ので、イベント定義を常に追加/削除することにユーザーが重くならず、簡単な代替手段を探しています。