2012-03-23 36 views
2

私はモデルダイアログを持っています。 OnCancel関数をオーバーライドして、ESCボタンを押して予期しない終了を止めました。しかし、これは新しい問題を引き起こしました。閉じる(x)ボタンを使用してアプリケーションを閉じることはできません。関数の実装は次のとおりです。MFC/Visual C++のOnCancelボタンをオーバーライド

void MyDlg::OnCancel() 
{ 
} 
+1

OnCancelは、Xボタンを押すか、エスケープを押すことによって呼び出され、関数内で指示する方法はありません。

だけで、あなたはキーボードメッセージの前処理に必要なESCを無効にします。ユーザーが終了するかどうかを尋ねるメッセージダイアログを追加したり、エスケープキーをトラップして見ることができます。 –

+0

またはキャンセルボタン。 –

答えて

6

ダイアログを閉じると効果的にキャンセルされます。 OnCancelハンドラでクローズを無効にしているので、何も起こりません。

BOOL CYourDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    switch (pMsg->message) 
    { 
     case WM_KEYDOWN: 

      switch(pMsg->wParam) 
      { 
       case VK_ESCAPE: 
       case VK_CANCEL: return true; 
      } 
      break; 
    } 

    return CDialog::PreTranslateMessage(pMsg); 
} 
+0

私はあなたのソリューションを実装しました。それはうまく動作します...しかし、ESCボタンを押している間に終了する方法をもう一つ質問がありますか? – Riskhan

+0

私はそれが別の方法で行うのが良いと思います: "typedef CDialog base_class"、次に "base_class :: OnCancel();" VC固有の__superキーワードを使用するのではなく、 – Raxillan

+0

@krish OnCancel()を呼び出すだけで、ダイアログを終了する必要があります。私。 if文を使う。 – Raxillan

関連する問題