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

Drawing a custom button with hot or pressed state

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

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

我试过 SystemColorsKnownColorsVisualStyleRenderer.GetColor(ColorProperty.XYZ),但其中 none 似乎匹配?我如何从主机系统读取这些颜色?

编辑:
下面的示例图片:

我想要 hotpressed 按钮状态的颜色 - 在这个 win7 截图的情况下是(浅)蓝色.如果放大,您可以看到上半部分和下半部分都使用了轻微的颜色渐变。

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

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

谢谢你的回答,Jimi。

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

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

我将两种相关状态(热和按下)渲染到位图并使用 .GetPixel 提取颜色。在 OnPaint 中,我从提取的颜色创建 LinearGradientBrush 实例,并在普通按钮的特定区域绘制 hot/pressed 效果。

不是与普通按钮完全相同的行为(对于两种状态,边框颜色也会改变),但我认为如果我只更改按钮的一部分(显示 hot/pressed 效果的地方)的边框颜色以匹配正常的按钮行为...

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