Я создал приложение, в котором я использую оконную процедуру для отслеживания всех элементов управления в окне.
Мой вопрос в том, как изначально установить фокус на первый созданный элемент управления в окне?
Я создал приложение, в котором я использую оконную процедуру для отслеживания всех элементов управления в окне.
Мой вопрос в том, как изначально установить фокус на первый созданный элемент управления в окне?
Есть два способа установить начальный фокус на конкретный элемент управления в MFC.
Первый и самый простой способ - использовать порядок вкладок ваших элементов управления. Когда вы используете редактор ресурсов в Visual Studio для вывода диалогового окна, вы можете назначить каждому элементу указатель табуляции. Элемент управления с наименьшим индексом вкладки автоматически получит начальный фокус. Чтобы установить порядок вкладок ваших элементов управления, выберите "Заказ табуляции" в меню "Формат" или нажмите Ctrl + D.
Второй, немного более сложный метод - переопределить функцию 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
конкретного элемента управления. Raymond Chen объясняет здесь в своем блоге, почему это сложнее, и почему функция GotoDlgCtrl
(или ее эквивалент, сообщение WM_NEXTDLGCTRL
) является предпочтительным.