c#

位置:IT落伍者 >> c# >> 浏览文章

VS.NET实现渐变色(Gradient)窗体


发布日期:2023年02月16日
 
VS.NET实现渐变色(Gradient)窗体

简介

)thisstylewidth=; align=baseline twffan=done>

我最近注意到很多程序员都不重视他们开发的软件的外观这主要是因为他们觉得作个漂亮的界面通常很难或需要花很多时间其实在NET中你可以付出很少的精力就使自己的应用程序变得好看些其中的一个方法就是在窗体的背景上使用渐变色有时候一个明快的渐变色就足以使你的产品鹤立鸡群了

我在CodeProject上搜了一下发现已经有一篇由Erdal Halici写的关于渐变色窗体的文章但是我发现他的解决方法对于这个简单的任务显得既复杂又冗长这也就促成我写这篇文章

这篇文章主向您展示了处理这个问题的简单方法而且还提供了一个很小的基类使你可以在应用程序中直接使用我保证你需要作的唯一一件事就是设置颜色这总不困难吧?:)

女士们先生们打开您的Visual Studio吧!

好的坏的和渐变的

好的

的确有些人在花时间为自己的应用程序选个合适的颜色寻找一个和谐的背景颜色的确可以使他们的产品显得突出而且容易被认可但是我只能为它鼓掌然后反问为什么不能更进一步选择两种颜色呢?:)

坏的

还有些人甚至从不关心选择颜色的问题他们的应用程序只是使用乏味的灰色作为背景色这个你肯定在不少应用程序见过了那些设计者应该为此羞愧!(译注我汗哪!照这么说我该去跳楼了

渐变的

同时你也知道有人使用渐变色作背景在读了这篇文章之后我相信你也能成为其中之一你所作的就是选择颜色但是你的应用程序却会表现出特别的视觉效果知道为什么吗?因为用户喜欢这样的视觉效果

打造BaseGradientForm

首先要了解的

BaseGradientForm与一个具有一些预定义属性和方法的常规窗体相比并没多什么东西你按照通常的方法创建一个窗体唯一要作的事就是添加一些属性

三个属性和一个方法

我们需要添加三个属性

Color第一个渐变色(译注即窗体左侧的颜色)

Color第二个渐变色(译注即窗体右侧的颜色)

ColorAngle渐变度(即Color与Color之间的连线与X轴正向夹角)

这只是三个普通的属性像这样添加属性你可能已经作一千遍了吧!

当然这里还是有个不同的地方当我们设置一个值的时候(通过代码或者通过派生窗体设计期的属性设置)我们需要窗体重绘自己要达到这个目标我们需要调用一个很小的方法来告诉我们的窗体(或者是控件当我们要在控件上使用渐变色时)去重绘自己那个被调用的方法就是使窗体无效(Invalidate)的方法

borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>ee>

//窗体左侧显示的颜色

public Color Color

{

get { return _Color; }

set

{

_Color = value;

thisInvalidate(); // Tell the Form to repaint itself

}

}

//窗体右侧显示的颜色

public Color Color

{

get { return _Color; }

set

{

_Color = value;

thisInvalidate(); // Tell the Form to repaint itself

}

}

//颜色渐变度

public float ColorAngle

{

get { return _ColorAngle; }

set

{

_ColorAngle = value;

thisInvalidate(); // Tell the Form to repaint itself

}

}

像毕加索(picasso)那样绘画

不论什么时候窗体调用重绘函数都是因为我们调用使窗体无效的函数(Invalidated call)或者操作系统调度而发生的这将会触发两个事件(Paint或PaintBackground)如果你要在这两个事件的处理函数中添加代码也没什么关系不过因为我们是有逻辑思维的人

所以我们选择重写(override)PaintBackground

在这个方法中我们在窗体上绘制了一个矩形区域这个区域与我们的窗体大小相同这样就可以覆盖整个窗体变成窗体背景

borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>ee>

protected override void OnPaintBackground(PaintEventArgs pevent)

{

// Getting the graphics object

Graphics g = peventGraphics;

// Creating the rectangle for the gradient

Rectangle rBackground = new Rectangle( thisWidth thisHeight);

// Creating the lineargradient

SystemDrawingDrawingDLinearGradientBrush bBackground

= new SystemDrawingDrawingDLinearGradientBrush(rBackground

_Color _Color _ColorAngle);

// Draw the gradient onto the form

gFillRectangle(bBackground rBackground);

// Disposing of the resources held by the brush

bBackgroundDispose();

}

Bugs?

当你测试编写好的代码的时候你将发现当窗口大小改变的时候会出现一个很奇怪的现象当那个东西(critters译注应该指操作系统)接管这个事件的时候并不会发生它的发生是因为窗体大小发生变化时程序并没有捕获Repaint Yourself Event看来我们要处理所有的事情了不是吗 :) ?幸运的是我们不需要通过重写Resize Event完成这个困难的任务我们只用在BaseFormGradient的构造函数中加上这么一行代码告诉窗体当大小改变时重绘就行了

thisSetStyle( ControlStylesResizeRedraw true );

最后记住一点充分享受生活吧!(One last note to all : Enjoy Life To The Fullest !)

使用这个代码

基窗体(BaseForm)

当你把BaseFormGradientcs添加到项目之后让你的窗体继承BaseFormGradient就行了译注添加之后必须先编译BaseFormGradient再作继承)

使用渐变色

然后你所需要作的事情就是设置颜色和渐变度没错我可以很负责的说这就是你全部要作的事

ps这篇文章比较短也不是很难提到的方法比较有意思所以就选了这一篇作者的语气很幽默但也很罗嗦有些地方就不好翻译另外有两个问题在后面的答复中提到如何将这种风格应用到其他控件上(ButtonTabControl等)总不能每个控件都按相同的方法作一遍吧!它实现了左上到右下的渐变效果但我想把它变成从左向右的渐变效果该怎么办?

对于第一个问题作者也没提出什么好办法第二个问题作者通过一个坐标变换解决了问题我看的不是太明白有兴趣的可以看原文

代码下载_EasyWay_srczip

上一篇:解答关于C#的JavaScript函数的问题

下一篇:C#中DES加密用法的使用方法