windows - 使用Windows视觉样式绘制的按钮周围额外的1像素边距

标签 windows winapi button properties visual-styles

我们的一个遗留项目使用API调用来使用当前操作系统的视觉样式来绘制自定义控件(一些代码可以在this question中找到)。我们检测到经典的按钮是用1像素缩进绘制的,而不是占用整个指定的矩形。例如,如果我们需要一个17x17像素的按钮:
Push button in Windows 10 (1)
,实际上我们得到一个15x15像素的按钮:
Push button in Windows 10 (3)
其他类似的控件(如Combo按钮)完全按照请求的大小绘制:
Combo button in Windows 10 (3)
我们的目标是绘制按钮来占据整个指定的矩形。是的,我知道,如果我们用视觉样式绘制,周围的空间可以用于主绘制控件的半透明效果,但是我们所有的检查都确认这一个像素边距根本不被使用——既不在Windows 10,也不在Windows 7中。最简单和“粗鲁”的解决方案是指定一个膨胀了1像素的矩形来绘制按钮,但是如果将来在windows中实现视觉样式时发生更改,这种方法可能会发生冲突。
因此,问题是:我们可以用编程方式来检测当前视觉样式绘制的按钮是否使用边距,因此,在指定要绘制按钮的矩形时,我们可以考虑这一点吗?
一个主意。也许,我们可以从API调用中获取这些信息,这些请求要求低级视觉样式部分属性如下:
Theme Explorer push button low-level properties
额外信息。这是一个屏幕截图,显示的是Windows XP中以银色Luna为主题的17x17像素矩形绘制的组合按钮和普通按钮:
WinXP Silver Luna Buttons - zoom 1000%
正如你所看到的,两个按钮都是按给定大小精确绘制的:
在下面的窗口7中,您可以看到用相同代码绘制的相同按钮:
Windows 7 Aero Buttons - zoom 1000%
现在右边的按钮占据了一个15x15像素的矩形。

最佳答案

@乔纳森·波特是对的。这是视觉风格的效果。
当启用视觉样式时,可以将不同的状态应用于不同的部分。
windows为控件和窗口以及这些部分绘制某些部分
分为父部分和子部分。大部分地区都有
示例禁用、活动或选定。创建控件时,
决定要将视觉样式应用于控件的哪些部分。
请参阅“Parts and States”。
什么是正确的方法?这取决于你的要求。
对于你的问题,如果你不想减小你期望看到的按钮的大小,你可以将DrawThemeBackground函数的部分ID指定为0,它可以被解释为“对于这个元素的所有部分来说都是相同的数据”。
在Windows 8之前,可视样式可以在控件中关闭。
面板,以便应用程序可以支持视觉样式,但不支持
在给定时间应用的视觉样式。
在Windows 8中,无法关闭视觉样式。
请参阅“IsAppThemed
更多参考资料:“Visual StylesVisual Styles OverviewUsing Visual Styles with Custom and Owner-Drawn Controls

关于windows - 使用Windows视觉样式绘制的按钮周围额外的1像素边距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397980/

相关文章:

windows - 检查 Win32 线程是否正在运行或处于挂起状态

c++ - C++ 和 Windows 操作系统之间的关系

c++ - WM_GETFONT 返回类型 LRESULT 而不是预期的 HFONT

c# - 为什么 Windows 只允许一个应用程序访问网络摄像头?

windows - 无法将 Windows docker 镜像推送到 Artifactory

windows - 难道不能从线程 ID 获取句柄吗?

jquery - PhoneGap 单按钮按下正确方式,无多点触控干扰

Android 小部件按钮 Onclick Toast 消息

java - Selenium、Java、屏幕截图和单击按钮的问题

windows - 如何从父文件夹中搜索每个 ABC 文件夹以查找 *.txt 文件?