【问题标题】:Tab Order with CTabCtrl and child CFormViews使用 CTabCtrl 和子 CFormViews 的 Tab 顺序
【发布时间】:2011-12-22 01:56:55
【问题描述】:

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

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

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

【问题讨论】:

  • 当父对话框是 CDialog 类时,我可以确认 CONTROLPARENT 确实启用了选项卡导航。如果父级不是对话框,也许这只是不起作用(TM)?我假设您已经尝试过其他属性(向导会尝试为其提供菜单等?)

标签: c++ mfc


【解决方案1】:

你从错误的实现开始:你不应该用CTabCtrl 来创建CFormView,然后在里面塞进更多的CFormViews。这不会正常工作。相反,您应该使用CPropertySheetCPropertyPage,它们已经处理好焦点处理。您仍然可以通过调用GetTabControl() 访问CPropertySheet 拥有的CTabCtrl,但MFC 会处理您遇到的问题。

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

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

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

奖励:您可以将CView::OnUpdate 转发给每个孩子CPropertyPage,方法是在循环中调用GetPage() 并在每个孩子上调用一个函数,或者您可以向每个孩子发送消息其中(使用用户定义的消息,例如WM_APP+1)。他们可以通过调用GetParent()->GetParent()->GetDocument() 找到他们父母的CDocument

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多