首页 > 解决方案 > 使用 Windows 视觉样式绘制的按钮周围有额外 1 像素的边距

问题描述

我们的一个遗留项目使用 API 调用来使用操作系统的当前视觉样式绘制自定义控件(可以在我问的这个问题中找到一些代码)。我们检测到经典按钮是用 1 像素的缩进绘制的,而不是占据整个指定的矩形。例如,如果我们需要一个 17x17 像素的按钮:

Windows 10 中的按钮 (1)

,实际上我们得到了一个 15x15 像素的按钮:

Windows 10 中的按钮 (3)

其他类似的控件(如组合按钮)完全按照请求的大小绘制:

Windows 10 中的组合按钮 (3)

我们的目标是绘制按钮以占据整个指定的矩形。是的,我确实知道,如果我们使用视觉样式进行绘制,那么周围的空间可以用于主绘制控件的半透明效果,但是我们所有的检查都确认这个 1 像素的边距根本没有被使用——无论是在 Windows 10 中还是在 Windows 7 中。最简单和“粗鲁”的解决方案是指定一个膨胀 1 个像素的矩形来绘制按钮,但如果在 Windows 中的视觉样式的未来实现中发生某些变化,这种方法可能会发生冲突。

所以问题是:我们能否以编程方式检测以当前视觉样式绘制的按钮使用边距,因此我们可以在指定矩形以绘制按钮时考虑到这一点?

一个主意。也许,我们可以从请求低级视觉样式部件属性的 API 调用中获取这些信息,如下所示:

主题资源管理器按钮低级属性


额外信息。这是在 Windows XP 中使用 Silver Luna 主题绘制在 17x17 像素矩形中的组合按钮和普通按钮的屏幕截图:

WinXP Silver Luna 按钮 - 缩放 1000%

如您所见,两个按钮都以给定的大小精确绘制:

下面您会看到在 Windows 7 中使用相同代码绘制的相同按钮:

Windows 7 Aero 按钮 - 缩放 1000%

现在右边的按钮占据了一个 15x15 像素的矩形。

标签: windowswinapibuttonpropertiesvisual-styles

解决方案


推荐阅读