《Visual C# NET案例教程》课件第10章_第1页
《Visual C# NET案例教程》课件第10章_第2页
《Visual C# NET案例教程》课件第10章_第3页
《Visual C# NET案例教程》课件第10章_第4页
《Visual C# NET案例教程》课件第10章_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章画图程序

10.1画图程序介绍10.2界面设计10.3图形绘制10.4图形的保存与恢复10.5打印图形10.6知识拓展10.7习题

实现一个画图程序,界面如图10-1所示。其主要功能有:

(1)可以用鼠标在画布中画图。

(2)利用图形种类中的单选按钮选择绘制圆形、矩形或直线。

(3)可以设置图形的颜色。

(4)可以保存图形到文件,以及从文件中读入数据并在画布中显示。

(5)可以对图形进行打印设置、打印预览与打印。10.1画图程序介绍图10-1画图程序运行效果10.2.1RadioButton控件

RadioButton(单选按钮)控件用于在一组相关的选项中选择一项,因此单选按钮控件总是成组出现的。通常将若干个RadioButton控件放置在一个GroupBox控件内组成一组。GroupBox控件又称分组框,它用于为其他控件提供可识别的分组。一组中的RadioButton控件在可选性上是互斥的,即当这组中的某个单选按钮控件被选中时,该组中的其他单选按钮控件将自动处于不选中状态。RadioButton的Checked属性值更改时触发CheckedChanged事件。RadioButton控件的常用属性见表10-1。10.2界面设计表10-1RadioButton控件的常用属性10.2.2GroupBox控件

GroupBox是一个容器控件,可以容纳其他控件,在软件界面设计布局中主要有两大功能:一是分组功能,它可以把完成同一功能的多个控件组合在一起;二是装饰功能,如果软件界面上的控件很多,通过若干个GroupBox控件的分组,整个界面就会显得整洁有序、条理清楚。10.2.3PictureBox控件

PictureBox用于显示图像的Windows图片框控件。在应用程序设计时一般使用PictureBox来显示位图、元文件、图标、JPEG、GIF或PNG文件中的图形。PictureBox常用属性见表10‑2。表10-2PictureBox常用属性

10.2.4ColorDialog对话框

ColorDialog对话框为用户提供了颜色选择功能。ColorDialog对话框的ShowDialog()方法以模态方式显示“颜色”对话框。ColorDialog的Color属性用于获取或设置用户选定的颜色值。

10.2.5界面设计实现

要实现的初始界面如图10-2所示。图10-2初始界面

PainterV1.0的实现步骤如下:

(1)新建一个Windows应用程序项目Painter。

(2)从工具箱的“容器”栏拖入一个Panel控件,在“属性”模板中设置其Dock属性为Top,使其占据窗体的上方空间。

(3)从工具箱的“公共控件”栏向Panel控件上拖放3个RadioButton,分别设置其Text属性为圆形、矩形与直线;向Panel控件上拖放一个Button,设置其Text属性为“设置颜色”;从“容器”栏向Panel控件上拖放一个Panel控件,设置其BackColor属性为红色;从“容器”栏向Panel控件上拖放一个GroupBox控件,并调整使其包含3个RadioButton,设置其Text属性为“图形种类”。

(4)从工具箱的“公共控件”栏向窗体拖放一个PictureBox控件,设置其Dock属性为Fill,使其能填充占满窗体的剩余空间。

(5)从工具箱的“对话框”栏向窗体拖放一个ColorDialog控件。该控件运行时不可见,所以出现在设计窗体的下方。

(6)双击“设置颜色”按钮,在按钮的单击事件中编写如下代码:

if(colorDialog1.ShowDialog()==DialogResult.OK)

{

panel2.BackColor=colorDialog1.Color;

}10.3.1Graphics类

Graphics类封装一个GDI+ 绘图图面,提供将对象绘制到显示设备的方法。Graphics与特定的设备上下关联。画图方法都被包括在Graphics类中,在绘制任何对象(例如Circle、Rectangle)时,首先要创建一个Graphics类实例,这个实例相当于建立了一块画布,有了画布才可以用各种画图方法进行绘图。因此绘制图形必须先得到一个Graphics类的实例对象,然后通过引用其提供的方法与属性成员,完成绘制线条和形状、呈现文本或显示与操作图像等功能。10.3图形绘制创建Graphics对象的三种方法:

方法一、利用控件或窗体的Paint事件中的PainEventArgs对象。

方法二、调用控件或窗体的CreateGraphics方法。

