使用CTabCtrl和子CFormViews的Tab顺序

时间:2011-10-14 16:38:51

标签: c++ mfc

在我的应用程序中,我有CFormView CTabCtrl,我还有4个CFormViews,它们是主要CFormView的子项,当用户更改所选标签时显示/隐藏。

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

我尝试将可见子CFormView的z顺序更改为CTabCtrl与SetWindowPos之后,将子CFormViews样式更改为WS_EX_CONTROLPARENT但似乎没有任何效果。

1 个答案:

答案 0 :(得分:0)

您是从错误的实施开始的:您不应该使用CFormView制作CTabCtrl,然后将更多CFormView填入其中。这不会正常工作。相反,您应该使用CPropertySheetCPropertyPage,其中已经处理了焦点处理。您仍然可以通过调用CTabCtrl来访问CPropertySheet拥有的GetTabControl(),但MFC会处理您遇到的问题。

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

接下来,从CPropertySheet(例如,CProps)派生类,并且(可选地)处理WM_SIZE和TCN_SELCHANGE。

最后,从CView后代派生一个类,如CScrollView(例如,CViewMyAwesomeStuff)。然后为CPropertySheetCPropertyPage添加成员变量,并处理WM_CREATE,其中Add()每个页面到属性表,然后Create(this,WS_CHILD|WS_VISIBLE)属性表。

加分:您可以通过在循环中调用CView::OnUpdate并在每个子句上调用函数,或者您,将CPropertyPage转发给每个孩子GetPage()可以向每个人发送消息(使用用户定义的消息,如WM_APP+1)。他们可以通过调用CDocument来发现他们的父母GetParent()->GetParent()->GetDocument()