xボタンで終了時、確認ウィンドウを表示させたい

[戻る]
yama1 [E-Mail] 2014/09/29(月) 20:24:28
開発環境:VisualC++ 2008
動作OS:Windows7です。


ウィンドウの右上のxボタンでウィンドウを終了させる時、確認ウィンドウを表示させた
いのですが、
以下の関数を定義しても、うまく動きません。
WndProc()関数が呼ばれていないようです。
どうすれば呼ばれるのでしょうか?

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
    switch (msg) {
    case WM_CLOSE:
             if ( IDYES == MessageBox ( 
               hwnd,
               TEXT("Are you sure you want to quit this program?"),
               TEXT("Confirmation"),
               MB_YESNO ) ) {
               DestroyWindow(hwnd);
             }
       return 0;

    case WM_RBUTTONUP:
        DestroyWindow(hwnd);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd , msg , wp , lp);
}

よろしくお願いします。

仲澤@失業者 2014/09/30(火) 13:22:18
なんででしょうね。

1.×ボタンでのWM_CLOSEは最上位(トップレベル)のフレームウインドウに来ます。
 RegisterClassしたときに設定したコールバックですね。
 このコールバックはそれですか。

2.WM_CLOSEでメッセージボックスを表示し終わったら、DestroyWindow()ではなく、
 return Default_Proc( msge, wpar, lpar);としましょう。

WM_RBUTTONUPの処理も変ですが割愛。

仲澤@失業者 2014/09/30(火) 13:42:08
間違いました。・・・orz.

2.WM_CLOSEでメッセージボックスを表示し終わったら、DestroyWindow()ではなく、
 × return Default_Proc( msge, wpar, lpar);としましょう。
 ○ return DefWindowsProc( hwnd, msg, wp, lp);としましょう。

yama1 [E-Mail] 2014/10/04(土) 11:54:28
仲澤さん。いつも回答ありがとうございます。

OnSysCommandメソッドで以下のように処理したらできるようになりました。

void CTmpDialog::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }else if(nID == SC_CLOSE) {
        //xボタンをおされたら終了確認のダイアログを表示する。
        ConfirmExitFunc();
    }else{
        CDialog::OnSysCommand(nID, lParam);
    }
}

yama1 [E-Mail] 2014/10/04(土) 11:54:54
[[解決]]
解決しました。

古いスレッドには追加発言できません。