【问题标题】:Drawing a custom button with hot or pressed state绘制具有热或按下状态的自定义按钮
【发布时间】:2018-11-13 17:04:30
【问题描述】:

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

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

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

编辑:
示例图片如下:

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

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

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

【问题讨论】:

  • 你有没有想过做一个独立的用户控件?这将是丰富的功能!
  • @Amit 从UserControl 继承而不是Button 有什么好处?那将如何解决我的颜色问题?
  • 您可以拥有多层背景颜色(图像),因为您可以添加多个容器。这样你就可以在点击或其他动作上产生热键的效果。制作自定义控件总是很棘手,但有时它会产生最佳效果
  • 渐变色是什么意思?您能否详细说明并添加一些有关所需行为的描述和图片?
  • @RezaAghaei 示例和更多解释添加

标签: c# winforms button custom-button


【解决方案1】:

感谢您的回答,吉米。

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

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

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

不是与普通按钮完全相同的行为(对于两种状态,边框颜色也会更改),但我认为如果我仅更改边框颜色会看起来很奇怪按钮的一部分(显示热/按下效果)以匹配正常的按钮行为...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多