Last Updated 2002/07/15
Programming Tips Visual C++ API  索 引 
デフォルトダイアログプロシージャは呼び出していいのか?
2002/07/15

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

    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() がそのメッセージを処理する.


参照
ダイアログプロシージャの戻り値
キャプションのないダイアログの移動
前後のTips
デフォルトダイアログプロシージャは呼び出していいのか?

DSS ProgrammingTipsCGI Ver2.02