0

MFCウィザードベースアプリケーションを開発しています。cancelアプリケーションがロードされると、ボタンに自動的にフォーカスします。ユーザーがEnterキーを押すと、アプリケーションが予期せず終了します。次に、を使用して内部ダイアログに表示されるテキストボックスにフォーカスを設定しますcedit.setFocus()。ただし、キーボードを使用して入力すると、テキストフィールドにフォーカスが表示されますが、Enterキーを押してもcancelボタンにフォーカスします。

簡単に言えば、MFCウィザードボタンのフォーカスを設定して強制終了する方法はありますか

編集: 明確にするために問題の画像を追加しました。このウィンドウを見てください。ここでは、カーソルは「テキストボックス1」にありますが、ウィザードボタンをキャンセルするためにフォーカスされています(2つの要素にフォーカスするように)。テキストを入力すると、問題なく「テキストボックス1」に移動します。しかし、Enterボタンを押すと、キャンセルボタンにフォーカスするため、Exitを形成します。したがって、キャンセルボタンのこのデフォルトのフォーカスを削除する必要があります。ただし、「テキストボックス1」にのみ焦点を合わせる必要があります ここに画像の説明を入力してください

4

3 に答える 3

1

OnInitDialog 内のコントロールにフォーカスを設定する場合は、既定の実装の戻り値を FALSE に変更する必要があります。それ以外の場合、フレームワークは自動的にダイアログの最初のコントロールにフォーカスを設定します。

于 2013-03-13T11:12:44.510 に答える
1

Christopher と mfc からの適切な回答はそれぞれ、発生しているさまざまな部分を説明し、その部分を解決する方法を教えてくれます。残りの部分は、アプリケーションが自動的に「キャンセル」ボタンにフォーカスを設定すると言うことです。これは、[レイアウト] - [タブ オーダー] を使用してダイアログ エディターで制御し、編集コントロールに最初のフォーカスを持たせることもできます。.SetFocus() と FALSE を返す手法は、プログラムの制御下でフォーカスを設定するのに役立ちます。レイアウト - タブ オーダーは、[TAB] キーが複雑なダイアログのコントロール間でフォーカスを移動する順序を選択するのに役立ちます。

于 2013-03-13T14:42:50.420 に答える
0

CDialogの標準的な動作では、Enterキーを[OK]ボタンをクリックし、キーを[ESCキャンセル]ボタンとして指定します。これらのメッセージは、MFCフレームワーク内のデフォルトのハンドラーで処理されます。これとは異なる動作が必要な場合は、IDOKおよびIDCANCELクリックメッセージハンドラーをオーバーライドする必要があります。

ただし、キーに対する編集ボックスの応答に関する問題Enterは、それ自体がまったく異なる問題です。Enterこれは、デフォルトの編集ボックスが1行のテキスト入力のみを処理するためのものであり、キーコードに応答しないためです。

複数行入力の編集ボックスを有効にするには、ダイアログエディタで編集ボックスのプロパティMulti-lineとプロパティを設定する必要があります。Want return

OPからの最初のコメントの後の追加情報-----------------

ダイアログのOKデフォルトの応答ボタンとして設定されているため、ボタンが強調表示されます。Default Buttonダイアログエディタでこのボタンのプロパティのを削除します。ただし、これは視覚的な表示のみであり、OK作業したいもののためにこのボタンを削除しなければならない場合があります。

ダイアログ出口としてキーを無効Enterにするには、次のようにバイパスハンドラーを追加する必要があります。

// add a message routing macro entry in the message map
ON_BN_CLICKED(IDOK, OnFilterDefaultExitKey)

// add a function prototype in the {{AFX_MSG() declaration
afx_msg void OnFilterDefaultExitKey();

// add a handler in the class implementation file
 /* ==================================== */
void CTest1Dlg::OnFilterDefaultExitKey() 
{
    // default exit key handler, ignore everything.
}

ただし、この方法でコードを追加すると、OKキーが完全に役に立たなくなり、クリックにまったく応答しなくなります。Doneしたがって、ユーザーによる編集データのファイナライズを処理するには、ボタンを手動で追加する必要があります。

 /* ========================== */
void CTest1Dlg::OnButtonDone() 
{
    EndDialog(IDOK);    
}
于 2013-03-13T13:21:43.867 に答える