方法三、调用Graphics类的FromImage静态方法,通过从Image继承的任何对象来创建Graphics对象。在更改已存在的图像时,通常会使用此方法。

1.利用Paint事件处理程序中的PaintEventArgs对象

最常用的方法是从窗体或控件的Paint事件获得Graphics对象的引用。

在一个Windows应用程序中,每当窗体或控件需要重新绘制(例如窗体从最小状态恢复,或将叠加在窗体上的另一窗体移开)时,会自动触发该窗体或控件的Paint事件。

在窗体或控件的Paint事件中,系统传递一个PaintEventArgs类型参数,该参数含有一个属性成员Graphics;指示当前窗体或控件的绘图平面。为控件编制绘图程序时,通常从Paint事件的PaintEventArgs中获取Graphics对象的引用。

【例10-1】在Paint事件中画线。

新建一个Windows项目,为Form1的Paint事件编写如下代码:

privatevoidForm1_Paint(objectsender,System.Windows.

Forms.PaintEventArgse)

{

Graphicsg=e.Graphics;

g.DrawLine(Pens.Red,0,0,100,100);

}

2. CreateGraphics方法

CreateGraphics方法可获取对Graphics对象的引用,该对象表示该控件或窗体的绘图表面。

【例10-2】创建一个Graphics对象,并画直线。

privatevoidbutton1_Click(objectsender,EventArgse)

{

Graphicsg;

g=this.CreateGraphics();

g.DrawLine(Pens.Green,0,150,600,150);

}

注意:此时以this所代表的窗体为画布,也可以通过引用其他控件对象,创建以控件对象为画布的Graphics对象。

3.从Image对象创建

调用Graphics.FromImage方法,可以从由Image类派生的任何对象创建图形对象。

下面语句说明如何使用FromImage创建Graphics对象:

BitmapmyBitmap=newBitmap(@“C:\myPic.bmp”);

Graphicsg=Graphics.FromImage(myBitmap);

注意:此时以文件“myPic.bmp”为画布,使用Graphics对象g进行绘制图形时,其图形是绘制在文件“myPic.bmp”上的。Graphics类提供的常用的方法见表10-3。表10-3Graphics常用方法10.3.2图形坐标系统

C# 图形是由像素组成的,像素是屏幕上的小点,可以用来设置特定的颜色,每个像素都由从零开始的一对数字(坐标)来标识。

GDI + 使用的坐标系,不同于数学使用的以中心为起点的坐标系,见图10-3(a)。GDI + 以窗体对象的左上角为坐标原点,其坐标为(0,0),水平坐标为x,往右递增;垂直坐标为y,往下递增,如图10-3(b)所示。图10-3GDI + 中的坐标系下面语句在窗体的(0,0)到(200,200)之间画一条线,结果如图10-4(a)所示。

privatevoidForm1_Paint(objectsender,System.Windows.

Forms.PaintEventArgse)

{

e.Graphics.DrawLine(Pens.Red,0,0,100,100);

}

Graphics提供了TranslateTransform函数,可以移动坐标原点。下面代码先用Translate

Transform(50,50)将坐标原点定在(50,50),然后用红色在(0,0)到(100,100)之间画一条直线。效果见图10-4(b)。

privatevoidForm1_Paint(objectsender,System.Windows.

Forms.PaintEventArgse)

{

e.Graphics.TranslateTransform(50,50);

e.Graphics.DrawLine(Pens.Red,0,0,100,100);

}图10-4画直线10.3.3位置与大小

GDI + 引入了几个结构来表示位置与大小。

1. Point结构

Point类型代表一个点,有两个属性X和Y分别表示X坐标和Y坐标。

下面语句构造了一个X为10、Y为20的点:

Pointp=newPoint(10,20);

2. Size结构

Size类型代表大小,有Width和Height属性,分别表示宽与高。

下面语句构造了一个宽为20、高为50的Size:

Sizes=newSize(20,50);

3. Rectangle结构

Rectangle既有位置又有大小,可用一个Point和Size或四个整数来构造,下面列出其两个构造函数:

(1) publicRectangle(Pointlocation,Sizesize);

参数含义如下:

location:它表示矩形区域的左上角。

Size:它表示矩形区域的宽度和高度。

下面语句构造了一个左上角在点(10,20)处,宽为20,高为50的矩形。

Pointp=newPoint(10,20);

Sizes=newSize(20,50);

Rectangler=newRectangle(p,s);

(2) publicRectangle(intx,inty,intwidth,intheight);

参数含义如下:

x:矩形左上角的x坐标。

y:矩形左上角的y坐标。

width:矩形的宽度。

