Порядок вкладок в элементе управления вкладками с вложенными диалоговыми окнами (WS_EX_CONTROLPARENT) - PullRequest
3 голосов
/ 20 июля 2009

В проекте Win32 API C ++ у меня есть диалоговое окно с элементом управления вкладками (3 вкладки) и 3 диалоговыми окнами, которые являются дочерними элементами элемента управления вкладками. Я загружаю главное диалоговое окно с вкладками, используя DialogBoxParam, а дочерние диалоговые окна - из ресурсов с помощью CreateDialogParam. Главный диалог появляется с дочерними диалогами. Нажатие на вкладки показывает / скрывает правильный дочерний диалог, все работает нормально.

После поиска порядка порядка вкладок я нашел стиль WS_EX_CONTROLPARENT, который нужно установить на элементе управления вкладками, чтобы вкладки работали в дочерних диалоговых окнах. Это прекрасно работает, за исключением одной проблемы: сам элемент управления вкладками никогда не фокусируется, поэтому я не могу перейти на вкладку, чтобы перейти на другую вкладку с помощью клавиатуры. Фокус клавиатуры проходит через дочерний диалог, к кнопкам в главном диалоге, а затем непосредственно обратно к дочернему диалогу и никогда не останавливается на самом элементе управления вкладками, поэтому я должен щелкнуть элемент управления вкладками, чтобы изменить вкладки. Это сводит меня с ума. Есть предложения?

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

Ответы [ 2 ]

3 голосов
/ 09 октября 2009

Это не чище. Рекомендуемый способ создания диалогов с вкладками - сделать страницы вкладок дочерними элементами диалогового окна. Элемент управления tab просто контролирует, какая из страниц видима, но не является их родителем.

Это особенно важно, когда вы можете попытаться заставить тему XP работать в диалоге.

WS_EX_CONTROLPARENT - это стиль, предназначенный для установки в реальных диалоговых окнах с вкладками.

Полагаю, вы установили WS_TABSTOP на самом элементе управления вкладками? Я представляю, что WS_TABSTOP и WS_EX_CONTROLPARENT конфликтуют при одновременной установке, поскольку они говорят менеджеру диалогов сделать две совершенно разные и противоречивые вещи, когда цикл вкладок достигает элемента управления.

Наконец, я не вижу никакой причины, по которой мерцание должно усиливаться, поскольку страницы диалога являются дочерними элементами диалога, а не элементом управления вкладкой.

0 голосов
/ 23 июля 2009

Вы не можете AFAIK, потому что вкладки циклически перебирают дочерние элементы управления в диалоговом окне. Лучшее, что вы можете сделать, - это предварительно обработать событие нажатия клавиши табуляции и, если оно после фокуса находится на последнем элементе управления в диалоговом окне, сфокусировать страницу вкладки и отбросить событие. Мне кажется, не чище, чем решение, которое у вас уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...