在我的应用程序中,我有一个带有CFormView
的CTabCtrl
,我还有4个CFormViews,它们是CFormView主 View 的子级,当用户更改所选标签时会显示/隐藏它们。
但是,我找不到使Tab键正常工作的方法。如果CTabCtrl具有焦点,则按Tab键无效,并且如果子CFormView之一具有焦点,Tab键将仅在CFormView内部的控件周围移动焦点。
我尝试使用SetWindowPos
将可见子CFormView的z顺序更改为CTabCtrl之后,将子CFormViews样式更改为WS_EX_CONTROLPARENT
,但似乎无济于事。
最佳答案
您是从错误的实现开始的:您不应该使用CFormView
来创建CTabCtrl
,然后再向其中填充更多CFormView
。这行不通。相反,您应该使用CPropertySheet
和CPropertyPage
,其中已经处理了焦点处理。您仍然可以通过调用CTabCtrl
来访问CPropertySheet
所拥有的GetTabControl()
,但是MFC会解决您遇到的问题。
简要地说:从CPropertySheet
派生要显示的每个对话框窗口的类(例如CConfigPage1,CConfigPage2)。在资源编辑器中为每个对话框创建一个Dialog资源,并执行所有其他标准CDialog
设置。
接下来,从CPropertySheet
(例如CProps)派生一个类,并(可选)处理WM_SIZE和TCN_SELCHANGE。
最后,从CView后代派生一个类,例如CScrollView
(例如CViewMyAwesomeStuff)。然后添加CPropertySheet
和CPropertyPage
的成员变量,并处理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/