web-dev-qa-db-ja.com

特定のウィンドウでコントロールの初期フォーカスを設定するにはどうすればよいですか?

ウィンドウプロシージャを使用してウィンドウ内のすべてのコントロールを追跡するアプリケーションを作成しました。

私の質問は、ウィンドウで最初に作成されたコントロールに最初にフォーカスを設定するにはどうすればよいですか?

20
karthik

MFCの特定のコントロールに初期フォーカスを設定する方法は2つあります。

  1. 最初の最も簡単な方法は、コントロールのタブ順序を利用することです。 Visual Studioのリソースエディターを使用してダイアログをレイアウトする場合、各コントロールにタブインデックスを割り当てることができます。 最低タブインデックスを持つコントロールは、自動的に最初のフォーカスを受け取ります。コントロールのタブ順序を設定するには、[フォーマット]メニューから[タブ順序]を選択するか、を押します。 Ctrl+D

  2. 2番目の、もう少し複雑な方法は、ダイアログを表すクラスの OnInitDialog function をオーバーライドすることです。この関数では、入力フォーカスを任意のコントロールに設定してから、FALSEを返し、ダイアログボックスのコントロールの1つに入力フォーカスを明示的に設定したことを示します。 TRUEを返すと、フレームワークは自動的にフォーカスをデフォルトの場所に設定します。これは、ダイアログボックスの最初のコントロールとして上記で説明されています。特定のコントロールにフォーカスを設定するには、 GotoDlgCtrlメソッド を呼び出してコントロールを指定します。例えば:

    BOOL CMyDialog::OnInitDialog()
    {
        CDialog::OnInitDialog();
    
        // Add your initialization code here
        // ...
    
        // Set the input focus to your control
        GotoDlgCtrl(GetDlgItem(IDC_EDIT)); 
    
        // Return FALSE because you manually set the focus to a control
        return FALSE;
    }
    

    特定のコントロールのSetFocusメソッドを呼び出すだけで、ダイアログボックスにフォーカスを設定するしない必要があることに注意してください。 Raymond Chen 彼のブログでここで説明しています なぜそれがそれよりも複雑なのか、そしてなぜGotoDlgCtrl関数(またはそれに相当するもの、WM_NEXTDLGCTRLメッセージ)が優先されます。

38
Cody Gray