height:矩形的高度。

下面语句同样构造了一个左上角在点(10,20)处,宽为20,高为50的矩形:

Rectangler2=newRectangle(10,10,20,50);

Rectangle对象具有用于处理和收集矩形相关信息的方法和属性。例如,Inflate和Offset方法可改变该矩形的大小和位置。IntersectsWith方法可显示矩形是否与另一给定的矩形相交,Contains方法可显示一个给定的点是否在该矩形内。

与Point、Size和Rectangle相对应,系统还定义了PointF、SizeF和RectangleF几种结构,PointF、SizeF和RectangleF几种结构,用于坐标值不是整数值的情况,其参数为float类型,而Point、Size和Rectangle的参数都是int类型。10.3.4Pen类

Pen类提供了类似现实世界中绘图画笔的功能,可用于绘制线条、曲线以及勾勒形状轮廓。Pen类提供了几种构造函数,下面列出了常用的两种:

(1)用指定颜色初始化Pen类的新实例:

publicPen(Colorcolor);

参数含义如下:

color:Color结构,Pen对象的颜色。

下面语句创建了一支黑色笔:

PenmyPen=newPen(Color.Black);

(2)用指定的Color和Width属性初始化Pen类的新实例:

publicPen(Colorcolor,floatwidth);

参数含义如下:

color:Color结构,Pen对象的颜色。

width:Pen对象的宽度的值。

下面语句创建了一支宽度为5的黑色笔:

PenmyPen2=newPen(Color.Black,5);

创建了Pen后,就可以在绘图中加以使用,下面的语句演示了Pen的使用:

privatevoidForm1_Paint(objectsender,System.Windows.Forms.

PaintEventArgse)

{

Graphicsg=e.Graphics;

PenmyPen=newPen(Color.Black,5);

g.DrawLine(myPen,10,20,200,100);

}该例中,先创建了一个宽度为5的黑色笔,然后在窗口的点(10,20)到(200,100)处以该笔画一条直线。

可以利用Pen对象的属性来为直线设置更多属性,例如DashStyle可用于指定直线的特性。下面的示例绘制了一条从(100,50)到(300,80)的点划线:

myPen.DashStyle=DashStyle.Dash;

myGraphics.DrawLine(myPen,100,50,300,80);

Pen对象的StartCap和EndCap属性指定线条两端的外观;两端可以是平的、正方形的、圆形的、三角形的或自定义形状。10.3.5颜色

1.系统定义的颜色

要获得Color实例,最简单的方法是通过Color结构的静态属性获得一个系统定义好的颜色,这些颜色包括Red、Green、Blue、Orange、Aquamarine、Tomato等,可在绘图时直接使用。

如下面语句用系统提供的黑色Color.Black来创建一支黑色笔:

PenmyPen=newPen(Color.Black);

2.用户定义的颜色

Color.FromArgb方法可创建用户定义的颜色,该函数有几种重载方式,下面介绍两种:

(1)从指定的3位颜色值(红色、绿色和蓝色)创建Color结构:

publicstaticColorFromArgb(intred,intgreen,intblue);

参数含义如下:

red:新Color结构的红色分量值。有效值为从0到255。

Green:新Color结构的绿色分量值。有效值为从0到255。

Blue:新Color结构的蓝色分量值。有效值为从0到255。

返回值:此方法创建的Color结构。

每个数字均必须是从0到255之间的一个整数,其中0表示没有该颜色,而255则为所指定颜色的完整饱和度。因此,Color.FromArgb(0,0,0)呈现为黑色,而Color.FromArgb(255,255,255)呈现为白色。

下列语句生成一种用户定义的颜色,该颜色大致为略带蓝色的灰色:

ColormyColor;

myColor=Color.FromArgb(23,56,78)

(2)从四个ARGB分量(alpha、红色、绿色和蓝色)值创建Color结构:

publicstaticColorFromArgb(intalpha,intred,intgreen,intblue);

参数含义如下:

alpha:alpha分量。有效值为从0到255。

red:红色分量。有效值为从0到255。

green:绿色分量。有效值为从0到255。

blue:蓝色分量。有效值为从0到255。

返回值表示此方法创建的Color结构。

Alpha表示所呈现图形后面的对象的透明度。在程序中经常需要对图像进行透明处理,使下层的图形能够显现。如果绘图时需要绘制一个透明图像,只要在实例化Pen或Brush对象时,将笔刷的颜色Alpha成份值设置得小于255即可(0代表透明,255代表不透明)。下面语句说明了透明处理的使用,结果如图10-5所示。

