【问题标题】:Tab order in tab control with nested dialogs (WS_EX_CONTROLPARENT)带有嵌套对话框的选项卡控件中的选项卡顺序 (WS_EX_CONTROLPARENT)
【发布时间】:2009-07-20 14:38:59
【问题描述】:

在 Win32 API C++ 项目中,我有一个带有选项卡控件(3 个选项卡)和 3 个作为选项卡控件子级的对话框的对话框。我使用 DialogBoxParam 加载带有选项卡控件的主对话框,并使用 CreateDialogParam 从资源加载子对话框。主对话框与子对话框一起出现。单击选项卡显示/隐藏正确的子对话框,一切正常。

在搜索了选项卡顺序后,我发现WS_EX_CONTROLPARENT 样式可以在选项卡控件上设置,以使选项卡在子对话框窗口中工作。这很好用,除了一个问题:选项卡控件本身永远不会获得焦点,所以我无法使用键盘切换到选项卡控件以更改为不同的选项卡。键盘焦点通过子对话框,到主对话框上的按钮,然后直接回到子对话框,并且永远不会停止在选项卡控件本身上,所以我必须单击选项卡控件来更改选项卡。这让我疯狂。有什么建议吗?

更新:我设法通过完全忘记WS_EX_CONTROLPARENT 来解决这个问题,并使子对话框成为选项卡控件的兄弟姐妹。唯一的副作用似乎是在重绘期间控件闪烁更多,但仍然希望得到答案,因为使选项卡的子对话框的子项看起来更干净。

【问题讨论】:

    标签: winapi visual-c++


    【解决方案1】:

    它不干净。创建选项卡式对话框的推荐方法是使选项卡页成为对话框的子级。选项卡控件只是控制哪些页面是可见的,而不是它们的父页面。

    当您尝试让 XP 主题在对话框上运行时,这一点尤其重要。

    WS_EX_CONTROLPARENT 是一种用于在实际“选项卡”对话框中设置的样式。

    我想你已经在选项卡控件本身上设置了WS_TABSTOP?我想象WS_TABSTOPWS_EX_CONTROLPARENT冲突在同时设置时,当标签循环到达控件时,他们告诉对话框管理器。

    最后,我看不出任何闪烁应该增加的原因,因为对话框页面是对话框的子级而不是选项卡控件。

    【讨论】:

    • 为我工作。在使对话框成为选项卡控件的子项的网络上有太多示例,并且 MS 在文档中没有明确说明。我已经启用了 xp 选项卡主题,它工作正常。
    【解决方案2】:

    您不能 AFAIK,因为按设计在对话框的子控件之间循环切换。您可以做的最好的事情是预处理 tab keydown 事件,如果它在焦点位于对话框中的最后一个控件之后,则关注标签页并丢弃该事件。在我看来,它并不比您已经拥有的解决方案更干净。

    【讨论】:

    • 似乎 DialogProc 没有机会处理 Tab 键,我不想编写自己的消息循环来解决这个问题。所以我决定放弃我拥有的解决方案并继续前进。我很惊讶我在网上找不到其他有同样问题的人。每个人都说要使用 WS_EX_CONTROLPARENT,然后产生了这个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多