Как настроить несколько групп переключателей для правильного порядка табуляции и взаимодействия с клавиатурой (WIN32)?

Прежде всего это не MFC.
Вот урезанная версия GUI, над которой я работал:

введите описание изображения здесь

Как вы можете видеть, я пытался создать две разные группы, Icon и Button, используя код:

    index->hAddT.hwndIndex[2] = CreateWindowEx(NULL,L"BUTTON",L"Icon",WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
200,135,120,170,WINDOWHANDLE,(HMENU)IDC_RADIOGROUP,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL);

Проблема, которую я имею, и что вы, вероятно, можете видеть, состоит в том, что для окна есть только одна радиокнопка. Это означает, что пользователь не мог выбрать одну радиокнопку из группы значков и одну из группы кнопок. Я инициализировал каждую кнопку радио следующим образом:

    index->hAddT.hwndIndex[3] = CreateWindowEx(NULL,L"BUTTON",L"Information",WS_CHILD | BS_AUTORADIOBUTTON | WS_VISIBLE,
205,155,100,20,WINDOWHANDLE,(HMENU)IDC_RADIO1,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL);

Я бы хотел, чтобы группа переключателей «Значок» была отделена от группы переключателей «Кнопка», если это имеет смысл, и поэтому для каждой группы будет доступна по одному переключателю.
Как это будет возможно, потребует ли я сделать новое окно и новую процедуру обратного вызова только для того, чтобы иметь дополнительную радиокнопку. Должен быть другой способ сгруппировать дочерние элементы, например, так.

2 отдельные группы переключателей в одной форме WINAPI (без MFC)
Ссылка не использовалась для моих целей.

У меня есть справочное руководство по программированию для Windows Fifth Edition Чарльза Петцольда, и он заявляет в разделе «Групповые блоки» «Групповые блоки часто используются для включения других элементов управления кнопками», но реального примера этого нет.

8

Решение

Вопреки распространенному мнению, вам НЕ нужен элемент управления групповым ящиком или какой-либо другой такой внешний «контейнер» (который в любом случае не является групповым ящиком, это просто артефакт кнопки). Ниже описано, как вы можете сделать это с нет требование групповой коробки. Если вы хотите групповой блок, который функционально помогает в макете, описанном здесь, перейдите вниз к РЕДАКТИРОВАТЬ часть этого ответа, где я объясняю, как конкретные желания ОП могут быть достигнуты.

Авто-радио кнопки «банки» работают с использованием двух ключевых атрибутов стиля окна, WS_GROUP, а также WS_TABSTOP. Сделайте следующее для ваших двух «банков», которые я буду ласково называть Bank1 и Bank2:

  1. Банк 1: первый переключатель должен иметь и то и другое WS_GROUP | WS_TABSTOP в стиле управления. остальные переключатели должны иметь ни из них и должны быть в том же порядке (то есть в сценарии DIALOG они сразу следуют друг за другом; при динамическом создании они создаются последовательно).

  2. Первый дочерний контроль после ваш последний переключатель в Bank1 должен иметь как минимум стиль WS_GROUP, а WS_GROUP | WS_TABSTOP, если это элемент управления с табуляции.

  3. Банк 2: первый переключатель должен иметь и то и другое WS_GROUP | WS_TABSTOP в стиле управления. остальные переключатели должны иметь ни из них и должны быть в том же порядке (в сценарии DIALOG они сразу следуют друг за другом; при динамическом создании они создаются последовательно).

  4. Первый дочерний контроль после ваш последний переключатель в Bank2 должен иметь как минимум стиль WS_GROUP, а WS_GROUP | WS_TABSTOP, если это элемент управления с табуляции.

Макет, подобный указанному выше, позволяет вам «вкладывать» в банк переключателей и использовать клавиши со стрелками для переключения выбора. Затем вы снова «вкладываете», чтобы покинуть банк и перейти к следующему табу-стопу. Помните, что менеджер диалогов всегда будет переходить к следующему дочернему элементу управления WS_TABTOP, когда вы нажимаете клавишу Tab (или ранее Shift-Tab). Если элемент управления, к которому выполняется переход, имеет автоматический тип, выбранный элемент управления будет «выбранным» элементом управления в самом последнем WS_GROUP.

Если это поможет, возьмите блокнот для рисования, нарисуйте его на бумаге и приклейте букву «T» на табуляциях и букву «G» на атрибутах группы, как описано выше. Это, вероятно, будет намного яснее, если визуализировать. Посмотрите на сценарий диалогового ресурса, чтобы увидеть, как они работают вместе для большего понимания.

Примечания: Если вы хотите использовать групповые блоки, окружающие их, вы можете. Диспетчер диалогов работает путем привязки элементов управления к группам на основе последнего элемента управления, который был отмечен с помощью WS_GROUP, и после этого первый элемент управления, имеющий WS_TABSTOP, считается точкой перехода по вкладке для этой группы. Первая вставка Groupbox (которая не может быть табуляцией), а затем переключатели с переключателем WS_TABSTOP на первом переключателе (на этот раз без WS_GROUP) также будут работать. Я обычно нахожу, что проще просто расположить свои переключатели независимо от групповых блоков.

РЕДАКТИРОВАТЬ Картинка говорит тысячу слов

Для вашей картинки я бы, вероятно, создал следующих детей в следующем порядке:

  1. Групповое поле «Значок», включая стиль WS_GROUP.
  2. Автоматическая кнопка «Информация», включая WS_TABSTOP
  3. Все остальные «Иконки» групповые радиокнопки. НЕ включайте WS_TABSTOP или WS_GROUP.
  4. Групповой блок «Кнопка», включая стиль WS_GROUP. Это закрывает текущую контрольную группу и начинает следующую.
  5. Автоматическая кнопка «AbortretryIgnore», включая WS_TABSTOP
  6. Все остальные «Кнопочные» группы переключателей. НЕ включайте WS_TABSTOP или WS_GROUP.
  7. Следующий элемент управления после переключателей «Button» должен включать WS_GROUP. Это закрывает текущую контрольную группу и запускает следующую.

Очевидно, что все другие стили дочернего элемента управления, видимость и т. Д. Также должны использоваться правильно, и, конечно, у всех детей должны быть уникальные идентификаторы. Я предполагаю, что у вас уже есть все остальное.

12

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

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

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