Я создал приложение, в котором я использую оконную процедуру для отслеживания всех элементов управления в окне.
У меня вопрос, как мне изначально установить фокус на первый созданный элемент управления в окне?
Существует два способа установить начальный фокус на конкретный элемент управления в MFC.
Первый и самый простой метод состоит в том, чтобы использовать в своих интересах порядок вкладок элементов управления. Когда вы используете Resource Editor в Visual Studio для создания диалогового окна, вы можете назначить каждому элементу управления индекс вкладки. Элемент управления с индексом вкладки низший автоматически получит начальный фокус. Чтобы установить порядок вкладок элементов управления, выберите «Порядок вкладок» в меню «Формат» или нажмите Ctrl + D .
Второй, немного более сложный, метод заключается в переопределении OnInitDialog функции в классе, представляющем ваш диалог. В этой функции вы можете установить фокус ввода на любой желаемый элемент управления, а затем вернуть FALSE, чтобы указать, что вы явно установили фокус ввода для одного из элементов управления в диалоговом окне. Если вы вернете TRUE, платформа автоматически установит фокус на местоположение по умолчанию, описанное выше как первый элемент управления в диалоговом окне. Чтобы установить фокус на определенный элемент управления, вызовите метод GotoDlgCtrl и укажите свой элемент управления. Например:
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).
SetFocus
WM_NEXTDLGCTRL