在我的应用程序中,我有CFormView
CTabCtrl
,我还有4个CFormViews,它们是主要CFormView的子项,当用户更改所选标签时显示/隐藏。
但是,我找不到让Tab Order正常工作的方法。如果CTabCtrl具有焦点,则按Tab键无效,如果其中一个子CFormView具有焦点,则Tab键仅将焦点移动到CFormView内的控件周围。
我尝试将可见子CFormView的z顺序更改为CTabCtrl与SetWindowPos
之后,将子CFormViews样式更改为WS_EX_CONTROLPARENT
但似乎没有任何效果。
答案 0 :(得分:0)
您是从错误的实施开始的:您不应该使用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()
。