Я использую приложение Win32 с MFC в C ++ и использую формы с рядом диалоговых экранов. Моя проблема в том, что когда у меня есть последовательность этих экранов в последовательности, я хочу, чтобы начальный фокус а также соответствующая текстовая метка, которая будет установлена на определенную радиокнопку. На других экранах, если у меня есть первый виджет управления, который является полем редактирования текста, это происходит автоматически (то есть первый виджет управления в последовательности создания и последовательности табуляции имеет фокус, а текст внутри этого поля редактирования текста выделен). Однако на некоторых диалоговых экранах первый виджет управления является группой переключателей. В этих случаях фокус правильно неявно установлен на выбранную в данный момент радиокнопку. Однако связанная текстовая метка, описывающая эту кнопку метки, отображается без выделения. Любая последующая навигация пользователя (щелчком мыши или переводом с клавиатуры) всегда выделите соответствующую текстовую метку, когда установлен или выбран любой переключатель. Однако, только в этом начальном диалоговом окне я не могу выделить текстовую метку.
Для пояснения, под «подсветкой» я подразумеваю перфорированный контур, окружающий текстовую метку рядом с круглым изображением переключателя.
Вот некоторые из вещей, которые я пробовал в OnInitDialog()
Функция указанных экранов диалога:
SendDlgItemMessage(IDC_RADIO1, BM_SETCHECK, BST_CHECKED, 0);
Который делает отобразить заполненную круглую кнопку, представляя, что она отмечена, но соответствующая текстовая метка все еще не выделена.
Я также пытался «заставить» его воспринимать это как нажатие кнопки:
HWND hwdButton = ::GetDlgItem(m_hWnd, IDC_RADIO1);
::PostMessage(m_hWnd, WM_COMMAND, MAKELONG(IDC_RADIO1, BN_CLICKED),
(LPARAM) hwdButton);
Я также попытался отправить явное сообщение, чтобы установить «Состояние» (где, для RadioButton, я полагаю, что состояние ON или true представлено выделением текста).
SendDlgItemMessage(IDC_RADIO1, BM_SETSTATE, TRUE, 0);
Я также попытался сделать эти операции с или без последующего UpdateData(false)
обновить и с или без отдельной установки фокуса и возврата из OnInitDialog()
с false
вместо true
, Ни одна из этих комбинаций не имеет видимого влияния на поведение графического интерфейса.
Фокус всегда неявно устанавливается на правильную радиокнопку, и он отображается как проверенный правильно, просто нет выделенной текстовой метки, а любая последующая навигация или обход дает соответствующие выделенные текстовые метки.
Проблема только в первоначальном создании диалогового экрана.
Спасибо за любую помощь или рекомендации.
Согласно приведенной выше ссылке в комментарии @cha, причина, по которой «прямоугольник фокуса» не появляется, связана с настройкой отображения Microsoft Windows. В этом столбце рассказывается, как изменить настройки в различных вариантах Windows. В действительности, это, по-видимому, стандартная конфигурация для поведения Windows MFC — когда фокус находится на виджете управления диалогом, который является переключателем при инициализации, «прямоугольник фокуса» намеренно и конкретно удерживается от рисования, пока пользователь не инициирует навигацию с помощью клавиатуры событие (т.е. клавиши табуляции / ввода / стрелки). Проблема с этим (как уже было видно и показано в описании проблемы выше) заключается в том, что он меняет фокус — и может вводить пользователя в заблуждение, когда фокус был фактически уже правильно установлен, просто не обозначался «прямоугольником фокуса» ».
«Исключение», которое рисует прямоугольник фокуса на месте, без необходимости изменения фокуса, состоит в нажатии <Alt>
Клавиша на клавиатуре.
После некоторых копаний в другом месте, я использовал этот код для имитации события клавиатуры нажатия клавиши <Alt>
Ключ в конце OnInitDialog()
функция, и это дало желаемое поведение, фокус устанавливается по желанию, а также «прямоугольник фокуса» рисуется вокруг метки текущей выбранной радиокнопки:
// Simulating an <Alt> keystroke.
keybd_event(VK_MENU, 0xb8, 0, 0); // Depress `Alt` key.
keybd_event(VK_MENU, 0xb8, KEYEVENTF_KEYUP, 0); // Release `Alt` key.
Других решений пока нет …