C++ 带有CTabCtrl和子CFormViews的选项卡顺序

C++ 带有CTabCtrl和子CFormViews的选项卡顺序,c++,mfc,C++,Mfc,在我的应用程序中,我有一个CFormView和一个CTabCtrl,我还有4个CFormView,它们是主CFormView的子视图,当用户更改所选选项卡时显示/隐藏 但是,我找不到一种方法使选项卡顺序正常工作。如果CTabCtrl具有焦点,则按Tab键无效,如果其中一个子CFormView具有焦点,则Tab键将仅在CFormView内的控件周围移动焦点 我尝试使用SetWindowPos,将可见子视图CFormView的z顺序更改为正好在CTabCtrl之后,将子CFormViews样式更改为

在我的应用程序中,我有一个
CFormView
和一个
CTabCtrl
,我还有4个CFormView,它们是主CFormView的子视图,当用户更改所选选项卡时显示/隐藏

但是,我找不到一种方法使选项卡顺序正常工作。如果CTabCtrl具有焦点,则按Tab键无效,如果其中一个子CFormView具有焦点,则Tab键将仅在CFormView内的控件周围移动焦点


我尝试使用
SetWindowPos
,将可见子视图CFormView的z顺序更改为正好在CTabCtrl之后,将子CFormViews样式更改为
WS\u EX\u CONTROLPARENT
,但似乎没有任何效果。

您从错误的实现开始:您不应该使用
CTabCtrl
创建
CFormView
,然后在其中填充更多的
CFormView
。这是行不通的。相反,您应该使用
CPropertySheet
CPropertyPage
,其中焦点处理已经完成。通过调用
GetTabControl()
,您仍然可以访问
CPropertySheet
所拥有的
CTabCtrl
,但MFC将解决您遇到的问题

简而言之:从
CPropertySheet
为每个要显示的对话框窗口(例如,CConfigPage1、CConfigPage2)派生类。在资源编辑器中为每个对话框创建一个对话框资源,并执行所有其他标准的
CDialog
设置

接下来,从
CPropertySheet
派生一个类(例如CProps),并(可选)处理WM\u SIZE和TCN\u SELCHANGE

最后,从CView子代派生一个类,如
CScrollView
(例如,CViewMyWesomeStuff)。然后为
CPropertySheet
CPropertyPage
s添加成员变量,并处理WM\u CREATE,其中将()每个页面添加到属性页,然后
创建(此,WS\u CHILD | WS\u可见)
属性页


奖金:您可以通过在循环中调用
GetPage()
并对每个孩子调用函数,将
CView::OnUpdate
转发给每个孩子
CPropertyPage
,也可以向每个孩子发送消息(使用用户定义的消息,如
WM\u APP+1
)。他们可以通过调用
GetParent()->GetParent()->GetDocument()
来发现他们父母的
CDocument
您从错误的实现开始:您不应该使用
CTabCtrl
创建
CFormView
,然后在其中填充更多
CFormView
。这是行不通的。相反,您应该使用
CPropertySheet
CPropertyPage
,其中焦点处理已经完成。通过调用
GetTabControl()
,您仍然可以访问
CPropertySheet
所拥有的
CTabCtrl
,但MFC将解决您遇到的问题

简而言之:从
CPropertySheet
为每个要显示的对话框窗口(例如,CConfigPage1、CConfigPage2)派生类。在资源编辑器中为每个对话框创建一个对话框资源,并执行所有其他标准的
CDialog
设置

接下来,从
CPropertySheet
派生一个类(例如CProps),并(可选)处理WM\u SIZE和TCN\u SELCHANGE

最后,从CView子代派生一个类,如
CScrollView
(例如,CViewMyWesomeStuff)。然后为
CPropertySheet
CPropertyPage
s添加成员变量,并处理WM\u CREATE,其中将()每个页面添加到属性页,然后
创建(此,WS\u CHILD | WS\u可见)
属性页


奖金:您可以通过在循环中调用
GetPage()
并对每个孩子调用函数,将
CView::OnUpdate
转发给每个孩子
CPropertyPage
,也可以向每个孩子发送消息(使用用户定义的消息,如
WM\u APP+1
)。他们可以通过调用
GetParent()->GetParent()->GetDocument()

来发现其父级的
CDocument
,我可以确认当父级对话框是CDialog类时CONTROLPARENT是否启用了选项卡导航。如果父对象不是一个对话框,那么这可能不起作用(TM)?我假设您已经尝试过其他属性(向导将尝试为其提供菜单等),我可以确认CONTROLPARENT在父对话框为CDialog类时启用了选项卡导航。如果父对象不是一个对话框,那么这可能不起作用(TM)?我假设您已经尝试过其他属性(向导将尝试为其提供菜单等?)