Как установить начальный фокус элемента управления в конкретном окне? - PullRequest
19 голосов
/ 25 февраля 2011

Я создал приложение, в котором я использую оконную процедуру для отслеживания всех элементов управления в окне.

У меня вопрос, как мне изначально установить фокус на первый созданный элемент управления в окне?

1 Ответ

38 голосов
/ 25 февраля 2011

Существует два способа установить начальный фокус на конкретный элемент управления в MFC.

  1. Первый и самый простой метод состоит в том, чтобы использовать в своих интересах порядок вкладок элементов управления. Когда вы используете Resource Editor в Visual Studio для создания диалогового окна, вы можете назначить каждому элементу управления индекс вкладки. Элемент управления с индексом вкладки низший автоматически получит начальный фокус. Чтобы установить порядок вкладок элементов управления, выберите «Порядок вкладок» в меню «Формат» или нажмите Ctrl + D .

  2. Второй, немного более сложный, метод заключается в переопределении OnInitDialog функции в классе, представляющем ваш диалог. В этой функции вы можете установить фокус ввода на любой желаемый элемент управления, а затем вернуть FALSE, чтобы указать, что вы явно установили фокус ввода для одного из элементов управления в диалоговом окне. Если вы вернете 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 определенного элемента управления. Раймонд Чен объясняет здесь, в своем блоге , почему это сложнее, и почему предпочтительна функция GotoDlgCtrl (или ее эквивалент, сообщение WM_NEXTDLGCTRL).

...