|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。按钮|控件 UI(UserInterface)编程在全部项目开辟过程当中是个很是主要的环节,任何好的办理计划若没有优秀的用户界面出现给终极用户,那末就算包括了开始进的手艺也不克不及算是好程序。UI编程表现在两个方面,一是计划优美的用户界面,再有就是切合年夜多半用户习气和易于利用的操纵流程,而制造出优美的、壮丽多彩的用户界面是赢得终极用户喜好的第一步。我们就以制造一个水晶款式的三维按钮为例来丰厚.Net界面素材库,为Windows窗体程序增添亮点。
1、手艺要点
不成否定的是,Windows编程已进进.Net时期,固然如今的编程平台仍旧是多家并存,可是微软的.Net框架类库已周全占有了支流位置。.Net框架为我们供应了十分丰厚的类、函数和办法,从桌面到Web它能够触及到编程的任何范畴,以致于能够完整保持Win32API的手工挪用,由于.Net框架已为我们筹办好了统统。特别是GDI+的公布,Win32程序员都应当十分分明,在VC6和Delphi5、6、7下要想绘制不划定规矩图形、计划共同款式的窗口控件是件何等不轻松的事变,我们必要前往以后设备指针,然后坐标映照,再挪用尺度的Win32GDI函数来举行绘制操纵,最初还得记住开释设备指针等一系列内存清算操纵,如今有了.Net类库,我们只需在控件的OnPaint事务中经由过程e.Graphics前往Graphics工具,然后创立一个自界说的刷子工具Brush来添补Graphics外表,再创立一个Region工具计划好我们必要的控件表面,并将其赋给控件的Region属性,在这个过程当中可使用GDI+为我们供应的丰厚的类和办法来计划竹苞松茂的控件表面,如许一个全新的控件就创立完成了。
我们的示例控件是一个水晶款式的三维按钮,计划如许一个按钮控件实在其实不庞大,我们只必要捕捉OnPaint事务,并在事务中依照分歧的按钮形态比如:鼠标进进、鼠标悬停、鼠标单击和鼠标分开等从头绘制按钮的表面。按钮的三维款式实践上就是三个矩形地区的叠加,即暗影位于最底层、按钮自己和最顶层的按钮头部红色泡泡部分,这三部分无效的叠加就制造成了一个活灵活现的水晶款式的按钮了,以下图所示:
在这个示例顶用到的对照关头的类是GraphicsPath、LinearGradientBrush和PathGradientBrush。我们已晓得,关于庞大的图形绘制操纵城市用到GraphicsPath工具,GraphicsPath为我们供应了一个十分便利的办理计划,它由一系列直线和曲线构成,经由过程创立庞大的闭合路径,我们能够轻松创立恣意不划定规矩图形;LinearGradientBrush和PathGradientBrush工具是我们乐成创立该示例程序的关头类,它们都承继于基类Brush,Brush工具界说用于添补图形外形的外部的工具。LinearGradientBrush依照肇端和停止坐标和突变的肇端和停止色彩来创立一个该类的实例,该类撑持双色突变和自界说多色突变,一切突变都是沿由矩形的宽度或两个点指定的直线界说的,默许情形下,双色突变是沿指定直线从肇端色到停止色的匀称程度线性夹杂,以是,依据这个特征我们使用该类来绘制按钮自己和按钮顶部的红色突变部分,部分代码以下:
//创立按钮自己的图形
Rectanglerc=newRectangle(btnOffset,btnOffset,this.ClientSize.Width-8-btnOffset,this.ClientSize.Height-8-btnOffset);
GraphicsPathpath1=this.GetGraphicsPath(rc,20);
LinearGradientBrushbr1=newLinearGradientBrush(newPoint(0,0),newPoint(0,rc.Height+6),Color.Blue,Color.White);
//创立按钮顶部的红色突变
Rectanglerc3=rc;
rc3.Inflate(-5,-5);//
rc3.Height=15;
GraphicsPathpath3=GetGraphicsPath(rc3,20);
LinearGradientBrushbr3=newLinearGradientBrush(rc3,Color.FromArgb(255,Color.White),Color.FromArgb(0,Color.White),LinearGradientMode.Vertical)
PathGradientBrush类经由过程突变添补GraphicsPath工具的外部,它能够从路径的中点到路径的外界限边沿的举行光滑的黑色突变,我们使用该类来创立按钮的暗影部分,CenterColor属性用来设定路径突变的中央处的色彩即玄色,SurroundColors数组用来设定路径中点绝对应的色彩的数组,部分代码以下:
Rectanglerc2=rc;
rc2.Offset(shadowOffset,shadowOffset);
GraphicsPathpath2=this.GetGraphicsPath(rc2,20);
PathGradientBrushbr2=newPathGradientBrush(path2);
br2.CenterColor=Color.Black;
br2.SurroundColors=newColor[]{SystemColors.ButtonFace};
//为了更传神,我们将突变停止色彩设定为窗体远景色彩,能够依据窗口的远景色彩得当调剂
创立完该工具的实例后,暗影图形的外部被添补为一个放射状的突变,大概读者会问,为何得用PathGradientBrush添补图形外部,而不必LinearGradientBrush呢?实在缘故原由很复杂,就是为了包管按钮下方和右方的暗影突变色彩和水平是分歧的,不然若还利用线性突变LinearGradientBrush,了局就是如许以下图:
三个Brush工具的实例br1、br2和br3创立完成后,我们必要依照暗影、按钮自己,最初是按钮顶部的红色突变部分如许的按次来绘制它们。挪用Graphics工具的FillPath办法分离利用三种分歧的Brush工具来添补GraphicsPath的外部,如许具有水晶款式的三维按钮就基础创立完成了。最初,我们再使用.Net二级缓存画图手艺将按钮和按钮上所显现的笔墨绘制到屏幕上。
<P> 2、完成
我们使用C#来制造水晶按钮控件。
起首启动VisualStudio2005,新建空缺办理计划,我们取名为:TestCrystalButton,然后在项目导航栏上右击鼠标增加新项目,为此办理计划增加新的C#Windows控件库,取名为MyControls。IDE会创立一个承继于UserControl名为UserControl1的类,修正代码使其承继自Button,并将原文件中一切援用UserControl1称号的中央都变动为CrystalButton,在项目导航栏中把UserControl1.cs改名为CrystalButton.cs,以下面一段代码:
namespaceMyControls
{
publicpartialclassCrystalButton:Button
{
publicCrystalButton()
{
InitializeComponent();
}
}
}
然后将InitializeComponent()办法中的
this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;
语句正文失落,由于从Button控件不成能有主动缩放功效,它必需依附于其父控件。在源文件头部增加对System.Drawing.Imaging和System.Drawing.Drawing2D程序集的援用。起首必要创立一个列举范例MouseActionType,当按钮必要绘制时会依据以后鼠标的地位举行分歧形态的绘制,以下面一段代码:
......
privateenumMouseActionType
{
None,
Hover,
Click
}
privateMouseActionTypemouseAction;
控件会捕捉OnMouseDown、OnMouseUp、OnMouseHover、OnMouseEnter和OnMouseLeave事务并将mouseAction变量设置为分歧的列举值,以便在OnPaint事务产生时依据mouseAction变量举行分歧形态的绘制。
控件的OnPaint事务是全部项目中最主要的代码段,它依照按钮构成的三部分分离举行绘制,最初将按钮的文本也一样绘制到按钮外表,一切操纵都利用了二级缓存画图手艺,代码以下:
protectedoverridevoidOnPaint(PaintEventArgse)
{
Graphicsg=e.Graphics;
g.Clear(SystemColors.ButtonFace);
Colorclr=this.BackColor;
intshadowOffset=8;
intbtnOffset=0;
switch(mouseAction)
{
caseMouseActionType.Click:
shadowOffset=4;
clr=Color.LightGray;
btnOffset=2;
break;
caseMouseActionType.Hover:
clr=Color.LightGray;
break;
}
g.SmoothingMode=SmoothingMode.AntiAlias;
//创立按钮自己的图形
Rectanglerc=newRectangle(btnOffset,btnOffset,this.ClientSize.Width-8-btnOffset,this.ClientSize.Height-8-btnOffset);
GraphicsPathpath1=this.GetGraphicsPath(rc,20);
LinearGradientBrushbr1=newLinearGradientBrush(newPoint(0,0),newPoint(0,rc.Height+6),clr,Color.White);
//创立按钮暗影
Rectanglerc2=rc;
rc2.Offset(shadowOffset,shadowOffset);
GraphicsPathpath2=this.GetGraphicsPath(rc2,20);
PathGradientBrushbr2=newPathGradientBrush(path2);
br2.CenterColor=Color.Black;
br2.SurroundColors=newColor[]{SystemColors.ButtonFace};
//为了更传神,我们将突变停止色彩设定为窗体远景色彩,能够依据窗口的远景色彩得当调剂
//创立按钮顶部红色突变
Rectanglerc3=rc;
rc3.Inflate(-5,-5);
rc3.Height=15;
GraphicsPathpath3=GetGraphicsPath(rc3,20);
LinearGradientBrushbr3=newLinearGradientBrush(rc3,Color.FromArgb(255,Color.White),Color.FromArgb(0,Color.White),LinearGradientMode.Vertical);
//绘制图形
g.FillPath(br2,path2);//绘制暗影
g.FillPath(br1,path1);//绘制按钮
g.FillPath(br3,path3);//绘制顶部红色泡泡
//设定内存位图工具,举行二级缓存画图操纵
buttonBitmapRectangle=newRectangle(rc.Location,rc.Size);
buttonBitmap=newBitmap(buttonBitmapRectangle.Width,buttonBitmapRectangle.Height);
Graphicsg_bmp=Graphics.FromImage(buttonBitmap);
g_bmp.SmoothingMode=SmoothingMode.AntiAlias;
g_bmp.FillPath(br1,path1);
g_bmp.FillPath(br3,path3);
//将region赋值给button
Regionrgn=newRegion(path1);
rgn.Union(path2);
this.Region=rgn;
//绘制按钮的文本
GraphicsPathpath4=newGraphicsPath();
RectangleFpath1bounds=path1.GetBounds();
RectanglercText=newRectangle((int)path1bounds.X+btnOffset,(int)path1bounds.Y+btnOffset,(int)path1bounds.Width,(int)path1bounds.Height);
StringFormatstrformat=newStringFormat();
strformat.Alignment=StringAlignment.Center;
strformat.LineAlignment=StringAlignment.Center;
path4.AddString(this.Text,this.Font.FontFamily,(int)this.Font.Style,this.Font.Size,rcText,strformat);
PentxtPen=newPen(this.ForeColor,1);
g.DrawPath(txtPen,path4);
g_bmp.DrawPath(txtPen,path4);
}
控件制造终了,编译该办理计划及控件项陌生成CrystalButton.dll,您能够在以后办理计划中增加利用该控件的Windows窗体程序项目,也能够在恣意办理计划中增加对该控件的援用,复杂到只需从工具箱中把CrystalButton拖拽到窗体上。
3、总结
.Net框架的GDI+加强型的图形图象绘制手艺为我们供应了壮大的图形图象绘制才能,它所包括的丰厚的类和办法为我们完成完整自界说控件表面供应了无力包管,不仅简化了程序代码还年夜小节省了编程工夫。
该示例控件和程序在VisualStudio2005TeamSuite、WindowsXPSP2下编译运转经由过程。简单的说:.net只有微软一家在做的,微软也不允许别人跟他做相同的工具,所以他就把需要的工具全部封装在.net的平台上了;而java是公开了。 |
|