Mesoscopic Programming

タコさんプログラミング専門

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()を上書きして対応すれば何とかなるでしょう。しめしめ。

以上です。