privatevoidForm1_Paint(objectsender,System.Windows.Forms.PaintEventArgse)

{

e.Graphics.FillRectangle(Brushes.Blue,100,50,80,40);

e.Graphics.FillEllipse(Brushes.Red,80,20,80,40);

SolidBrushmyBrush=newSolidBrush(Color.FromArgb(100,Color.Red));

e.Graphics.FillEllipse(myBrush,120,70,80,40);

}图10-5透明处理10.3.6绘制矩形和多边形

Graphics提供了用于绘制矩形的函数DrawRectangle,该函数有三种重载方式:

publicvoidDrawRectangle(Penpen,Rectanglerect);

publicvoidDrawRectangle(Penpen,intx,inty,intwidth,intheight);

publicvoidDrawRectangle(Penpen,floatx,floaty,floatwidth,floatheight);参数含义如下:

pen:Pen对象,它确定矩形的颜色、宽度和样式。

Rect:表示要绘制的矩形的Rectangle结构。

X:要绘制的矩形的左上角的x坐标。

Y:要绘制的矩形的左上角的y坐标。

Width:要绘制的矩形的宽度。

Height:要绘制的矩形的高度。

下面的语句绘制了一个矩形,其左上角位于(100,50),宽度为80,高度为40:

myGraphics.DrawRectangle(myPen,100,50,80,40);下面语句绘制了与上面同样的一个矩形,该例中选创建一个矩形,然后把该矩形绘制出来:

RectanglemyRectangle=newRectangle(100,50,80,40);

myGraphics.DrawRectangle(myPen,myRectangle);10.3.7绘制椭圆

Graphics对象提供DrawEllipse方法,椭圆由其边框指定。该函数有多种重载方式,下面列出其中两种:

(1) publicvoidDrawEllipse(Penpen,intx,inty,intwidth,intheight);

参数含义如下:

pen:Pen对象,它确定椭圆的颜色、宽度和样式。

X:定义椭圆的边框的左上角的x坐标。

Y:定义椭圆的边框的左上角的y坐标。

Width:定义椭圆的边框的宽度。

Height:定义椭圆的边框的高度。

下面语句绘制了一个椭圆,左上角位于(100,50),边框的宽度为80,高度为40:

myGraphics.DrawEllipse(myPen,100,50,80,40);

(2) publicvoidDrawEllipse(Penpen,Rectanglerect);

参数含义如下:

pen:Pen对象,它确定椭圆的颜色、宽度和样式。

Rect:Rectangle结构,它定义椭圆的边界。

下面的示例同样绘制了一个椭圆,左上角位于(100,50),边框的宽度为80,高度为40:

RectanglemyRectangle=newRectangle(100,50,80,40);

myGraphics.DrawEllipse(myPen,myRectangle);10.3.8鼠标事件

当用户操作鼠标时,将触发一些鼠标事件。这些事件的发生顺序如下:

MouseEnter:当鼠标指针进入控件时触发的事件。

MouseMove:当鼠标指针在控件上移动时触发的事件。

MouseHover/MouseDown/MouseWheel:MouseHover事件当鼠标指针悬停在控件上时被触发;MouseDown事件在用户按下鼠标键时被触发;MouseWheel事件在拨动鼠标滚轮并且控件有焦点时被触发。

MouseUp:当用户在控件上按下的鼠标键释放时触发MouseUp事件。

MouseLeave:当鼠标指针离开控件时触发MouseLeave事件。10.3.9画图实现

程序首先定义存放图形的结构,根据图形包含的信息,设计了一个如下的Graph类:

publicclassGraph

{

publicPointstartPoint,endPoint; //图形的开始与结束点

publicColorcolor; //图形颜色

publicStringtype;//图形类型,有circle,rect,line3种

}程序使用ArrayList对象存放多个图形对象;当画布上鼠标按下时,记下图形的初始坐标,并设置鼠标拖放状态标记isDragging为true;当画布上鼠标弹起时,如果鼠标处于拖放状态,记下图形的终点坐标。并创建好相应的图形对象,存放到ArrayList对象中,然后调用pictureBox1的Invalidate方法使画布重绘。画布重绘时执行画布的paint事件,把ArrayList对象中的图形绘制出来。PainterV2.0的实现步骤如下:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Text;

usingSystem.Windows.Forms;

usingSystem.Collections;

namespacePainter

