绘制具有热或按下状态的自定义按钮

时间:2018-06-04 11:13:13

标签: c# winforms button custom-button

我已经创建了一个自定义按钮控件。基本上是一个按钮矩形,但矩形内有两个具有不同行为的区域。出于这个原因,我想只为特定区域绘制热压状态,而不是孔按钮。

我目前的方法是使用带有emtpy文本的ButtonRenderer.DrawButton(...)绘制基本按钮,如果需要,绘制热点或按下状态,最后绘制文本。到目前为止一切顺利,但如何获得热/压状态的(渐变)颜色?

我已尝试SystemColorsKnownColorsVisualStyleRenderer.GetColor(ColorProperty.XYZ),但似乎没有一个匹配?如何从主机系统中读取这些颜色?

修改
下面的示例图片:

enter image description here

我想要这个win7屏幕截图的 hot 按钮状态 - (浅)蓝色的颜色。如果放大,可以看到上半部分和下半部分都有轻微的颜色渐变。

最后一个按钮显示了我想要完成的任务。

当然,我可以从截图中提取颜色并对其进行硬编码或使用建议的图像,但这只适用于此特定系统,不是吗?

1 个答案:

答案 0 :(得分:0)

谢谢你的回答,吉米。

根据您所关联的SO问题的已接受答案,我检查了ButtonBaseAdapterButtonStandardAdapter。正如您所提到的,ButtonRenderer.DrawButton调用VisualStyleRenderer.DrawBackground调用本机API UxTheme.DrawThemedBackground来绘制按钮 - 颜色确定在内部发生。 此本机API调用还会绘制按钮边框,这就是我无法使用它的原因。

但我能够解决我的问题,这是一种不寻常的方式,但它确实有效。

我将相关状态(热和按下)渲染到位图并使用.GetPixel提取颜色。在OnPaint中,我根据提取的颜色创建LinearGradientBrush - 实例,并在正常按钮的特定区域上绘制热/按效果。

与普通按钮完全相同的行为(对于这两种状态边框颜色也会发生变化),但我认为如果仅更改边框颜色会觉得很奇怪按钮的一部分(显示热/按效果的位置)以匹配正常的按钮行为......

如果没有其他答案或解决方案出现,我会在几天内将此帖标记为答案......