Win32 选项卡控件中的右对齐选项卡项

Posted

技术标签:

【中文标题】Win32 选项卡控件中的右对齐选项卡项【英文标题】:Right-aligned tab items in Win32 tab control 【发布时间】:2011-04-05 16:24:51 【问题描述】:

我正在尝试在 Win32/c++ 中创建一个选项卡控件,它的选项卡按钮从右到左对齐。 WS_EX_LAYOUTRTL 标志对我没有帮助,因为它完全反映了选项卡项目和选项卡页面内容的绘图。应用程序本身自动处理镜像(这是一个跨平台的 UI 解决方案),这也是我们不使用 WS_EX_LAYOUTRTL 标志的原因(我们以通用方式为所有 UI 框架/平台实现了镜像)。

一种解决方案是在子类 TabCtrls 窗口过程中覆盖 TCM_GETITEMRECT 和 TCM_HITTEST。这使我能够正确移动按钮,但鼠标事件仍然作用于控件“知道”按钮真正所在的位置(即,第一个按钮上的鼠标悬停会使最左边的按钮无效 - 坐标未镜像)。

所以这对我来说似乎是一个死胡同。

另一种可能性是在第一个选项卡按钮之前插入填充,将它们全部推到右边缘。不过,我无法弄清楚如何做到这一点。 Visual Studio 显示这个小对话框:

他们是如何将按钮放在第一个标签页的前面的?知道这一点将使我能够解决这个问题。

更新,解决方法: 我的问题的解决方案是使用内置的 RTL 支持。为此,选项卡控件必须同时具有 WS_EX_LAYOUTRTL 和 WS_EX_NOINHERITLAYOUT 标志。这将保留所有现有绘图代码的功能,而仅镜像 TabCtrl 按钮。我没有意识到 ES_EX_NOINHERITLAYOUT 标志在父级(TabCtrl)上,这就是我寻找最初描述的解决方法的原因。

不过,作为参考,我仍然很想知道原始问题的答案。

【问题讨论】:

【参考方案1】:

如果你看一下间谍应用程序,你会发现它实际上不是一个普通的窗口选项卡控件,而是自定义的东西,并且绘图是由父窗口 AFAIK 完成的:

Visual Studio 和 Office 都使用大量自定义控件,其中一些功能在几年后进入通用控件,一些功能保持私有...

【讨论】:

如何确定它不是 TabCntrl 的子类?如果是,我想知道第一个标签之前的额外空间是如何添加的。 添加一个清单以强制使用视觉样式,您将看到只有组合框和一个选项卡控件是原生的,工具栏和大多数选项卡控件是自定义的:i.imgur.com/zwmiN.png 如果您检查选项,您会看到选项卡控件具有自定义溢出选项卡绘图:i.imgur.com/0GB4a.pngRealGetWindowClass() 也没有表明这是一个本机工具栏... 除了 RealGetWindowClass 部分(很明显,我需要阅读),这是否真的表明我们没有处理子类 TabCtrl?它不受视觉风格影响的事实根本不能说明这一点。充其量它表明 WM_PAINT 实现不考虑样式(考虑到它的年龄,这是有道理的)。也就是说,除了新控件和原始控件之间的一定程度的 API 兼容性、命中测试等之外,基于 TabCtrl 实现它可能几乎没有什么收获。所以如果我要做类似的事情,我应该把它放在地上起来了吗?

以上是关于Win32 选项卡控件中的右对齐选项卡项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TabControl 中的选项卡项中保留控件状态

Catel 中的嵌套验证

从用户控件中导航WPF选项卡控件?

Win32 (C++) 中的选项卡损坏

在 WPF 中开始时绑定所有选项卡项视图模型

带有添加新选项卡按钮 (+) 的 TabControl