{

publicpartialclassForm1:Form

{

PointstartPoint,endPoint; //图形开始与结束点的位置ArrayListlist=newArrayList(); //存放图形的容器

boolisDragging=false; //是否处于鼠标按下的拖放状态

publicForm1()

{

InitializeComponent();

}

//单击“设置颜色”按钮事件

privatevoidbtnColor_Click(objectsender,EventArgse)

{

if(colorDialog1.ShowDialog()==DialogResult.OK)

{

panel2.BackColor=colorDialog1.Color;

}

}

//画布控件上鼠标按钮按下事件privatevoidpictureBox1_MouseDown(objectsender,MouseEventArgse)

{

startPoint=newPoint();

startPoint.X=e.X;

startPoint.Y=e.Y;

isDragging=true;

}

//画布控件上鼠标按钮弹起事件

privatevoidpictureBox1_MouseUp(objectsender,MouseEventArgse)

{

if(isDragging)

{

endPoint=newPoint();

endPoint.X=e.X;endPoint.Y=e.Y;

isDragging=false;

//构建图形对象

Graphgraph=newGraph();

graph.startPoint=startPoint;

graph.endPoint=endPoint;

graph.color=panel2.BackColor;

if(rbCircle.Checked)

graph.type="circle";

elseif(rbRect.Checked)

graph.type="rect";

elseif(rbLine.Checked)

graph.type="line";list.Add(graph); //把图形对象加入到容器

pictureBox1.Invalidate(); //使画布重绘

}

}

//画布的paint事件,画容器中存放的图形对象

privatevoidpictureBox1_Paint(objectsender,PaintEventArgse)

{

Graphicsg=e.Graphics; //取得画布的Graphics对象

Rectanglerect1;

foreach(Graphgraphinlist) //遍历图形对象容器中的每个对象

{

Penpen=newPen(graph.color,1);

intx,y,width,height;x=graph.startPoint.X>=graph.endPoint.X?graph.endPoint.X:graph.startPoint.X;

y=graph.startPoint.Y>=graph.endPoint.Y?graph.endPoint.Y:graph.startPoint.Y;

width=Math.Abs(graph.endPoint.X-graph.startPoint.X);

height=Math.Abs(graph.endPoint.Y-graph.startPoint.Y);

rect1=newRectangle(x,y,width,height);

switch(graph.type)

{

case"line":g.DrawLine(pen,graph.startPoint.X,graph.startPoint.Y,graph.endPoint.X,graph.endPoint.Y);

break;

case"rect":

g.DrawRectangle(pen,rect1);

break;case"circle":

g.DrawEllipse(pen,rect1);

break;

}

}

}

}

//定义图形对象

publicclassGraph

{

publicPointstartPoint,endPoint; //图形的开始与结束点

publicColorcolor; //图形颜色

publicStringtype; //图形类型,有circle、rect、line3种

}

}10.4.1用于文件操作的类

在编写一个较完整的应用程序时,通常要涉及到对系统和用户的信息进行存储、读取、修改等操作。C# 语言提供了多个可以用于文件操作的类,见表10‑4,这些类位于System.IO名称空间。10.4图形的保存与恢复表10-4文件操作的类10.4.2StreamWriter类

StreamWriter用于写入文本文件。StreamWriter类有很多种构造函数用来实例化对象,例如:

StreamWritersw=newStreamWriter(@“C:\temp\ReadMe.txt”);

StrearnWritersw=newStreamWriter(@“C:\temp\ReadMe.txt”,true,Encoding.ASCII);

第二个构造函数的第二个参数为true或false,表示文件是否应以追加的方式打开。第三个参数表示写入文件时的编码方法,编码方法取值及含义见表10-5。表10-5编码方法取值及含义另外,也可以把StreamWriter关联到一个FileStream上,以获得打开文件的更多控制选项。

FileStreamfs=newFileStream(@“C:\temp\ReadMe.txt”,

FileMode.CreateNew,FileAccess.Write,FileShare.Read);

StreamWritersw=newStreamWriter(fs);

表10-6描述了StreamWriter类的一些常用的方法。表10-6StreamWriter类常用方法提示:

●与其他流类一样,应在使用后调用Close()方法关闭StreamWriter。如果没有这样做,就会致使文件一直锁定,不能被其他过程使用。

●使用流完成所有写操作之后,应调用Flush()方法清除该流的所有缓冲区,并把缓冲区中的数据写入到文件中去,避免数据遗失。【例10-3】向c:\\Log.txt文件写入“你好”、“欢迎”。

运行结果如图10-6所示。图10-6例10-3运行结果10.4.3StreamReader类

StreamReader用于读取文本文件。StreamReader类有很多种构造函数用来实例化对象。最简单的构造函数是使用StreamReader来直接连接文件,例如:

