windows - 使用 Windows 视觉样式绘制的按钮周围有额外 1 像素的边距
问题描述
我们的一个遗留项目使用 API 调用来使用操作系统的当前视觉样式绘制自定义控件(可以在我问的这个问题中找到一些代码)。我们检测到经典按钮是用 1 像素的缩进绘制的,而不是占据整个指定的矩形。例如,如果我们需要一个 17x17 像素的按钮:
,实际上我们得到了一个 15x15 像素的按钮:
其他类似的控件(如组合按钮)完全按照请求的大小绘制:
我们的目标是绘制按钮以占据整个指定的矩形。是的,我确实知道,如果我们使用视觉样式进行绘制,那么周围的空间可以用于主绘制控件的半透明效果,但是我们所有的检查都确认这个 1 像素的边距根本没有被使用——无论是在 Windows 10 中还是在 Windows 7 中。最简单和“粗鲁”的解决方案是指定一个膨胀 1 个像素的矩形来绘制按钮,但如果在 Windows 中的视觉样式的未来实现中发生某些变化,这种方法可能会发生冲突。
所以问题是:我们能否以编程方式检测以当前视觉样式绘制的按钮使用边距,因此我们可以在指定矩形以绘制按钮时考虑到这一点?
一个主意。也许,我们可以从请求低级视觉样式部件属性的 API 调用中获取这些信息,如下所示:
额外信息。这是在 Windows XP 中使用 Silver Luna 主题绘制在 17x17 像素矩形中的组合按钮和普通按钮的屏幕截图:
如您所见,两个按钮都以给定的大小精确绘制:
下面您会看到在 Windows 7 中使用相同代码绘制的相同按钮:
现在右边的按钮占据了一个 15x15 像素的矩形。
解决方案
推荐阅读
- flutter - 颤振:GetX。使用 GetxController 将表单输入数据传递到下一页
- c - C stdio 重定向到子进程和从子进程重定向
- javascript - Nodegit 将提交变基到其父级
- css - 从自定义挂钩传递的值不能用于 BackgroundColor 的内联样式。不可分配给类型'BackgroundColor | 不明确的'
- c# - 从后台线程更新 UI 控件 - 委托仅调用一次
- java - 在获得某个值之前,如何继续调用 API?
- flutter - 从 Navigator.pop() 返回 null Future
- php - Redis设计模式:支持数据分页、排序、过滤和搜索
- haskell - Haskell CoreSyn 库——如何引用内置 IO 类型?
- python - 如何从 XML 文件中自动获取相同类型的每个对象?