视觉工作室创作的C#窗体应用程序如何改变按钮颜色?

5

我有一个表单(参见截图):

默认表单外观

正如您所看到的,这是一个相当基本的表单,有一个保存按钮。我已经编写了程序,如果任何文本字段被更改,“SAVE”按钮的颜色也会改变,以便明显地表明我没有点击保存并且不要忘记保存。不幸的是,仅仅将按钮的BackColor更改为红色还不够,因为它非常丑陋。

丑陋的BackColor未保存

我该怎么做才能将按钮的颜色更改为红色,但不会这么丑?正如您所看到的那样,“BackColor”不会改变整个按钮,只会改变内部部分。边框仍然是传统的透明灰色。


也许前景色(而不是背景色)就足够了? - ken2k
最简单的方法是将应用程序转换为WPF,这样您将拥有更大的控制权。由于这是相当大量的工作,您将不得不继承按钮控件,并更改按钮的绘制方式,如果更改BackColor的值不能满足您的要求。 - Security Hound
1
我个人会在没有任何更改时将保存按钮禁用。当详细信息发生更改时启用它,然后在单击后再次禁用它。这只是另一种选择 :) - Alexander R
1
@Ramhound,我认为给OP的更好建议不是“完全重写你的应用程序”。 - ken2k
@ken2k- 他不需要“重新编写”整个应用程序。他所需要做的就是使用窗口类而不是Win32类。如果你有更好的解决方案,请提供。 - Security Hound
5个回答

12

使用LinearGradientBrush稍微一点就能够大幅减轻纯红色按钮的刺眼感。

button1.ForeColor = Color.White;

Bitmap bmp = new Bitmap(button1.Width, button1.Height);
using (Graphics g = Graphics.FromImage(bmp)) {
  Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height);
  using (LinearGradientBrush br = new LinearGradientBrush(
                                      r,
                                      Color.Red,
                                      Color.DarkRed,
                                      LinearGradientMode.Vertical)) {
      g.FillRectangle(br, r);
    }
  }

那么你可以将图像分配给按钮的BackgroundImage属性:

  button1.BackgroundImage = bmp;

结果:

在这里输入图片描述

注意:给按钮分配背景图像将失去鼠标悬停着色。


我想知道是否可以在BackgroundImage上使用透明度,使其与原始按钮混合。 - Stefan Paul Noack
那么我该如何删除背景图片呢? - Jason Axelrod
@JasonAxelrod 只需要一个简单的 button1.BackgroundImage = null; 就可以了。 - LarsTech
@LarsTech,我可以去掉按钮的边框吗? - madan
@madan 你可以尝试使用按钮的绘制事件。你可能需要重新实现鼠标悬停和鼠标按下的外观和感觉。 - LarsTech

2
另一种解决方案是在按钮上添加一个图标(例如感叹号),而不是解释,以通知用户更改尚未保存。要实现此功能,请参考Icon。请注意保留HTML标记。

另一个解决方案是使用自动保存。也可以使用Ribbon或ToolStrip。 - Security Hound

1

您可以使用按钮的一个属性“FlatStyle”。默认情况下,它是标准的。但是如果您将其切换为“Popup”,则背景颜色将扩展到按钮的区域。您可以比较以下内容:

left-standard, right-popup


欢迎来到 Stack Overflow!我们不鼓励重启老问题(2012年!),尤其是那些已有接受答案的问题。 - mzmm56
谢谢,这帮助我终于去掉了那些丑陋的边框! - undefined

1

1
该教程已被删除:“很抱歉,您正在尝试查看的文章已于2013年5月18日被删除。” - splungebob

-1

这在WinForms中行不通,但您可能想切换到WPF。 因为您可以配置所有东西,所以它更方便。(甚至是进度条的颜色)

编辑:OP不必完全重写应用程序。 他只需要重新设计布局,代码可以复制并粘贴到新的WPF项目中。

编辑²:您甚至不需要使用代码来更改WPF按钮的颜色,您可以在XAML文件中定义一个30%不透明度的红色叠加层。真的很容易。


1
我猜那些踩票来自于从未听说过WPF的人。 - Peter W.
3
不,WPF确实是一项很棒的技术。但由于OP正在使用Winforms,所以“重写所有应用程序,转移到WPF”的答案真的不好。 - ken2k
请查看我的回答编辑。;) 编辑:@noah1989,这是因为它展示了旧的WinForms平台的限制和WPF的优势,从而向OP展示了这一点。我只是一个月前开始使用WPF编程,现在已经得到了回报。 - Peter W.
@ken2k - 这是对所提出问题的完全有效的回答。作者想要知道如何使按钮改变颜色并且看起来不那么“丑”,这只给了他两个选项。使用WPF,它允许更大程度地控制控件或者编写自己的按钮控件。 - Security Hound
2
谢天谢地没有人再支持那个了,对吧?...对吧? - Peter W.
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接