StreamReadersr=newStreamReader(@“C:\temp\ReadMe.txt”);

StreamReadersr=newStreamReader(@“C:\temp\ReadMe.txt”,Encoding.ASCII);

第二个构造函数的第二个参数是告诉StreamReader该文件使用哪种编码方法。其取值见表10-5。另外,构造函数也可以不提供要读取的文件名,而是提供另一个流,可以把StreamReader关联到FileStream上,其优点是可以显示是否创建文件和共享许可。如果直接把StreamReader关联到文件上,就不会有这样的优点了。例如:

FileStreamfs=newFileStream(@“C:\temp\ReadMe.txt”,

FileMode.Open,FileAccess.Read,FileShare.None];

StreamReadersr=newStreamReade(fs);

StreamReader类常用方法见表10-7。表10-7StreamReader类常用方法【例10-4】读取并显示C:\\Log.txt文件的内容。运行结果如图10-7所示。图10-7例10-4运行结果10.4.4OpenFileDialog对话框

OpenFileDialog对话框是“打开文件”对话框,OpenFileDialog的ShowDialog()方法用于以模态方式显示“打开文件”对话框。OpenFileDialog的常用属性有:

● DefaultExt:默认的扩展名。

● Multiselect:是否允许多选文件。

● FileName:文件对话框中选定的文件名的字符串。

● FileNames:该属性用于保存对话框中选择的所有文件的文件名(含路径)。FileNames属性是一个字符串类型的数组,该属性是只读属性。

● MultiSelect:该属性用于决定是否能对文件进行多选。这是一个逻辑类型的属性,true表示可以在对话框中一次选择多个文件,false表示一次只允许选择一个文件。

●Filter:该属性是一个文件筛选器,根据该属性值的设置,可以决定在对话框的“文件类型”下拉列表框中提示哪些类型的文件,在选择文件列表框中显示哪些类型的文件。假如打开文件对话框对象dlg,仅允许打开jpg、bmp、gif文档,则设置Filter值的代码如下:

Dlg.Filter="图像文件|*.jpg;*.bmp;*.gif";

● Title:文件对话框标题。10.4.5SaveFileDialog对话框

SaveFileDialog对话框是“保存文件”对话框,如果软件提供保存文件的功能,经常需要允许用户确定文件保存的位置和名称,此时就需要使用SaveFileDialog对话框。

SaveFileDialog的ShowDialog()方法用于以模态方式显示“保存文件”对话框。

SaveFileDialog常用属性为:

● FileName:文件对话框中选定的文件名的字符串。

● Title:文件对话框标题。

● Filter:当前文件名筛选器字符串,该字符串决定对话框的“另存为文件类型”或“文件类型”框中出现的选择内容。10.4.6图形的保存与恢复的实现

打开前面完成的PainterV2.0项目,向Panel1面板拖放2个按钮,分别设置其Text为“保存”与“载入”。为它们的单击事件编写代码如下:

PainterV3.0的实现步骤如下://保存按钮单击事件

privatevoidbtnSave_Click(objectsender,EventArgse)

{

if(saveFileDialog1.ShowDialog()!=DialogResult.OK)

return;

stringfileName=saveFileDialog1.FileName;

StreamWriterwriter=newStreamWriter(fileName);

foreach(Graphgraphinlist)

{

stringstr="";

str=str+graph.startPoint.X+","+graph.startPoint.Y+","+graph.endPoint.X+","+graph.endPoint.Y+","+graph.color.ToArgb().

ToString()+","+graph.type;writer.WriteLine(str);

}

writer.Close();

}

//载入按钮单击事件

privatevoidbtnLoad_Click(objectsender,EventArgse)

{

if(openFileDialog1.ShowDialog()!=DialogResult.OK)

return;

stringfileName=openFileDialog1.FileName;

list.Clear();

stringstrLine;

StreamReadersr=newStreamReader(fileName,Encoding.Default);try

{

strLine=sr.ReadLine();

while(strLine!=null)

{

//根据文件中的每行数据构建一个图形对象

string[]str=newstring[6];

str=strLine.Split(newchar[]{','});

Graphgraph=newGraph();

graph.startPoint.X=Convert.ToInt32(str[0]);

graph.startPoint.Y=Convert.ToInt32(str[1]);

graph.endPoint.X=Convert.ToInt32(str[2]);

graph.endPoint.Y=Convert.ToInt32(str[3]);graph.color=Color.FromArgb(Convert.ToInt32(str[4]));

graph.type=str[5];

list.Add(graph);

strLine=sr.ReadLine();

}

}

finally

{

sr.Close();

}

pictureBox1.CreateGraphics().Clear(Color.White);//清空画布

pictureBox1.Invalidate(); //重绘画布

}为了方便打印,系统提供了几个打印控件,打印控件位于工具箱的打印栏,如图10-8所示。10.5打印图形图10-8打印控件10.5.1PrintDocument控件

