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

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

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

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

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]