Last Updated 2002/07/15
週刊Bravo!! > Programing Tips > Visual C++ > API

デフォルトダイアログプロシージャは呼び出していいのか?


通常のウィンドウの場合,ウィンドウプロシージャの中は

    switch(msg) {
    case
        break;
    case
        break;
    default:
        return(DefWindowProc(hWnd, msg, wParam, lParam));
    }
    return (0L);

こんな感じとなり,デフォルトウィンドウプロシージャを呼び出している.
ダイアログプロシージャでも同じように,

    switch(msg) {
    case
        break;
    case
        break;
    default:
        return(DefDlgProc(hWnd, msg, wParam, lParam));
    }
    return (0L);

こんなことをするとスタックオーバーフローにて強制終了してしまう.


DefDlgProc() は
The DefDlgProc function must not be called by a dialog box procedure;
doing so results in recursive execution. 
と書いてあり,ダイアログプロシージャの呼び出し元である.
DefDlgProc() からダイアログプロシージャを呼び出し,ダイアログプロシージャ
から DefDlgProc() を呼び出せばスタックオーバーフローになるのは当たり前で
ある.

Except in response to the WM_INITDIALOG message, the dialog box procedure
should return nonzero if it processes the message, and zero if it does not.

処理しないメッセージに対しては FALSE を返すだけ DefDlgProc() がそのメッセー
ジを処理する.
参照
ダイアログプロシージャの戻り値
キャプションのないダイアログの移動

2002/07/15


週刊Bravo!! > Programing Tips > Visual C++ > API

感想要望などを下記メールアドレスまでお願いします.
前向きなメールがこれからを左右します.(^^)

DSSへメールを送る