В MFC, для начального фокуса на проверенной RadioButton, установите текстовую метку как "выделенную"

Я использую приложение 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, Ни одна из этих комбинаций не имеет видимого влияния на поведение графического интерфейса.

Фокус всегда неявно устанавливается на правильную радиокнопку, и он отображается как проверенный правильно, просто нет выделенной текстовой метки, а любая последующая навигация или обход дает соответствующие выделенные текстовые метки.

Проблема только в первоначальном создании диалогового экрана.

Спасибо за любую помощь или рекомендации.

1 ответ

Согласно приведенной выше ссылке в комментарии @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.
Другие вопросы по тегам