解决方案 »
- params string[] values如何定义
- C#操作word文档出现问题。进来帮帮忙(winform)
- 如何用C#编写一个倒记时程序?
- 用C#做WORD的高手帮我看看拉,在线等!十万火急!!
- 菜鸟问一个弱弱的问题:DataGridView中删除命令无效
- 请问,c#有象java的api文档吗?
- excle导入简单问题
- 在WEB中用DATAGRID的记忆问题
- C#数据库导出到excel
- 大家做WINFORM的时候是把控件分开来,还是直接做到FORM上,我感觉把全部的控件贴到FORM上面好像不符合OO的思路
- 如何在C#(vs2008)设置directshow环境?谢谢赐教
- 怎样加快combobox的加载速度
{
//为WPF应用程序设置渐变的背景颜色
this.Background = (Brush)TryFindResource("MyGradientBackground");
}
其中,TryFindResource()方法可找到创建的资源,语法格式如下:
public Object TryFindResource(Object resourceKey)
参数Object resourceKey表示要查找的资源的键标识符,该方法的返回值表示找到的资源,如未找到,则返回Null引用。
接着创建一个LinearGradientBrush渐变色画笔资源MyGradientBackground。完成后的Window1.xaml文件的内容如下所示:
<Window x:Class="WpfApplication5.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<LinearGradientBrush x:Key="MyGradientBackground"
StartPoint="0,0"
EndPoint="1,1">
<GradientStop Color="Yellow" Offset="0.0"/>
<GradientStop Color="Red" Offset="0.25"/>
<GradientStop Color="Blue" Offset="0.75"/>
<GradientStop Color="LimeGreen" Offset="1.0"/>
</LinearGradientBrush>
</Window.Resources>
<Button Height="23" Name="button1" Width="200" Click="button1_Click">为WPF应用程序设置渐变的背景颜色</Button>
</Window>
private void Form1_Paint(object sender, PaintEventArgs e)
{
Point center = new Point(245, 200); // 圆环中心
int r = 100; // 半径(外径)
int w = 50; // 环径(=外径-内径)
float startAngle = 50f; // 起始角度
float sweepAngle = 270f; // 扇区扫角 Graphics g = this.CreateGraphics(); Rectangle bound = new Rectangle(center, new Size(0, 0));
bound.Inflate(r, r); GraphicsPath gPath = new GraphicsPath();
gPath.AddPie(bound, startAngle, sweepAngle);
gPath.AddPie(Rectangle.Inflate(bound, -w, -w), startAngle, sweepAngle); GraphicsPath bPath = new GraphicsPath();
bPath.AddEllipse(bound);
bPath.AddEllipse(Rectangle.Inflate(bound, -w, -w)); PathGradientBrush brush = new PathGradientBrush(bPath);
Blend blend = new Blend();
blend.Factors = new float[] { 0, 1, 0, 0 };
blend.Positions = new float[] { 0, w / 2f / r, w / 1f / r, 1 };
brush.Blend = blend; brush.CenterColor = Color.Yellow;
brush.SurroundColors = new Color[] { Color.Black }; g.FillPath(brush, gPath); brush.Dispose();
g.Dispose();
}
GraphicsPath gpath = new GraphicsPath();
float f = 0.0F;
float x1, y1, x2, y2;
Rectangle rec1 = new Rectangle(145, -100, 200, 200);
gpath.AddLine(145, 0, 195, 0);
gpath.AddArc(rec1, 90.0F + f, 90.0F - f);
rec1 = new Rectangle(195, -50, 100, 100);
gpath.AddArc(rec1, 90.0F + f, 90.0F - f);
f = f * (float)Math.PI / 180; // 角度与弧度的转换
y1 = 100.0F * (float)Math.Cos(f);
x1 = 100.0F * (1.0F - (float)Math.Sin(f)) + 145.0F;
y2 = 50.0F * (float)Math.Cos(f);
x2 = 50.0F * (1.0F - (float)Math.Sin(f)) + 195.0F;
gpath.AddLine(x1, y1, x2, y2); //Brush myBrush = new LinearGradientBrush(new Rectangle(145, 0, 200, 100), Color.Yellow, Color.Black, 45);
Brush myBrush = new LinearGradientBrush(new Rectangle(145, 0, 200, 100), Color.Yellow, Color.Black,LinearGradientMode.BackwardDiagonal);
Graphics gobj = this.CreateGraphics();
gobj.FillPath(myBrush, gpath);
gobj.Dispose();
http://msdn.microsoft.com/zh-cn/library/7fswd1t7.aspx但是例子上的渐变效果是从圆心开始均匀变化到边界,而作为圆环需要的效果是:
从内圈-〉均匀变化到环中心线-〉再均匀变化到外圈轮廓,所以重点是下面这两句:--> blend.Positions = new float[] { 0, w / 2f / r, w / 1f / r, 1 };
这句定义了渐变色分成三段:
从0- w/2f/r是外圈到中心线,w/2f/r是中心线对圆形半径的百分比
从w/2f/r - w/1f/r是环形中心线到内圈,w/1f/r是内圆半径对外圆半径的百分比
最后w/1f/r - 1是内圈到圆心--> blend.Factors = new float[] { 0, 1, 0, 0 };
这句定义了上面说的三段分别采用什么样的渐变方式:
第一段:0-1,表示外圈到中心线是黑-〉黄,0:周边色,1:中心色
第二段:1-0,表示中心线到内圈是黄->黑
第三段:0-0,内圈里面的颜色,因为我们画的是环,所以用不上,随便定义,这里定的是黑色有了上面的定义,就可以画出从圆环中心线开始向两边变化的渐变圆,再用这样一个刷子去填充一段弧形,就得到最终的效果。你可以调整这些参数,看看不同的效果了解这些参数的含义,也可以把下面这句:
g.FillPath(brush, gPath);
改成:
g.FillPath(brush, bPath);
这样你就能看到画出整个完整的圆形出来是什么样子。这个效果也可以用RadialGradientBrush做出来,可以看下msdn上的相关说明,在最下面的示例关于Gradient Stop有比较清晰的图示,原理是一样的:
http://msdn.microsoft.com/zh-cn/library/ms635489(v=VS.85).aspx