您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第1章-C#图形开发基础.
第1章C#图形开发基础1.1Windows图形1.2C#图形开发基础1.3C#画图初步1.1Windows图形1.1.1图形子系统基本原理Windows操作系统中包含了一个图形子系统,专门用于管理各种图形输出设备,包括显示器,打印机,绘图仪等。由于Windows系统启用保护模式,应用程序没有权限直接访问计算机硬件,因此都必须调用Windows的图形子系统来操作图形设备。图1.1所示的就是Windows环境下图形软件的基本原理。()应用程序VB,DELPHI,C#...显卡图形API()GDI32.DLLWindows操作系统显卡驱动程序其他图形设备驱动程序显存显示器打印任务队列打印机驱动程序1.1.1图形子系统基本原理计算机中打开“控制面板”,打开其中的“显示”项目,在“显示属性”对话框中切换到“设置”标签页,点击其中的“高级”按钮,则能显示“监视器”的属性对话框,切换到“监视器”标签页,则显示如图1.2所示的设置,可以看到“屏幕刷新频率”的设置。1.1.2图形设备上下文1.句柄对Windows编程有所了解的读者应该知道,WindowsAPI是一个个C语言样式的函数,应用程序访问大部分的操作系统资源是通过一种叫句柄的整数类型数据。2.图形设备上下文句柄应用软件进行图形操作时也得使用API函数申请一个图形设备上下文句柄,以后所有的图形操作都是针对这个句柄来进行的,应用软件完成图形操作后一定要使用API释放这个图形设备上下文句柄。3.软件设计模式这种抽象概念应用到不同的具体应用,是一种软件设计模式。比如在C#中有一个抽象类“System.IO.Stream”,它表示一个抽象的流的概念,而.NET框架中在这个抽象概念的流上面实现了各种具体的流,比如针对文件,HTTP资源,内存等等。1.1.3用户界面事件1.窗体重绘事件如图1.3所示,窗体2覆盖了窗体1,此时我的控件有一部分被覆盖了,当用户设置了窗体1靠前显示时,我的控件原先被窗体2覆盖的部分给显示出来了,此时形成了一个剪切矩形,程序需要重新绘制我的控件的用户界面,窗体2(置后)窗体1(置后)我的控件窗体2(置前)窗体1(置前)我的控件剪切矩形1.1.3用户界面事件2.NET用户界面事件原理计算机用户经常操作鼠标和键盘来试图干涉和控制应用程序的运行。而应用程序需要感知鼠标和键盘的状态来响应用户的操作意图。此时开发人员需要进行鼠标和键盘事件处理。图1.4所示的是.NET应用程序处理鼠标和键盘事件的原理图。WM_MOUSEDOWN消息应用程序消息循环OnMouseDown方法OnKeyDown方法WM_KEYDOWN消息物理电子信号Windows消息.NET事件MouseDown事件KeyDown事件.NET框架OnPaint方法Paint事件WM_PAINT消息Windows操作系统System.Windows.Forms.Control类型1.1.3用户界面事件3.鼠标事件开发人员需要响应控件的鼠标事件,此时需要绑定控件的MouseDown事件或重写OnMouseDown方法来处理鼠标按键按下事件,绑定控件的MouseMove事件或重写OnMouseMove方法来处理鼠标移动事件,绑定控件的MouseUp事件或重写OnMouseUp方法来处理鼠标按键松开事件,绑定控件的MouseWheel事件或重写OnMouseWheel方法来处理鼠标滚轮事件。4.键盘事件用户也经常要求能使用键盘来进行操作,比如对于文本编辑器,用户需要使用键盘来输入大量的文本字符,移动光标等等。5.其他事件在C#中开发人员还可以处理其他的事件,比如开发人员可以在窗体中放置了一个定时器控件,则可以处理它的定时器事件来固定的每隔一段时间进行操作。用户从Windows资源管理器中拖拽一个文件到应用程序界面上时,开发人员可以响应控件的OLE拖拽事件来接受拖拽过来的文件的数据。1.1.4图形用户界面闪烁假设显卡刷新频率是50HZ,也就是每20毫秒读取显存刷新屏幕。有一个程序,中间显示了一张图片,先由于某种原因,程序需要重新绘制用户界面。于是经历了以下绘制过程:(1)第0毫秒,马上要绘制图片了,显卡刷新屏幕,如图1.5所示。1.1.4图形用户界面闪烁(2)第20毫秒,绘制了白色背景,显卡刷新屏幕,如图1.6所示。1.1.4图形用户界面闪烁(3)第40毫秒,绘制了一半,显卡刷新屏幕,如图1.7所示。1.1.4图形用户界面闪烁(4)第60毫秒,终于绘制完成了,显卡刷新屏幕,如图1.8所示。1.1.4图形用户界面闪烁1.剪切矩形技术应用程序受操作系统的请求而绘制用户界面,此时应用程序会从操作系统获得一个剪切矩形,该矩形说明了用户界面需要重新绘制的区域,很多时候应用程序不需要重新绘制整个的用户界面,而是只要绘制其中的某个部分即可维护用户界面的完整性,而从操作系统获得的剪切矩形就指明了要绘制的区域。2.脏矩形技术脏矩形技术是用于主动触发重绘的,当应用程序根据状态需要重新绘制用户界面时,大部分情况下是无需重新绘制整个用户界面即可完成功能,此时需要计算出一个尽可能小的矩形区域,只有该区域中的用户界面是“脏”的,需要重新绘制,而后告诉操作系统在未来的绘制用户界面的时候使用该脏矩形作为剪切矩形。1.1.4图形用户界面闪烁3.双缓存技术双缓冲技术是解决用户界面闪烁的最方便可靠的方法。闪烁是应用程序绘制用户界面过程缓慢而造成的,但并不是应用程序所有的软件模块运行缓慢就造成闪烁,仅仅是绘图过程缓慢才造成闪烁。1.2C#图形开发基础1.2.1GDI+概述利用.NET框架所提供的GDI+(GraphicsDeviceInterfacePlus)类库,可以很容易绘制各种图形,包括绘直线和形状、处理位图图像和各种图像文件(bmp、jpg、ico、gif、wmf等),还可以显示各种风格的文字。GDI+类库最早出现在Windows2000中,现在已成为.NET框架的重要组成部分。GDI+包括一系列处理图形、文字和图像的类,它提供了二维图形绘制、图像处理的大量功能,但不包括三维图形处理功能,要处理三维图形,仍然需要通过COM接口调用DirectX类库来完成。1.2.2矢量图和位图对于计算机来说,矢量图处理复杂,但数据量小,可无级缩放;而位图显示过程简单,存储格式简单,但数据量大,而且放大时显示效果差,会出现锯齿。例如在记事本中输入文本“C#Discovery”,采用不同的字体,其显示的文字效果也不同,如表1.1所示。字体显示结果大小为12的Fixedsys大小为40的Fixedsys大小为12的宋体大小为40的宋体1.2.3图形坐标系统图形中每个图形元素都由若干个(X,Y)坐标值和宽度高度值来确定。比如一个点用一对(X,Y)值来确定位置,而一个线段用两个(X,Y)值来定位,而矩形用一个(X,Y)值以及宽度高度值来定位,而圆或椭圆则用一个外切矩形来确定。不同于数学上的坐标系左边,计算机系统中,坐标系是以左上点为原点的,X轴朝右,Y轴朝下,如图1.9所示。YX(0,0)1.2.3图形坐标系统2.像素像素度量单位是和图形硬件相关的,图形显示设备具有一个DPI的参数,也就是一英寸所包含的设备像素个数。在显示器属性对话框中可以看到显示器的PDI设置,如图1.10所示。1.2.3图形坐标系统像素是光栅设备可以显示的最小单位。对单色设备来说,每个像素可以用一位(比特)表示,而对彩色设备,每个像素必须用多个位表示,位数越多,所表示的颜色越丰富,表1.2列出了部分设备中每个像素的位数及颜色数:像素位数颜色数典型设备12单色显示器、打印机416标准VGA8256256色VGA1632768或6553532K或64K色VGA2422424位真彩色设备3223232位真彩色设备1.2.3图形坐标系统3.坐标转换坐标系还可以转换,转换类型主要有平移、旋转和缩放。平移是指坐标原点(X和Y值都为0的点)上下左右移动,而坐标度量单位等属性不改变;旋转是指坐标系整体的以原点为中心,顺时针旋转一定的角度;而缩放则是将X轴或Y轴方向进行缩小或放大,X方向和Y方向的缩放可以是独立的。4.图形界面基本元素实际图形开发中,主要的图形界面基本元素有文本,直线段,矩形,椭圆(包括正圆),椭圆弧(包括圆弧),还有一些其他曲线。基本的绘图操作有绘制线条和填充区域。1.2.4图形开发基本原理1.画布通过计算机软件,计算机系统还可以征用一大块内存创建一个二维数组来构造出一个画布对象。比如可以征用1024*768*4=3145728字节的内存,也就是3MB的内存来模拟一个1024*768的画布。2.画笔计算机系统中定义一个画笔概念,它具有颜色、线条粗细、线条样式等属性。用于绘制一条线段,或者沿着某条路径来描线。3.画刷计算机系统中定义了一个画刷概念,它具有颜色等属性,用于填充某块区域。计算机会计算出需要填充区域的像素区间,然后批量地设置区间中的像素的值为画刷的值。1.2.4图形开发基本原理4.颜色图1.11所示的是RGB色彩模式原理图。红、绿、蓝三个分量组成一个颜色矩阵。最上面为白色,最下面为黑色。1.2.4图形开发基本原理5.度量在计算机图形开发中也存在度量,最简单的就是以像素为度量单位,而像素的大小和图形显示设备相关。比如长度为100个像素的线段,在屏幕上显示大致为2.6厘米,但打印时却只有1厘米甚至更短。因此像素是一种和图形设备相关的度量单位,在使用不同的图形设备时需要进行度量单位的转换。1.2.5C#图形开发基础.NET平台也能较好地处理测量图形的度量问题,枚举“System.Drawing.GraphicsUnit”就列出了一些标准的坐标度量单位。“GraphicsUnit”枚举列出的项目如表1.3所示。成员描述Display指定显示设备的度量单位。通常,视频显示使用的单位是像素;打印机使用的单位是1/100英寸。Document将文档单位(1/300英寸)指定为度量单位。Inch将英寸指定为度量单位。Millimeter将毫米指定为度量单位。Pixel将设备像素指定为度量单位。Point将打印机点(1/72英寸)指定为度量单位。World将世界坐标系单位指定为度量单位。1.3C#画图初步1.3.1画布1.Paint事件在为窗体编写Paint事件处理程序时,图形对象作为一个PaintEventArgs类的实例提供。下面的代码引用Paint事件的PaintEventArgs中的Graphics对象:privatevoidForm1_Paint(objectsender,System.Windows.Forms.PaintEventArgspe){/*声明图形对象并把它设置为PaintEventArgs事件提供的图形对象*/Graphicsg=pe.Graphics;}1.3.1画布2.CreateGraphics方法使用控件或窗体的CreateGraphics()方法获取对Graphics对象的引用,该对象表示这个控件或窗体的绘图表面。例如:Graphicsg;g=this.CreateGraphics();//把g设为一个图形对象,来表示控件或窗体的绘图平面3.Graphics.FromImage方法从Image类派生的任何对象创建图形对象,调用Graphics.FromImage()方法即可。例如:BitmapmyBitmap=newBitmap(@C:\myPic.bmp);Graphicsg=Graphics.FromImage(myBitmap);Graphics类的常用属性和方法分别如表1.4和表1.5所示。1.3.2画笔画笔Pen类用于绘制直线和曲线,此类无法继承,在System.Drawing命名空间中。画笔可用于绘制线条、曲线以及勾勒形状轮廓。下面的代码创建一支基本的黑色画笔:PenmyPen=newPen(Color.Black);//创建一个默认宽度为1的黑画笔PenmyPen=newPen(Color.Black,5);//创建一个宽度为5的黑画笔也可以通过已存在的刷子对
本文标题:第1章-C#图形开发基础.
链接地址:https://www.777doc.com/doc-4674138 .html