我们的一个遗留项目使用API调用来使用当前操作系统的视觉样式来绘制自定义控件(一些代码可以在this question中找到)。我们检测到经典的按钮是用1像素缩进绘制的,而不是占用整个指定的矩形。例如,如果我们需要一个17x17像素的按钮:
,实际上我们得到一个15x15像素的按钮:
其他类似的控件(如Combo按钮)完全按照请求的大小绘制:
我们的目标是绘制按钮来占据整个指定的矩形。是的,我知道,如果我们用视觉样式绘制,周围的空间可以用于主绘制控件的半透明效果,但是我们所有的检查都确认这一个像素边距根本不被使用——既不在Windows 10,也不在Windows 7中。最简单和“粗鲁”的解决方案是指定一个膨胀了1像素的矩形来绘制按钮,但是如果将来在windows中实现视觉样式时发生更改,这种方法可能会发生冲突。
因此,问题是:我们可以用编程方式来检测当前视觉样式绘制的按钮是否使用边距,因此,在指定要绘制按钮的矩形时,我们可以考虑这一点吗?
一个主意。也许,我们可以从API调用中获取这些信息,这些请求要求低级视觉样式部分属性如下:
额外信息。这是一个屏幕截图,显示的是Windows XP中以银色Luna为主题的17x17像素矩形绘制的组合按钮和普通按钮:
正如你所看到的,两个按钮都是按给定大小精确绘制的:
在下面的窗口7中,您可以看到用相同代码绘制的相同按钮:
现在右边的按钮占据了一个15x15像素的矩形。
最佳答案
@乔纳森·波特是对的。这是视觉风格的效果。
当启用视觉样式时,可以将不同的状态应用于不同的部分。
windows为控件和窗口以及这些部分绘制某些部分
分为父部分和子部分。大部分地区都有
示例禁用、活动或选定。创建控件时,
决定要将视觉样式应用于控件的哪些部分。
请参阅“Parts and States”。
什么是正确的方法?这取决于你的要求。
对于你的问题,如果你不想减小你期望看到的按钮的大小,你可以将DrawThemeBackground函数的部分ID指定为0
,它可以被解释为“对于这个元素的所有部分来说都是相同的数据”。
在Windows 8之前,可视样式可以在控件中关闭。
面板,以便应用程序可以支持视觉样式,但不支持
在给定时间应用的视觉样式。
在Windows 8中,无法关闭视觉样式。
请参阅“IsAppThemed”
更多参考资料:“Visual Styles”Visual Styles Overview“Using Visual Styles with Custom and Owner-Drawn Controls”
关于windows - 使用Windows视觉样式绘制的按钮周围额外的1像素边距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397980/