在我的应用程序中,我有一个带有CFormViewCTabCtrl,我还有4个CFormViews,它们是CFormView主 View 的子级,当用户更改所选标签时会显示/隐藏它们。

但是,我找不到使Tab键正常工作的方法。如果CTabCtrl具有焦点,则按Tab键无效,并且如果子CFormView之一具有焦点,Tab键将仅在CFormView内部的控件周围移动焦点。

我尝试使用SetWindowPos将可见子CFormView的z顺序更改为CTabCtrl之后,将子CFormViews样式更改为WS_EX_CONTROLPARENT,但似乎无济于事。

最佳答案

您是从错误的实现开始的:您不应该使用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())。他们可以通过调用ojit_code来发现其 parent 的ojit_code。

关于c++ - 使用CTabCtrl和子CFormViews的Tab键顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7770781/

10-11 16:29