打印最主要的控件是PrintDocument控件,其主要事件见表10-8,主要方法见表10-9。表10-8PrintDocument事件表10-9PrintDocument方法:实现打印的基本步骤如下:

(1)向窗体拖放一个PrintDocument控件。

(2)为PrintDocument控件的PrintPage事件编写代码,该事件中系统会传入代表被打印的页面Graphics,向Graphics绘制图形或输出文字,也就是在打印的页面输出。

(3)加入一个按钮,单击时调用PrintDocument控件的Print方法启动打印。10.5.2PrintPreviewDialog控件

使用PrintPreviewDialog控件可以在打印之前进行预览打印文档,可显示打印预览效果。要显示一个打印预览,实现的步骤为:

(1)向窗体拖放一个PrintPreviewDialog控件。

(2)设置PrintPreviewDialog控件的Document属性为PrintDocument控件。

(3)加入一个按钮,单击时调用PrintDocument控件的ShowDialog()弹出打印预览窗口。10.5.3PrintDialog控件

使用PrintDialog控件选择和配置打印机。注意设置PrintDialog的Document属性,可设定打印内容对象。

10.5.4PageSetupDialog控件

PageSetupDialog用来设置打印页面设置,如调节边界和边距、页眉和页脚以及横向或纵向。

实现打印页面设置的步骤为:

(1)向窗体拖放一个PageSetupDialog控件。

(2)设置PageSetupDialog控件的Document属性为PrintDocument控件。

(3)加入一个按钮,单击时调用PageSetupDialog控件的ShowDialog()弹出页面设置窗口。

设置后的信息可以通过PageSetupDialog控件的DefaultPageSettings或者PageSettings成员对象读取。【例10-5】打印控件的使用,运行效果如图10-9所示。图10-9运行效果①新建一个Windows项目。

②设计界面,如图10-10所示。图10-10设计界面③主要代码。

//画图事件

privatevoidForm1_Paint(objectsender,PaintEventArgse)

{

Graphicsg=e.Graphics;

g.DrawRectangle(Pens.Blue,10,10,100,100);

}

//打印

privatevoidbtnPrint_Click(objectsender,EventArgse)

{

printDocument1.Print();

}

//打印预览

privatevoidbtnPrintview_Click(objectsender,EventArgse){

printPreviewDialog1.ShowDialog();

}

//打印机设置

privatevoidbtnPrinterSetup_Click(objectsender,EventArgse)

{

printDialog1.ShowDialog();

}

//打印设置

privatevoidbtnPageSetup_Click(objectsender,EventArgse)

{

pageSetupDialog1.ShowDialog();

}

//窗体加载privatevoidForm1_Load(objectsender,EventArgse)

{

printPreviewDialog1.Document=printDocument1;

printDialog1.Document=printDocument1;

pageSetupDialog1.Document=printDocument1;

}

//打印事件

privatevoidprintDocument1_PrintPage(objectsender,System.Drawing.Printing.

PrintPageEventArgse)

{

Graphicsg=e.Graphics;

g.DrawRectangle(Pens.Blue,10+e.MarginBounds.Left,10+e.MarginBounds.Top,100,100);

}10.5.5图形打印的实现

PainterV4.0的实现步骤如下:

(1)打开PainterV3.0项目,从工具箱向窗体拖动一个PrintDocument控件。

(2)为PrintDocument控件的PrintPage事件编写代码:privatevoidprintDocument1_PrintPage(objectsender,System.Drawing.Printing.PrintPageEventArgse)

{

//e.Graphics打印页面的Graphics对象

//PageSettings打印设置信息

drawList(e.Graphics,pageSetupDialog1.PageSettings.Margins.Left,pageSetupDialog1.PageSettings.Margins.Top);

}

//left—打印的左边距top—打印的上边距

privatevoiddrawList(Graphicsg,intleft,inttop)

