Порядок табуляции с CTabCtrl и дочерними CFormViews - PullRequest
2 голосов
/ 14 октября 2011

В моем приложении у меня есть CFormView с CTabCtrl, у меня также есть 4 CFormView, которые являются дочерними по отношению к основному CFormView и которые отображаются / скрываются, когда пользователь меняет выбранную вкладку.

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

Я попытался изменить zпорядок отображения видимого дочернего CFormView сразу после CTabCtrl с SetWindowPos, изменил стили дочернего CFormViews на WS_EX_CONTROLPARENT, но, похоже, ничего не работает.

1 Ответ

0 голосов
/ 21 декабря 2011

Вы начали с неправильной реализации: вы не должны делать CFormView с CTabCtrl, а затем добавлять в него больше CFormView s.Это не сработает правильно.Вместо этого вы должны работать с CPropertySheet и CPropertyPage, где с обработкой фокуса уже позаботились.Вы по-прежнему сможете получить доступ к CTabCtrl, принадлежащему CPropertySheet, позвонив по номеру GetTabControl(), но MFC позаботится о возникших проблемах.

Вкратце: выведите классы из CPropertySheetдля каждого из диалоговых окон, которые вы хотите показать (например, CConfigPage1, CConfigPage2).Создайте ресурс Dialog в редакторе ресурсов для каждого из них и выполните все остальные стандартные настройки CDialog.

Далее, извлекаем класс из CPropertySheet (например, CProps) и (необязательно) обрабатываем WM_SIZE и TCN_SELCHANGE.

Наконец, наследуйте класс от потомка CView, например CScrollView (например, CViewMyAwesomeStuff).Затем добавьте переменные-члены для CPropertySheet и CPropertyPage s и обработайте WM_CREATE, где вы добавляете () каждую страницу к листу свойств, а затем Create(this,WS_CHILD|WS_VISIBLE) лист свойств.

Bonus : Вы можете переслать CView::OnUpdate каждому дочернему элементу CPropertyPage, вызывая GetPage() в цикле и вызывая функцию для каждого из них, или вы можете отправить сообщение каждому из них (используйте определяемое пользователем сообщение,как WM_APP+1).Они могут узнать CDocument своих родителей, позвонив по номеру GetParent()->GetParent()->GetDocument().

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