c# - 绘制具有热或按下状态的自定义按钮
问题描述
我创建了一个自定义按钮控件。基本上是一个按钮矩形,但在矩形内有两个区域具有不同的行为。出于这个原因,我只想为特定区域绘制热压状态,而不是孔按钮。
我目前的方法是使用ButtonRenderer.DrawButton(...)
空文本绘制基本按钮,如果需要,绘制热或按下状态,最后绘制文本。到目前为止一切顺利,但我如何获得热/压制状态的(渐变)颜色?
我试过了SystemColors
,KnownColors
但VisualStyleRenderer.GetColor(ColorProperty.XYZ)
似乎没有一个匹配?如何从主机系统中读取这些颜色?
编辑:
下面的示例图片:
在这个win7屏幕截图的情况下,我想要热键和按下按钮状态的颜色 - (浅)蓝色。如果放大,您可以看到上半部分和下半部分都使用了轻微的颜色渐变。
最后一个按钮显示了我想要完成的事情。
当然,我可以从屏幕截图中提取颜色并对其进行硬编码或使用建议的图像,但这仅适用于这个特定系统,不是吗?
解决方案
谢谢你的回答,吉米。
根据您链接的 SO 问题的接受答案,我检查了ButtonBaseAdapter
和ButtonStandardAdapter
. 正如您还提到的,ButtonRenderer.DrawButton
调用VisualStyleRenderer.DrawBackground
本机 APIUxTheme.DrawThemedBackground
来绘制按钮的调用 - 颜色确定发生在内部。这个本机 API 调用还绘制了按钮边框,这就是我不能使用它的原因。
但我能够以一种不寻常的方式解决我的问题,但它确实有效。
我将两个相关状态(热和按下)渲染到位图并使用.GetPixel
. 在我从提取的颜色中OnPaint
创建-instances 并在普通按钮的特定区域上绘制热/按下效果。LinearGradientBrush
它与普通按钮的行为不完全相同(对于两种状态,边框颜色也会发生变化),但我认为如果我只为按钮的一部分更改边框颜色(热/按下效果是显示)以匹配正常的按钮行为...
如果没有其他答案或解决方案出现,我会在几天后将此帖子标记为答案...
推荐阅读
- android - ParentFragmentManager 和 ChildFragmentManager 给出错误的行为
- python - ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=2. Full shape received: [None, 2584]
- kivy - 类函数/方法中的时钟计划一旦错误
- c# - C# 我的 BindingSource 过滤器似乎不会更新 dataGrid
- angular - 如何在 Angular 中打印 ag-Grid?
- mysql - 如何在sql数据库中创建动态数据字段
- html - 无法使用 YouTube 中的链接播放视频
- visual-studio-code - vscode python注释切换不起作用
- django - 如何生成要在模板中显示的索引号
- python - psycopg2 vs MySQLdb 反斜杠转义行为