代码之家  ›  专栏  ›  技术社区  ›  Michael

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

  •  1
  • Michael  · 技术社区  · 7 年前

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

    我现在的方法是用 ButtonRenderer.DrawButton(...) 使用emtpy文本,根据需要绘制热状态或按下状态,最后绘制文本。到目前为止还不错,但是我如何获得热/压状态的(渐变)颜色呢?

    我试过了 SystemColors , KnownColors VisualStyleRenderer.GetColor(ColorProperty.XYZ) 但他们似乎都不匹配?如何从主机系统读取这些颜色?

    编辑:
    示例图片如下:

    enter image description here

    我要两种颜色 热的 以及 按下 按钮状态(浅)蓝色,以防此Win7屏幕截图。如果放大,可以看到上半部分和下半部分都使用了轻微的颜色渐变。

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

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Michael    7 年前

    谢谢你的回答,吉米。

    根据你的回答,我检查了 ButtonBaseAdapter ButtonStandardAdapter . 你也提到过, ButtonRenderer.DrawButton 电话 VisualStyleRenderer.DrawBackground 它调用本机api UxTheme.DrawThemedBackground 绘制按钮-颜色决定发生在里面。 这个本地api调用还绘制了按钮边框,这就是我不能使用它的原因。

    但我能解决我的问题,一个不寻常的方法,但它奏效了。

    我将两个相关状态(热和按下)呈现为位图,并使用 .GetPixel . 在 OnPaint 我创造 LinearGradientBrush -从提取的颜色中提取实例,并在普通按钮的特定区域上绘制热压效果。

    它是 与普通按钮完全相同的行为(对于这两种状态,边框颜色也会改变),但是如果我只改变按钮的一部分(显示热压效果的地方)的边框颜色以匹配普通按钮的行为,那看起来会很奇怪……

    如果没有其他答案或解决方案,我将在几天内把这篇文章标记为答案…

    推荐文章