在Win32 API C ++项目中,我有一个带有选项卡控件(3个选项卡)和3个对话框的对话框,这些对话框是选项卡控件的子代。我使用DialogBoxParam加载带有选项卡控件的主对话框,使用CreateDialogParam从资源加载子对话框。将出现带有子对话框的主对话框。单击选项卡显示/隐藏正确的子对话框,一切正常。
在搜索选项卡顺序后,我发现要在选项卡控件上设置WS_EX_CONTROLPARENT
样式以使标签工作进入子对话框窗口。除了一个问题之外,这很好用:选项卡控件本身永远不会获得焦点,因此我无法使用选项卡控件切换到使用键盘的其他选项卡。键盘焦点通过子对话框,主对话框上的按钮,然后直接返回子对话框,永远不会停止在选项卡控件本身,所以我必须单击选项卡控件来更改选项卡。这让我疯狂。有什么建议吗?
更新:我设法通过完全忘记WS_EX_CONTROLPARENT
来解决问题,并使子对话框成为制表符控件的兄弟姐妹。重复期间只有副作用似乎更多的控件闪烁,但仍然喜欢答案,因为使子对话框的子项看起来更清晰。
答案 0 :(得分:3)
它不干净。创建选项卡式对话框的推荐方法是使选项卡页面成为对话框的子页面。选项卡控件只控制哪些页面可见,但不是它们的父页面。
当您尝试在对话框中使用XP主题时,这一点尤其重要。
WS_EX_CONTROLPARENT
是一种旨在在实际“标签”对话框中设置的样式。
我认为你在标签控件本身设置了WS_TABSTOP
?我想象WS_TABSTOP
和WS_EX_CONTROLPARENT
在设置时会发生冲突,因为它们告诉对话管理器完成两个完全不同且相互冲突的事情 - 当制表符周期到达控件时。
最后,我看不出任何因为对话框页面是对话框的子节点而不是制表符控件的闪烁应该增加的原因。
答案 1 :(得分:0)
您不能使用AFAIK,因为标签会按设计循环显示对话框的子控件。您可以做的最好是预处理选项卡keydown事件,如果焦点位于对话框中的最后一个控件之后,请关注选项卡页并丢弃该事件。在我看来,并不比你已经拥有的解决方案更清晰。