26

Enterキーまたはキーが押されたときに MFC ダイアログが閉じないようにする 1 つの方法を知っていEscますが、プロセスの詳細と、それを行うための一般的な代替方法をすべて知りたいです。

助けてくれてありがとう。

4

6 に答える 6

37

ユーザーがダイアログで Enter キーを押すと、次の 2 つのことが起こります。

  1. ダイアログにはデフォルト コントロールがあります( を参照CDialog::SetDefID())。次に、このコントロールの ID を持つ WM_COMMAND がダイアログに送信されます。
  2. ダイアログには既定のコントロールがありません。次に、ID = IDOK の WM_COMMAND がダイアログに送信されます。

最初のオプションでは、既定のコントロールの ID が IDOK と等しい場合があります。その後、結果は 2 番目のオプションと同じになります。

デフォルトでは、クラスには仮想関数であるを呼び出すCDialogためのハンドラがあり、デフォルトではそれを呼び出してダイアログを閉じます。WM_COMMAND(IDOK)CDialog::OnOk()EndDialog(IDOK)

したがって、ダイアログが閉じられないようにする場合は、次のいずれかを実行します。

  1. デフォルトのコントロールを 以外に設定しますIDOK
  2. WM_COMMAND(IDOK)を呼び出さないにハンドラを設定しますEndDialog()
  3. 基本実装をオーバーライドCDialog::OnOk()して呼び出さないでください。

IDCANCEL については、似ていますが同等のものはなくSetDefID()、ESC キーがハードコーディングされています。ダイアログが閉じられないようにするには、次のようにします。

  1. WM_COMMAND(IDCANCEL)を呼び出さないにハンドラを設定しますEndDialog()
  2. 基本実装をオーバーライドCDialog::OnCancel()して呼び出さないでください。
于 2013-07-24T08:17:05.820 に答える
0

OnOk イベントをオーバーライドするだけで、メッセージを親ダイアログに渡す代わりに何もしません。
したがって、基本的には簡単です。

void OnOk() override { /*CDialog::OnOK();*/ }

これにより、return/enter キーを押したときにダイアログが閉じないようにする必要があります。

于 2018-08-03T19:09:48.560 に答える