|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
今天去面试,被问到C#中的new关键字,看了那么多的书对new关键字还是有一定认识,回来又把new复习了一遍,发现了许多以前还不知道的细节。<P> 近一段工夫因为项目必要一向专注于UI方面的编程,为了加倍友爱的将提醒信息出现给用户,我们必需对尺度的Windows动静提醒窗口举行处置。我们人人在WindowsXP下利用U盘、闪存等挪动存储设备,当插上或拔下这些设备时义务栏地区城市显现一个淡黄色背景,且具有标注款式的提醒窗口弹出来,如许的提醒即和睦又美妙,那末这究竟是怎样完成的呢?实在事理其实不庞大,该标注式提醒窗口自己就是一个不划定规矩窗体,当显现时它会将标注窗口的箭头指向分歧控件。以下图:
一样平常情形下的p标注式提醒窗口
屏幕边沿的标注式提醒窗口
1、手艺要点
就像本文开首所说的"标注式动静提醒窗口"实在就是一个具有不划定规矩形状的窗体,但却具有了加倍庞大的属性和举动。标注的箭头会依据分歧控件指向分歧的地位,当必要标注的控件过于靠近屏幕的边沿时,标注窗口还会主动调剂显现地位和箭头的是非和巨细。
我们为新创立的窗体取名为InfoWindow。在类的头部界说intArc和intArrowHeight两个公有变量,能够得当调剂它们的值来微调提醒窗口的地位和箭头的巨细与地位。
提醒窗口的箭头地位不过具有左上、右上、左下和右下四个大概性,我们为此界说了列举范例的变量ArrowLocation,依据提醒窗口位于屏幕的分歧地位,GetArrowLocation能够盘算提醒窗口的地位而且前往得当的ArrowLocation,界说以下:
……
publicenumArrowLocation
{
TopLeft,
TopRight,
BottomLeft,
BottomRight
}
SetInfoWindowRegion函数十分主要,它在Form.Load事务即装载和显现提醒窗体时被挪用,当盘算出新的提醒窗口的地位和箭头显现地位后,挪用SetBounds将更新后的地位和巨细使用到提醒窗口,gPath是GraphicsPath范例的公有变量,它暗示标注式窗口的不划定规矩图形路径,该图行路径也是依据提醒窗口的地位和箭头显现的地位来创立,gPath.AddArc办法用来绘制提醒窗口四个边角的弧度部分,和AddLine办法一同刻画出提醒窗口包含箭头的表面,统统停当后我们就用这个gPath工具传送给Region工具,当将这个Region工具赋给Form窗体的Region属性后,窗体就具有了标注式提醒窗口款式的不划定规矩形状了,部分代码以下:
privatevoidSetInfoWindowRegion()
{
if(!this.IsHandleCreated)
return;
System.Drawing.SizewindowSize=this.Size;
Point[]ArrowPoints=newPoint[3];
PointtopLeftPoint=Point.Empty;
PointbottomRightPoint=(Point)windowSize;
switch(this.GetArrowLocation)
{
caseArrowLocation.TopLeft:
……
caseArrowLocation.TopRight:
……
caseArrowLocation.BottomLeft:
……
caseArrowLocation.BottomRight:
……
}
……
……
if((this.GetArrowLocation==ArrowLocation.TopLeft)||
(this.GetArrowLocation==ArrowLocation.TopRight))
{
gPath.AddArc(topLeftPoint.X,rectY2-arcRadius,arcDia,arcDia,90,90);
gPath.AddLine(topLeftPoint.X,rectY2,topLeftPoint.X,rectY1);
gPath.AddArc(topLeftPoint.X,topLeftPoint.Y,arcDia,arcDia,180,90);
gPath.AddLine(rectX1,topLeftPoint.Y,ArrowPoints[0].X,topLeftPoint.Y);
gPath.AddLines(ArrowPoints);
gPath.AddLine(ArrowPoints[2].X,topLeftPoint.Y,rectX2,topLeftPoint.Y);
gPath.AddArc(rectX2-arcRadius,topLeftPoint.Y,arcDia,arcDia,270,90);
gPath.AddLine(bottomRightPoint.X,rectY1,bottomRightPoint.X,rectY2);
gPath.AddArc(rectX2-arcRadius,rectY2-arcRadius,arcDia,arcDia,0,90);
gPath.AddLine(rectX2,bottomRightPoint.Y,rectX1,bottomRightPoint.Y);
}
else
{
gPath.AddLine(rectX1,topLeftPoint.Y,rectX2,topLeftPoint.Y);
gPath.AddArc(rectX2-arcRadius,topLeftPoint.Y,arcDia,arcDia,270,90);
gPath.AddLine(bottomRightPoint.X,rectY1,bottomRightPoint.X,rectY2);
gPath.AddArc(rectX2-arcRadius,rectY2-arcRadius,arcDia,arcDia,0,90);
gPath.AddLine(rectX2,bottomRightPoint.Y,ArrowPoints[0].X,bottomRightPoint.Y);
gPath.AddLines(ArrowPoints);
gPath.AddLine(ArrowPoints[2].X,bottomRightPoint.Y,rectX1,bottomRightPoint.Y);
gPath.AddArc(topLeftPoint.X,rectY2-arcRadius,arcDia,arcDia,90,90);
gPath.AddLine(topLeftPoint.X,rectY2,topLeftPoint.X,rectY1);
gPath.AddArc(topLeftPoint.X,topLeftPoint.Y,arcDia,arcDia,180,90);
}
gPath.CloseFigure();
this.Region=newRegion(this.gPath);
}
ShowInfoWindow函数用来将提醒窗口显现出来,该函数必要将提醒窗口附着的控件和必要显现的文本传送过去。然后,AnchorPointFromControl依据控件的地位前往提醒窗口的箭头应当显现的坐标,代码以下:
publicstaticPointAnchorPointFromControl(ControlanchorControl)
{
if(anchorControl==null)
thrownewArgumentException();
PointcontrolLocation=anchorControl.Location;
System.Drawing.SizecontrolSize=anchorControl.Size;
if(anchorControl.Parent!=null)
controlLocation=anchorControl.Parent.PointToScreen(controlLocation);
returncontrolLocation+newSize(controlSize.Width/2,controlSize.Height/2);
}
PointToScreen标明将事情区点的地位映照成屏幕坐标一致举行盘算。上述代码最初以行申明提醒窗口的箭头显现在附着控件的中点。
将提醒窗口的背景色彩设置成Info,表面以下图:
我们发明如许的表面有点别扭,没错!由于提醒窗口短少玄色边框!以是,还必要在窗体的OnPaint事务中增加代码,以下:
protectedoverridevoidOnPaint(PaintEventArgse)
{
Penp=newPen(Color.Black,2);
e.Graphics.DrawPath(p,gPath);
base.OnPaint(e);
}
<P> 2、程序完成
启动VisualStudio2005,新建VisualC#的Windows使用程序项目,并取名为ShowInfoWindow,增加4个Button组件、1个Label组件、1个textBox组件和3个Panel组件,个中3个Button用来显现标注式动静提醒窗口并分离附着在三个组件之上,代码以下:
……
privateInfoWindowiw;
……
privatevoidbutton1_Click(objectsender,EventArgse)
{
iw=newInfoWindow();
iw.ShowInfoWindow(label1,"关于标签组件的提醒申明。");
}
privatevoidbutton3_Click(objectsender,EventArgse)
{
iw=newInfoWindow();
iw.ShowInfoWindow(button2,"关于按钮组件的提醒申明。");
}
privatevoidbutton4_Click(objectsender,EventArgse)
{
iw=newInfoWindow();
iw.ShowInfoWindow(textBox1,"关于文本框组件的提醒申明。");
}
然后,我们在项目中增加新Windows窗体,取名为InfoWindow,将InfoWindow的BackColor设为Info,FormBorderStyle设为None,将ShowIcon和ShowInTaskbar都设为False,在窗体上安排1个Label组件和1个Button组件,分离用来显现动静内容和封闭提醒窗口的操纵。详细完成请拜见文章附带的源码,这里不再胪陈。
3、总结
本文演示了标注式动静提醒窗口的创立和显现,使用GraphicsPath工具、Region工具和屏幕坐标映照等办法无效的完成了提醒窗口的表面和款式,提醒窗口能够主动附着在响应控件之上,而且依据附着控件在屏幕上的地位主动调剂提醒窗口箭头的地位和巨细。演示程序在WindowsXPSP2和.Net框架2.0情况下运转经由过程。在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。 |
|