Window基底クラスの作成
毎回ウィンドウプロシージャ書くのってめんどくさいとお思いの諸兄に。
お決まりのおパタンを基底クラスとして自分で作っちゃいましょう。
自分で作ればMFCみたいにブラックボックスじゃないから多い日も安心。
まずはヘッダを見てチョンマゲ。
window.h
#ifndef WINDOW_H #define WINDOW_H #include <windows.h> class Window { public : static LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); static BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam ); static VOID SetObject( HWND hWnd, Window * object ); static Window * GetObject( HWND hWnd ); HWND hwnd; UINT umsg; WPARAM wparam; LPARAM lparam; LRESULT lresult; HWND hchild; virtual VOID MessageProc(); virtual VOID ChildProc() {} virtual VOID OnCreate() {} virtual VOID OnDestroy() {} virtual VOID OnMove() {} virtual VOID OnSize() {} virtual VOID OnActivate() {} virtual VOID OnSetFocus() {} virtual VOID OnKillFocus() {} virtual VOID OnEnable() {} virtual VOID OnSetRedraw() {} virtual VOID OnSetText() {} virtual VOID OnGetText() {} virtual VOID OnGetTextLength() {} virtual VOID OnPaint() {} virtual VOID OnClose() {} virtual VOID OnQueryEndSession() {} virtual VOID OnQueryOpen() {} virtual VOID OnEndSession() {} virtual VOID OnQuit() {} virtual VOID OnEraseBkGnd() {} virtual VOID OnSysColorChange() {} virtual VOID OnShowWindow() {} virtual VOID OnWinIniChange() {} virtual VOID OnDevModEchange() {} virtual VOID OnActivateApp() {} virtual VOID OnFontChange() {} virtual VOID OnTimeChange() {} virtual VOID OnCancelMode() {} virtual VOID OnSetCursor() {} virtual VOID OnMouseActivate() {} virtual VOID OnChildActivate() {} virtual VOID OnQueueSync() {} virtual VOID OnGetMinMaxInfo() {} virtual VOID OnPaintIcon() {} virtual VOID OnIconEraseBkGnd() {} virtual VOID OnNextDlgCtl() {} virtual VOID OnSpoolerStatus() {} virtual VOID OnDrawItem() {} virtual VOID OnMeasureItem() {} virtual VOID OnDeleteItem() {} virtual VOID OnVkeyToItem() {} virtual VOID OnCharToItem() {} virtual VOID OnSetFont() {} virtual VOID OnGetFont() {} virtual VOID OnSetHotKey() {} virtual VOID OnGetHotKey() {} virtual VOID OnQueryDragIcon() {} virtual VOID OnCompareItem() {} virtual VOID OnGetObject() {} virtual VOID OnCompacting() {} virtual VOID OnCommNotify() {} virtual VOID OnWindowPosChanging() {} virtual VOID OnWindowPosChanged() {} virtual VOID OnPower() {} virtual VOID OnCopyData() {} virtual VOID OnCancelJournal() {} virtual VOID OnNotify() {} virtual VOID OnInputLangChangeRequest() {} virtual VOID OnInputlangChange() {} virtual VOID OnTcard() {} virtual VOID OnHelp() {} virtual VOID OnUserChanged() {} virtual VOID OnNotifyFormat() {} virtual VOID OnContextMenu() {} virtual VOID OnStyleChanging() {} virtual VOID OnStyleChanged() {} virtual VOID OnDisplayChange() {} virtual VOID OnGetIcon() {} virtual VOID OnSetIcon() {} virtual VOID OnNcCreate() {} virtual VOID OnNcDestroy() {} virtual VOID OnNcCalcSize() {} virtual VOID OnNcHitTest() {} virtual VOID OnNcPaint() {} virtual VOID OnNcActivate() {} virtual VOID OnGetDlgCode() {} virtual VOID OnSyncPaint() {} virtual VOID OnNcMouseMove() {} virtual VOID OnNcLbuttonDown() {} virtual VOID OnNcLbuttonUp() {} virtual VOID OnNcLbuttonDblClk() {} virtual VOID OnNcRbuttonDown() {} virtual VOID OnNcRbuttonUp() {} virtual VOID OnNcRbuttonDblClk() {} virtual VOID OnNcMbuttonDown() {} virtual VOID OnNcMbuttonUp() {} virtual VOID OnNcMbuttonDblClk() {} virtual VOID OnNcXbuttonDown() {} virtual VOID OnNcXbuttonUp() {} virtual VOID OnNcXbuttonDblClk() {} virtual VOID OnInput() {} virtual VOID OnKeyDown() {} virtual VOID OnKeyUp() {} virtual VOID OnChar() {} virtual VOID OnDeadChar() {} virtual VOID OnSysKeyDown() {} virtual VOID OnSysKeyUp() {} virtual VOID OnSysChar() {} virtual VOID OnSysDeadChar() {} virtual VOID OnUniChar() {} virtual VOID OnImeStartComposition() {} virtual VOID OnImeEndComposition() {} virtual VOID OnImeComposition() {} virtual VOID OnInitDialog() {} virtual VOID OnCommand() {} virtual VOID OnSysCommand() {} virtual VOID OnTimer() {} virtual VOID OnHscroll() {} virtual VOID OnVscroll() {} virtual VOID OnInitMenu() {} virtual VOID OnInitMenuPopup() {} virtual VOID OnMenuSelect() {} virtual VOID OnMenuChar() {} virtual VOID OnEnterIdle() {} virtual VOID OnMenuRbuttonUp() {} virtual VOID OnMenuDrag() {} virtual VOID OnMenuGetObject() {} virtual VOID OnUnInitMenuPopup() {} virtual VOID OnMenuCommand() {} virtual VOID OnChangeUiState() {} virtual VOID OnUpdateUiState() {} virtual VOID OnQueryUiState() {} virtual VOID OnCtlColorMsgBox() {} virtual VOID OnCtlColorEdit() {} virtual VOID OnCtlColorListBox() {} virtual VOID OnCtlColorBtn() {} virtual VOID OnCtlColorDlg() {} virtual VOID OnCtlColorScrollBar() {} virtual VOID OnCtlColorStatic() {} virtual VOID OnGetHmenu() {} virtual VOID OnMouseMove() {} virtual VOID OnLbuttonDown() {} virtual VOID OnLbuttonUp() {} virtual VOID OnLbuttonDblClk() {} virtual VOID OnRbuttonDown() {} virtual VOID OnRbuttonUp() {} virtual VOID OnRbuttonDblClk() {} virtual VOID OnMbuttonDown() {} virtual VOID OnMbuttonUp() {} virtual VOID OnMbuttonDblClk() {} virtual VOID OnMouseWheel() {} virtual VOID OnXbuttonDown() {} virtual VOID OnXbuttonUp() {} virtual VOID OnXbuttonDblClk() {} virtual VOID OnParentNotify() {} virtual VOID OnEnterMenuLoop() {} virtual VOID OnExitMenuLoop() {} virtual VOID OnNextMenu() {} virtual VOID OnSizing() {} virtual VOID OnCaptureChanged() {} virtual VOID OnMoving() {} virtual VOID OnPowerBroadcast() {} virtual VOID OnDeviceChange() {} virtual VOID OnMdiCreate() {} virtual VOID OnMdiDestroy() {} virtual VOID OnMdiActivate() {} virtual VOID OnMdiRestore() {} virtual VOID OnMdiNext() {} virtual VOID OnMdiMaximize() {} virtual VOID OnMdiTile() {} virtual VOID OnMdiCascade() {} virtual VOID OnMdiIconArrange() {} virtual VOID OnMdiGetActive() {} virtual VOID OnMdiSetMenu() {} virtual VOID OnEnterSizeMove() {} virtual VOID OnExitSizeMove() {} virtual VOID OnDropFiles() {} virtual VOID OnMdiRefreshMenu() {} virtual VOID OnImeSetContext() {} virtual VOID OnImeNotify() {} virtual VOID OnImeControl() {} virtual VOID OnImeCompositionFull() {} virtual VOID OnImeSelect() {} virtual VOID OnImeChar() {} virtual VOID OnImeRequest() {} virtual VOID OnImeKeyDown() {} virtual VOID OnImeKeyUp() {} virtual VOID OnMouseHover() {} virtual VOID OnMouseLeave() {} virtual VOID OnNcMouseHover() {} virtual VOID OnNcMouseLeave() {} virtual VOID OnWtsSessionChange() {} virtual VOID OnTabletFirst() {} virtual VOID OnTabletLast() {} virtual VOID OnCut() {} virtual VOID OnCopy() {} virtual VOID OnPaste() {} virtual VOID OnClear() {} virtual VOID OnUndo() {} virtual VOID OnRenderFormat() {} virtual VOID OnRenderAllFormats() {} virtual VOID OnDestroyClipboard() {} virtual VOID OnDrawClipboard() {} virtual VOID OnPaintClipboard() {} virtual VOID OnVscrollClipboard() {} virtual VOID OnSizeClipboard() {} virtual VOID OnAskCbFormatName() {} virtual VOID OnChangeCbChain() {} virtual VOID OnHscrollClipboard() {} virtual VOID OnQueryNewPalette() {} virtual VOID OnPaletteIsChanging() {} virtual VOID OnPaletteChanged() {} virtual VOID OnHotKey() {} virtual VOID OnPrint() {} virtual VOID OnPrintClient() {} virtual VOID OnAppCommand() {} virtual VOID OnThemeChanged() {} virtual VOID OnHandHeldFirst() {} virtual VOID OnHandHeldLast() {} virtual VOID OnAfxFirst() {} virtual VOID OnAfxLast() {} virtual VOID OnPenWinFirst() {} virtual VOID OnPenWinLast() {} }; class Dialog : public Window { public : static INT_PTR CALLBACK DialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); }; #define WM_NCXBUTTONDOWN 0x00AB #define WM_NCXBUTTONUP 0x00AC #define WM_NCXBUTTONDBLCLK 0x00AD #define WM_INPUT 0x00FF #define WM_UNICHAR 0x0109 #define WM_CHANGEUISTATE 0x0127 #define WM_UPDATEUISTATE 0x0128 #define WM_QUERYUISTATE 0x0129 #define WM_MOUSEWHEEL 0x020A #define WM_XBUTTONDOWN 0x020B #define WM_XBUTTONUP 0x020C #define WM_XBUTTONDBLCLK 0x020D #define WM_WTSSESSION_CHANGE 0x02B1 #define WM_TABLET_FIRST 0x02c0 #define WM_TABLET_LAST 0x02df #define WM_APPCOMMAND 0x0319 #define WM_THEMECHANGED 0x031A #define CB_GETCOMBOBOXINFO 0x0164 #endif // WINDOW_H
見ての通り数個の静的関数とあとは大量の仮想関数の集合体です。大量の仮想関数はそれぞれウィンドウメッセージに対応するやつです。ウィンドウズのヘッダファイルを調べて一応全部網羅しました。下の方でデファってるメッセージIDは、ヘッダファイルには定義があるのだが何故だかうちの開発環境では無効になってるから再定義しました。
それでは数少ない静的関数の実装からご覧ください。
window.cpp
#include "window.h" LRESULT CALLBACK Window :: WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { Window * object = GetObject( hWnd ); if ( uMsg == WM_NCCREATE && lParam != NULL ) { object = ( Window * ) ( ( LPCREATESTRUCT ) lParam )->lpCreateParams; SetObject( hWnd, object ); } if ( object != NULL ) { object->hwnd = hWnd; object->umsg = uMsg; object->wparam = wParam; object->lparam = lParam; object->lresult = -1; object->MessageProc(); if ( object->lresult != -1 ) { return object->lresult; } } return DefWindowProc( hWnd, uMsg, wParam, lParam ); } BOOL CALLBACK Window :: EnumChildProc( HWND hWnd, LPARAM lParam ) { Window * object = ( Window * ) lParam; if ( object != NULL ) { object->hchild = hWnd; object->lparam = lParam; object->lresult = -1; object->ChildProc(); if ( object->lresult != -1 ) { return ( BOOL ) object->lresult; } } return TRUE; } VOID Window :: SetObject( HWND hWnd, Window * object ) { SetWindowLong( hWnd, GWL_USERDATA, * ( LONG * ) & object ); } Window * Window :: GetObject( HWND hWnd ) { Window * object; * ( LONG * ) & object = GetWindowLong( hWnd, GWL_USERDATA ); return object; } INT_PTR CALLBACK Dialog :: DialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { Dialog * object = ( Dialog * ) GetObject( hDlg ); if ( uMsg == WM_INITDIALOG && lParam != NULL ) { object = ( Dialog * ) lParam; SetObject( hDlg, object ); } if ( object != NULL ) { object->hwnd = hDlg; object->umsg = uMsg; object->wparam = wParam; object->lparam = lParam; object->lresult = -1; object->MessageProc(); if ( object->lresult != -1 ) { return object->lresult; } } return FALSE; }
最初のWindowProc()がいつものウィンドウプロシージャです。
普通だとウィンドウ追加するたんびにこれ書かなきゃならなくてもううんざりです。
だから今回はこれっきりです。
ウィンドウをクリエイトしたときに、このクラスを継承した実体からそのアドレスをパラメータとして頂きます、ごちそうさま。
で、最初のウィンドウメッセージのときに実態のアドレスをウィンドウ固有情報として保存。2回目以降はその情報から実体アドレスを特定し仮想関数システムが発動します。まさにイデオンの接触篇と発動篇です。チョー気持ち良い。
最初のウィンドウメッセージというのが曲者で、てっきりWM_CREATEかと思い込んでたので敵がWM_NCCREATEであることを突き止めるのに苦労しました。しかしダイアログウィンドウの場合は素直にWM_INITDIALOGで良かったりなんかする。ほんと困ったちゃん。
さてウィンドウの実体が判明したあと必ず呼び出されるのがMessageProc()です。ここで各メッセージに対応する仮想関数を実行します。ちょっと長いですけどどうぞ。
VOID Window :: MessageProc() { switch ( umsg ) { case WM_CREATE : OnCreate(); break; case WM_DESTROY : OnDestroy(); break; case WM_MOVE : OnMove(); break; case WM_SIZE : OnSize(); break; case WM_ACTIVATE : OnActivate(); break; case WM_SETFOCUS : OnSetFocus(); break; case WM_KILLFOCUS : OnKillFocus(); break; case WM_ENABLE : OnEnable(); break; case WM_SETREDRAW : OnSetRedraw(); break; case WM_SETTEXT : OnSetText(); break; case WM_GETTEXT : OnGetText(); break; case WM_GETTEXTLENGTH : OnGetTextLength(); break; case WM_PAINT : OnPaint(); break; case WM_CLOSE : OnClose(); break; case WM_QUERYENDSESSION : OnQueryEndSession(); break; case WM_QUERYOPEN : OnQueryOpen(); break; case WM_ENDSESSION : OnEndSession(); break; case WM_QUIT : OnQuit(); break; case WM_ERASEBKGND : OnEraseBkGnd(); break; case WM_SYSCOLORCHANGE : OnSysColorChange(); break; case WM_SHOWWINDOW : OnShowWindow(); break; case WM_WININICHANGE : OnWinIniChange(); break; case WM_DEVMODECHANGE : OnDevModEchange(); break; case WM_ACTIVATEAPP : OnActivateApp(); break; case WM_FONTCHANGE : OnFontChange(); break; case WM_TIMECHANGE : OnTimeChange(); break; case WM_CANCELMODE : OnCancelMode(); break; case WM_SETCURSOR : OnSetCursor(); break; case WM_MOUSEACTIVATE : OnMouseActivate(); break; case WM_CHILDACTIVATE : OnChildActivate(); break; case WM_QUEUESYNC : OnQueueSync(); break; case WM_GETMINMAXINFO : OnGetMinMaxInfo(); break; case WM_PAINTICON : OnPaintIcon(); break; case WM_ICONERASEBKGND : OnIconEraseBkGnd(); break; case WM_NEXTDLGCTL : OnNextDlgCtl(); break; case WM_SPOOLERSTATUS : OnSpoolerStatus(); break; case WM_DRAWITEM : OnDrawItem(); break; case WM_MEASUREITEM : OnMeasureItem(); break; case WM_DELETEITEM : OnDeleteItem(); break; case WM_VKEYTOITEM : OnVkeyToItem(); break; case WM_CHARTOITEM : OnCharToItem(); break; case WM_SETFONT : OnSetFont(); break; case WM_GETFONT : OnGetFont(); break; case WM_SETHOTKEY : OnSetHotKey(); break; case WM_GETHOTKEY : OnGetHotKey(); break; case WM_QUERYDRAGICON : OnQueryDragIcon(); break; case WM_COMPAREITEM : OnCompareItem(); break; case WM_GETOBJECT : OnGetObject(); break; case WM_COMPACTING : OnCompacting(); break; case WM_COMMNOTIFY : OnCommNotify(); break; case WM_WINDOWPOSCHANGING : OnWindowPosChanging(); break; case WM_WINDOWPOSCHANGED : OnWindowPosChanged(); break; case WM_POWER : OnPower(); break; case WM_COPYDATA : OnCopyData(); break; case WM_CANCELJOURNAL : OnCancelJournal(); break; case WM_NOTIFY : OnNotify(); break; case WM_INPUTLANGCHANGEREQUEST : OnInputLangChangeRequest(); break; case WM_INPUTLANGCHANGE : OnInputlangChange(); break; case WM_TCARD : OnTcard(); break; case WM_HELP : OnHelp(); break; case WM_USERCHANGED : OnUserChanged(); break; case WM_NOTIFYFORMAT : OnNotifyFormat(); break; case WM_CONTEXTMENU : OnContextMenu(); break; case WM_STYLECHANGING : OnStyleChanging(); break; case WM_STYLECHANGED : OnStyleChanged(); break; case WM_DISPLAYCHANGE : OnDisplayChange(); break; case WM_GETICON : OnGetIcon(); break; case WM_SETICON : OnSetIcon(); break; case WM_NCCREATE : OnNcCreate(); break; case WM_NCDESTROY : OnNcDestroy(); break; case WM_NCCALCSIZE : OnNcCalcSize(); break; case WM_NCHITTEST : OnNcHitTest(); break; case WM_NCPAINT : OnNcPaint(); break; case WM_NCACTIVATE : OnNcActivate(); break; case WM_GETDLGCODE : OnGetDlgCode(); break; case WM_SYNCPAINT : OnSyncPaint(); break; case WM_NCMOUSEMOVE : OnNcMouseMove(); break; case WM_NCLBUTTONDOWN : OnNcLbuttonDown(); break; case WM_NCLBUTTONUP : OnNcLbuttonUp(); break; case WM_NCLBUTTONDBLCLK : OnNcLbuttonDblClk(); break; case WM_NCRBUTTONDOWN : OnNcRbuttonDown(); break; case WM_NCRBUTTONUP : OnNcRbuttonUp(); break; case WM_NCRBUTTONDBLCLK : OnNcRbuttonDblClk(); break; case WM_NCMBUTTONDOWN : OnNcMbuttonDown(); break; case WM_NCMBUTTONUP : OnNcMbuttonUp(); break; case WM_NCMBUTTONDBLCLK : OnNcMbuttonDblClk(); break; case WM_NCXBUTTONDOWN : OnNcXbuttonDown(); break; case WM_NCXBUTTONUP : OnNcXbuttonUp(); break; case WM_NCXBUTTONDBLCLK : OnNcXbuttonDblClk(); break; case WM_INPUT : OnInput(); break; case WM_KEYDOWN : OnKeyDown(); break; case WM_KEYUP : OnKeyUp(); break; case WM_CHAR : OnChar(); break; case WM_DEADCHAR : OnDeadChar(); break; case WM_SYSKEYDOWN : OnSysKeyDown(); break; case WM_SYSKEYUP : OnSysKeyUp(); break; case WM_SYSCHAR : OnSysChar(); break; case WM_SYSDEADCHAR : OnSysDeadChar(); break; case WM_UNICHAR : OnUniChar(); break; case WM_IME_STARTCOMPOSITION : OnImeStartComposition(); break; case WM_IME_ENDCOMPOSITION : OnImeEndComposition(); break; case WM_IME_COMPOSITION : OnImeComposition(); break; case WM_INITDIALOG : OnInitDialog(); break; case WM_COMMAND : OnCommand(); break; case WM_SYSCOMMAND : OnSysCommand(); break; case WM_TIMER : OnTimer(); break; case WM_HSCROLL : OnHscroll(); break; case WM_VSCROLL : OnVscroll(); break; case WM_INITMENU : OnInitMenu(); break; case WM_INITMENUPOPUP : OnInitMenuPopup(); break; case WM_MENUSELECT : OnMenuSelect(); break; case WM_MENUCHAR : OnMenuChar(); break; case WM_ENTERIDLE : OnEnterIdle(); break; case WM_MENURBUTTONUP : OnMenuRbuttonUp(); break; case WM_MENUDRAG : OnMenuDrag(); break; case WM_MENUGETOBJECT : OnMenuGetObject(); break; case WM_UNINITMENUPOPUP : OnUnInitMenuPopup(); break; case WM_MENUCOMMAND : OnMenuCommand(); break; case WM_CHANGEUISTATE : OnChangeUiState(); break; case WM_UPDATEUISTATE : OnUpdateUiState(); break; case WM_QUERYUISTATE : OnQueryUiState(); break; case WM_CTLCOLORMSGBOX : OnCtlColorMsgBox(); break; case WM_CTLCOLOREDIT : OnCtlColorEdit(); break; case WM_CTLCOLORLISTBOX : OnCtlColorListBox(); break; case WM_CTLCOLORBTN : OnCtlColorBtn(); break; case WM_CTLCOLORDLG : OnCtlColorDlg(); break; case WM_CTLCOLORSCROLLBAR : OnCtlColorScrollBar(); break; case WM_CTLCOLORSTATIC : OnCtlColorStatic(); break; case MN_GETHMENU : OnGetHmenu(); break; case WM_MOUSEMOVE : OnMouseMove(); break; case WM_LBUTTONDOWN : OnLbuttonDown(); break; case WM_LBUTTONUP : OnLbuttonUp(); break; case WM_LBUTTONDBLCLK : OnLbuttonDblClk(); break; case WM_RBUTTONDOWN : OnRbuttonDown(); break; case WM_RBUTTONUP : OnRbuttonUp(); break; case WM_RBUTTONDBLCLK : OnRbuttonDblClk(); break; case WM_MBUTTONDOWN : OnMbuttonDown(); break; case WM_MBUTTONUP : OnMbuttonUp(); break; case WM_MBUTTONDBLCLK : OnMbuttonDblClk(); break; case WM_MOUSEWHEEL : OnMouseWheel(); break; case WM_XBUTTONDOWN : OnXbuttonDown(); break; case WM_XBUTTONUP : OnXbuttonUp(); break; case WM_XBUTTONDBLCLK : OnXbuttonDblClk(); break; case WM_PARENTNOTIFY : OnParentNotify(); break; case WM_ENTERMENULOOP : OnEnterMenuLoop(); break; case WM_EXITMENULOOP : OnExitMenuLoop(); break; case WM_NEXTMENU : OnNextMenu(); break; case WM_SIZING : OnSizing(); break; case WM_CAPTURECHANGED : OnCaptureChanged(); break; case WM_MOVING : OnMoving(); break; case WM_POWERBROADCAST : OnPowerBroadcast(); break; case WM_DEVICECHANGE : OnDeviceChange(); break; case WM_MDICREATE : OnMdiCreate(); break; case WM_MDIDESTROY : OnMdiDestroy(); break; case WM_MDIACTIVATE : OnMdiActivate(); break; case WM_MDIRESTORE : OnMdiRestore(); break; case WM_MDINEXT : OnMdiNext(); break; case WM_MDIMAXIMIZE : OnMdiMaximize(); break; case WM_MDITILE : OnMdiTile(); break; case WM_MDICASCADE : OnMdiCascade(); break; case WM_MDIICONARRANGE : OnMdiIconArrange(); break; case WM_MDIGETACTIVE : OnMdiGetActive(); break; case WM_MDISETMENU : OnMdiSetMenu(); break; case WM_ENTERSIZEMOVE : OnEnterSizeMove(); break; case WM_EXITSIZEMOVE : OnExitSizeMove(); break; case WM_DROPFILES : OnDropFiles(); break; case WM_MDIREFRESHMENU : OnMdiRefreshMenu(); break; case WM_IME_SETCONTEXT : OnImeSetContext(); break; case WM_IME_NOTIFY : OnImeNotify(); break; case WM_IME_CONTROL : OnImeControl(); break; case WM_IME_COMPOSITIONFULL : OnImeCompositionFull(); break; case WM_IME_SELECT : OnImeSelect(); break; case WM_IME_CHAR : OnImeChar(); break; case WM_IME_REQUEST : OnImeRequest(); break; case WM_IME_KEYDOWN : OnImeKeyDown(); break; case WM_IME_KEYUP : OnImeKeyUp(); break; case WM_MOUSEHOVER : OnMouseHover(); break; case WM_MOUSELEAVE : OnMouseLeave(); break; case WM_NCMOUSEHOVER : OnNcMouseHover(); break; case WM_NCMOUSELEAVE : OnNcMouseLeave(); break; case WM_WTSSESSION_CHANGE : OnWtsSessionChange(); break; case WM_TABLET_FIRST : OnTabletFirst(); break; case WM_TABLET_LAST : OnTabletLast(); break; case WM_CUT : OnCut(); break; case WM_COPY : OnCopy(); break; case WM_PASTE : OnPaste(); break; case WM_CLEAR : OnClear(); break; case WM_UNDO : OnUndo(); break; case WM_RENDERFORMAT : OnRenderFormat(); break; case WM_RENDERALLFORMATS : OnRenderAllFormats(); break; case WM_DESTROYCLIPBOARD : OnDestroyClipboard(); break; case WM_DRAWCLIPBOARD : OnDrawClipboard(); break; case WM_PAINTCLIPBOARD : OnPaintClipboard(); break; case WM_VSCROLLCLIPBOARD : OnVscrollClipboard(); break; case WM_SIZECLIPBOARD : OnSizeClipboard(); break; case WM_ASKCBFORMATNAME : OnAskCbFormatName(); break; case WM_CHANGECBCHAIN : OnChangeCbChain(); break; case WM_HSCROLLCLIPBOARD : OnHscrollClipboard(); break; case WM_QUERYNEWPALETTE : OnQueryNewPalette(); break; case WM_PALETTEISCHANGING : OnPaletteIsChanging(); break; case WM_PALETTECHANGED : OnPaletteChanged(); break; case WM_HOTKEY : OnHotKey(); break; case WM_PRINT : OnPrint(); break; case WM_PRINTCLIENT : OnPrintClient(); break; case WM_APPCOMMAND : OnAppCommand(); break; case WM_THEMECHANGED : OnThemeChanged(); break; case WM_HANDHELDFIRST : OnHandHeldFirst(); break; case WM_HANDHELDLAST : OnHandHeldLast(); break; case WM_AFXFIRST : OnAfxFirst(); break; case WM_AFXLAST : OnAfxLast(); break; case WM_PENWINFIRST : OnPenWinFirst(); break; case WM_PENWINLAST : OnPenWinLast(); break; } }
全種類のメッセージに対応してるとは言えウィンドウプロシージャの引数をメンバ変数に置き換えてあるのでシンプルでしょ?でげしょ?てけしょ?
関数はVOID型なので戻り値すら一切気にしなくて良いのだ。DefWindowProc()を呼びたくない人はメンバ変数のlresultに-1以外の値を代入してちょ。たったそれだけ。ほとんどの場合戻り値は0なんだけど、どうしても戻り値として-1を返したいという人はMessageProc()を上書きして対応すれば何とかなるでしょう。しめしめ。
以上です。