2009-07-20 27 views
3

在Win32 API C++项目中,我有一个带有选项卡控件(3个选项卡)和3个对话框的对话框,这些对话框是选项卡控件的子项。我使用DialogBoxParam加载具有选项卡控件的主对话框,并使用CreateDialogParam从资源加载子对话框。主对话框出现在子对话框中。点击标签显示/隐藏正确的子对话框,一切工作正常。带有嵌套对话框的选项卡控件中的Tab顺序(WS_EX_CONTROLPARENT)

经过搜索周围的标签订单后,我发现WS_EX_CONTROLPARENT风格设置在选项卡控件上,以获取选项卡工作到子对话窗口。这很好,除了一个问题:选项卡控件本身永远不会获得焦点,所以我无法通过键盘选项卡切换到不同的选项卡。键盘焦点会通过子对话框,主对话框上的按钮,然后直接返回到子对话框,并且永远不会停在选项卡控件本身上,因此我必须单击选项卡控件才能更改选项卡。这让我疯狂。有什么建议么?

更新:我设法通过完全忘掉WS_EX_CONTROLPARENT并使该子对话框中的选项卡控件的兄弟对齐来解决该问题。唯一的副作用似乎是在重新绘制过程中控件的更多闪烁,但仍然需要一个答案,因为使选项卡的子对话框的子对象看起来更清晰。

回答

3

它不干净。建议选项卡式对话框的建议方法是制作对话框的选项卡页面。选项卡控件只是控制哪些页面可见,但不是它们的父级。

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

WS_EX_CONTROLPARENT是一种旨在设置在实际“标签”对话框上的样式。

我认为你已经在选项卡控件上设置了WS_TABSTOP?我认为WS_TABSTOPWS_EX_CONTROLPARENT在同时设置时会发生冲突,因为它们会告诉对话管理器在制表符周期达到控件时执行两个完全不同且冲突的事情。

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

+0

适用于我。制作选项卡控件的子对话框的网络上的样本太多,MS在文档中没有说清楚。我已经启用了XP选项卡主题,并且它工作正常。 – Jay 2009-12-16 13:25:27

0

您不能AFAIK,因为按设计,选项卡会在对话框的子控件中循环。最好你可以做的是预处理标签keydown事件,如果焦点在对话框中的最后一个控件之后,请关注标签页并放弃事件。不是比我已经拥有的解决方案更清洁。

+0

似乎DialogProc没有得到处理Tab键的机会,我不想编写自己的消息循环来解决这个问题。所以我决定离开我的解决方案并继续前进。我很惊讶,我找不到其他人在网上遇到同样的问题。大家都说使用WS_EX_CONTROLPARENT,然后产生这个新问题。 – Jay 2009-07-24 18:38:12

相关问题