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

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

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

1 ответ

Решение

Есть два способа установить начальный фокус на конкретный элемент управления в 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 сообщение) является предпочтительным.

Другие вопросы по тегам