Вы начали с неправильной реализации: вы не должны делать 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()
.