{

Rectanglerect1;

foreach(Graphgraphinlist)//遍历图形对象容器中的每个对象

{Penpen=newPen(graph.color,1);

intx,y,width,height;

x=graph.startPoint.X>=graph.endPoint.X?graph.endPoint.X:graph.startPoint.X+left;

y=graph.startPoint.Y>=graph.endPoint.Y?graph.endPoint.Y:graph.startPoint.Y+top;

width=Math.Abs(graph.endPoint.X-graph.startPoint.X);

height=Math.Abs(graph.endPoint.Y-graph.startPoint.Y);

rect1=newRectangle(x,y,width,height);

switch(graph.type)

{

case"line":

g.DrawLine(pen,graph.startPoint.X+left,graph.startPoint.Y+top,graph.endPoint.X+left,graph.endPoint.Y+top);

break;

case"rect":

g.DrawRectangle(pen,rect1);

break;

case"circle":

g.DrawEllipse(pen,rect1);

break;

}

}

}由于画图在pictureBox上输出,打印在画布上输出,两者代码大致相同,因此利用drawList方法可实现代码重用,pictureBox的Paint事件改写如下:

privatevoidpictureBox1_Paint(objectsender,PaintEventArgse)

{

drawList(e.Graphics,0,0);

}

(3)加入一个按钮,Text实现设为“打印”,为其单击事件编写代码。

privatevoidbtnPrint_Click(objectsender,EventArgse)

{

printDocument1.Print();

}

(4)向窗体拖动一个PageSetupDialog控件,设置其Document属性为PrintDocument控件;加入一个按钮,Text实现设为“打印设置”,为其单击事件编写代码:

privatevoidbtnPrinSetup_Click(objectsender,EventArgse)

{

pageSetupDialog1.ShowDialog();

}

(5)向窗体拖动一个PrintPreviewDialog控件,设置其Document属性为PrintDocument控件;加入一个按钮,Text实现设为“打印预览”,为其单击事件编写代码:

privatevoidbtnPrinPreview_Click(objectsender,EventArgse)

{

printPreviewDialog1.ShowDialog();

}10.6.1File类

File类既可以用来创建、复制、删除、移动和打开文件,也可用来获取和设置文件属性或有关文件创建、访问及写入操作的时间信息。File类是无状态的,它的成员函数全部都是静态的,每次执行前都要进行安全检查。10.6知识拓展

1.文件复制

File类的Copy方法用于将现有文件复制到新文件。方法原型为:

publicstaticvoidCopy(stringsourceFileName,stringdestFileName)

其中,sourceFileName为要复制的文件,destFileName为目标文件的名称。它不能是一个目录或现有文件。

2.文件删除

File类的Delete方法用于删除指定的文件。如果指定的文件不存在,则不引发异常。方法定义:

publicstaticvoidDelete(stringpath)

参数:path为要删除的文件的名称。

3.文件移动

File类的Move方法用于将指定文件移到新位置,并提供指定新文件名的选项。方法原型为:

publicstaticvoidMove(stringsourceFileName,stringdestFileName)

参数:sourceFileName为要移动的文件的名称,destFileName为文件的新路径。【例10-6】使用File类进行文件的删除、创建等操作。

usingSystem;

usingSystem.IO;

publicclassFileTest

{

publicstaticvoidMain()

{

stringpath=@"C:\MyTest.txt";

//判断文件是否存在

if(File.Exists(path))

{

//如果文件存在则删除

File.Delete(path);

} //创建文件

File.Create(path);

//读取文件的各种属性

Console.WriteLine("文件名:{0}",path);

Console.WriteLine("文件被创建时间:{0}",File.GetCreation

Time(path));

Console.WriteLine("文件最后一次被访问的时间:{0}",File.

GetLastAccessTime(path));

Console.WriteLine("文件最后一次被修改的时间:{0}",File.

GetLastWriteTime(path));

//把文件设置为隐藏文件

File.SetAttributes(path,File.GetAttributes(path)|FileAttributes.Hidden);

Console.WriteLine("文件{0}被设置为隐藏文件。",path);

}

}运行结果如图10-11所示。图10-11例10-6运行结果10.6.2FileInfo类

FileInfo类与File类具有相同的功能和用途,它们的成员函数也大致相同。但FileInfo类是有状态的,其成员函数都不是静态的,使用时必需先实例化成一个对象,然后通过对象进行调用。如果使用同一个对象执行多个操作时,使用FileInfo比较有效,因为对该对象所关联文件的安全检查仅在对象被构造时执行一次,其后无论该对象调用了多少方法,都无需再进行安全检查了。

表10-10描述了FileInfo类的一些常用属性。表10-10FileInfo类常用属性表10-11列出了FileInfo类的一些常用方法及其功能。表10-11FileInfo类常用方法【例10-7】输出C:\Windows目录下的所有文件信息。

usingSystem;

usingSystem.IO;

classClass1

{

s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论