在Win32应用编程接口C++项目中,我有一个带有选项卡控件(3个选项卡)的对话框和3个选项卡控件的子级对话框。我使用DialogBoxParam加载带有选项卡控件的主对话框,使用CreateDialogParam加载来自资源的子对话框。此时将显示主对话框和子对话框。单击选项卡可显示/隐藏正确的子对话框,一切正常。
在搜索tab键顺序后,我找到了要在选项卡控件上设置的WS_EX_CONTROLPARENT样式,以便在子对话框窗口中使用tab键。这很好用,除了一个问题:选项卡控件本身永远不会获得焦点,所以我不能用tab键切换到tab控件来使用键盘切换到不同的选项卡。键盘焦点通过子对话框,转到主对话框上的按钮,然后直接回到子对话框,并且永远不会停止在选项卡控件本身,因此我必须单击选项卡控件来更改选项卡。快把我逼疯了。有什么建议吗?
更新:我设法解决了这个问题,完全忘记了WS_EX_CONTROLPARENT,并使子对话框成为选项卡控件的兄弟。唯一的副作用似乎是在重绘期间控件的闪烁更多,但仍然希望得到答案,因为使子对话框子选项卡看起来更干净。
发布于 2009-10-09 14:21:11
它不干净。创建选项卡式对话框的推荐方法是使选项卡页成为对话框的子级。选项卡控件只是控制哪些页面是可见的,而不是它们的父级。
当你想让XP主题在对话框上工作时,这一点尤其重要。
WS_EX_CONTROLPARENT是一种在实际的“选项卡”对话框上设置的样式。
我假设您已经在选项卡控件本身上设置了WS_TABSTOP?我认为当同时设置WS_TABSTOP和WS_EX_CONTROLPARENT时,它们会发生冲突,因为当Tab键循环到达控件时,它们会告诉对话框管理器做两件完全不同且相互冲突的事情。
最后,我根本看不到闪烁应该增加的任何原因,因为对话框页面是对话框的子控件,而不是选项卡控件。
发布于 2009-07-23 15:57:58
您不能使用AFAIK,因为Tab键在设计中循环通过对话框的子控件。你能做的最好的就是预处理tab keydown事件,如果焦点在对话框中的最后一个控件上,则将焦点放在选项卡页上并丢弃该事件。在我看来,它并不比你已经拥有的解决方案更干净。
https://stackoverflow.com/questions/1153981
复制相似问题