ASP.NET编程:使用C#完成标注式动静提醒窗口
今天去面试,被问到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;
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.X,topLeftPoint.Y);
gPath.AddLines(ArrowPoints);
gPath.AddLine(ArrowPoints.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.X,bottomRightPoint.Y);
gPath.AddLines(ArrowPoints);
gPath.AddLine(ArrowPoints.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仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。 ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。 现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。 虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
页:
[1]