gpt4 book ai didi

c++ - 使用 CTabCtrl 和子 CFormViews 的 Tab 顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:43 26 4
gpt4 key购买 nike

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

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

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

最佳答案

你从错误的实现开始:你不应该用 CTabCtrl 创建一个 CFormView 然后填充更多的 CFormView进去。这不会正常工作。相反,您应该使用 CPropertySheetCPropertyPage,其中已经处理了焦点处理。您仍然可以通过调用 GetTabControl() 访问 CPropertySheet 拥有的 CTabCtrl,但是 MFC 会解决您的问题遇到过。

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

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

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com