第6讲 Visual C++图形程序设计

上传人:痛*** 文档编号:244375703 上传时间:2024-10-04 格式:PPT 页数:47 大小:1.18MB
返回 下载 相关 举报
第6讲 Visual C++图形程序设计_第1页
第1页 / 共47页
第6讲 Visual C++图形程序设计_第2页
第2页 / 共47页
第6讲 Visual C++图形程序设计_第3页
第3页 / 共47页
点击查看更多>>
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,第八章,Visual C+,图形程序设计,一、基础知识,二、绘图工具,CGdiObject,类及子类,三、绘图操作,CDC,类及子类,一、基础知识,画家与程序员,图形设备接口(,GDI),和设备环境(,DC),图形刷新,映射模式(,MM),颜色,1.1. 画家与程序员,画家-程序员,画布-窗口客户区,画家使用的工具-画笔、画刷、调色板等,图形示例:,Bring notebook, textbook, planner, and appropriate writing tools to class.,Know due dates, and submit all coursework on time.,All assignments are posted on the bulletin board and on the class Web site.,1.2.,图形设备接口与设备环境,Windows,图形设备接口(,GDI),是为与,设备无关,的图形设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置,图形设备接口(,GDI),GDI,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上,显示图形,或,文字,, 是,Windows,系统的重要组成部分,Windows,支持与设备无关的图形,利用,GDI,和,Windows,设备驱动程序,开发人员只要建,立与输出设备的,关联,让系统加,载相应的设备驱,动程序即可,GDI,的一些基本概念,设备描述表,即为,设备环境,的属性的集合,应用程序,与,输出设备,之间的桥梁,Win,系统,外设,直接访问,不允许,统一的设备环境(,DC),提供,使应用程序与设备相连,用户,为确保图形输出,的,设备无关性,应用程序,设备描述表及其属性,通过设备描述表的句柄来间接地存取,应用程序每一次图形操作均参照设备描述表中的属性执行,1.3.图形刷新,图形刷新,是绘图过程中必须考虑的重要问题,刷新请求,对刷新请求的响应,刷新方法,包括,(1) 刷新请求,应用程序在窗口中,绘制了一个椭圆,,颜色列表框覆盖了,椭圆的一部分,关闭颜色选框后,,应用程序需要恢,复被覆盖部分的颜色和形状,窗口大小的调整,窗口移动,被覆盖后的恢复,(2) 系统对刷新请求的响应,当用户区的内容需要刷新时,系统向应用程序消息队列发送,WM_PAINT,消息,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理,三种,刷新,窗口移动后的刷新,被覆盖区域的刷新,对象穿越后的刷新,(,系统自动完成,),用户区移动或显示,用户窗口大小改变,程序通过滚动条滚动窗口,窗口被另一个窗口覆盖的,恢复如下拉式菜单关闭等,光标穿过用户区,图标拖过用户区,窗口被另一个窗口覆盖的区域称为,无效区域,。,Windows,系统为每个窗口建立了一个,PAINTSTRUCT,结构,,,该结构中包含了包围,无效区域,的一个最小矩形的结构,RECT,,,应用程序可以根据这个无效矩形执行刷新操作。,Typedef,struct tagPAINTSTRUCT,HDC,hdc,;/,设备环境句柄,BOOL,fErase,;/,一般取真值,表示擦除无效矩形的背景,RECT,rcPaint,;/,无效矩形标识,BOOL,fRestore,;/,系统保留,BOOL,fIncUpdate,;/,系统保留,BYTE,rgbReserved,16;/,系统保留,PAINTSTRUCT;,rcPaint,为标准的,RECT,数据结构,其作用是标识无效矩形,它包含了无效矩形的左上角和右下角的坐标,常用的,Windows,应用程序刷新窗口的方法,保存副本。刷新时将副本拷贝到相应的窗口中,记录事件。刷新时重新执行这个曾经发生的事件,重新绘制。将图形绘制处理程序放在消息,WM_PAINT,响应模块中,刷新时重绘图形,(3) 有效的刷新方法,1.4.映像模式,映像模式定义了将逻辑单位转化为设备的度量单位以及设备的,x,方向和,y,方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况,窗口,:对应逻辑坐标系上程序员设定的区域,视口,:对应实际输出设备上程序员设定的区域,窗口和视口,如何映射?,映射示意图-原始文档和显示的文档,原始文档和显示的文档,缺省的映射模式,将窗口中的对称图形映射到视口时仍为对称图形,按照窗口和视口的坐标比例进行映射,坐标系统,逻辑坐标系统,设备坐标系统,屏幕坐标系统,窗口坐标系统,用户区坐标系统,CDC *,pDC1;,(1),设置坐标的映射模式,pDC1-,SetMapMode,(MM_ISOTROPIC);,(2),设置逻辑坐标,pDC1-,SetWindowExt,(200,200);,pDC1-,SetWindowOrg,(0,0);,(3)设置物理坐标,pDC1-,SetViewportExt,(,rc,.right,-,rc,.bottom);,pDC1-,SetViewportOrg,(0,rc,.bottom);,1.5. 颜色,Windows,使用宏,RGB,定义绘图的颜色,其形式为:,RGB(,nRed,nGreen,nBlue,),红色值,蓝色值,绿色值,RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),二、,Visual C+,绘图工具,CGdiObject,类及子类,画家,=,程序员,绘图操作,=,CDC,类及其,子,类,绘图工具,=,CGdiObject,类及其子类,2.1. 画笔-计算机中一条线有哪些属性?,线的坐标,线型,线宽,线的颜色,CPen,类的操作步骤,(1)声明,CPen,对象。,(2)初始化画笔。,通过调用,CreatePen,成员函数可以初始化笔,该函数的原型为:,BOOL,CreatePen,(,int,nPenStyle,int,nWidth,COLORREF,crColor,);,(3)将新建的画笔对象选进设备场景中,同时保存原画笔对象的指针:,pOldPen,=,pDC,-,SelectObject(&pen,);,(4),调用绘图函数生成图形。,(5)选择设备场景的原有,画,笔对象。,画笔的各种效果演示,2.2 画刷-有哪些属性?,画刷起什么作用?,画笔,对象是用来绘制图形边界的。,画刷,则是给图形内部着色的。,CBrush:CreateSolidBrush,(),函数来初始化纯色画刷,。,CBrush:CreateHatchBrush,(),函数来初始化阴影画刷,。,画刷起什么作用?,画笔,对象是用来绘制图形边界的。,画刷,则是给图形内部着色的。,CBrush:CreateSolidBrush,(),函数来初始化纯色画刷,。,CBrush,br,;,br.CreateSolidBrush(RGB(255,0,0);,CBrush:CreateHatchBrush,(),函数来初始化阴影画刷,。,CBrush:CreateHatchBrush(int,nIndex, DWORD,crColor,);,例如:创建一个十字线阴影的红色图案刷子,CBrush,br,;,br.CreateHatchBrush(HS_CROSS,RGB(255,0,0);,三、,Visual C+,绘图操作,CDC,类及其,子,类,画家,=,程序员,绘图操作,=,CDC,类及其,子,类,绘图工具,=,CGdiObject,类及其子类,3.1. CDC,子类介绍-,CClientDC,类,CClientDC,类只能在客户区绘图,。,所谓客户区是指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等以外的部分,它是用户可以操作的区域。,例如打开,Word,文档将是将某个.,doc,文件显示在其客户区域中。,在使用,CClientDC,进行绘图时,一般要,调用,GetClientRect,函数来获取客户区域,的大小。,CClientDC,类由,CDC,派生而来,它使调用和释放设备环境的过程 自动化。,CClientDC,对象在构造时调用,Windows API,函数,GetDC,在析构时调用响应的,API,函数,ReleaseDC,,,这意味着与,CClientDC,对象相关的设备环境是窗口的客户区,CClientDC,对象的,窗口句柄保存在成员变量,m_,hWnd,为构造,CClientDC,,,需将,CWnd,作为参数传递给构造函数。,CDC,子类介绍-,CWindowDC,类,派生类,CWindowDC,(,管理框架窗口),CWindowDC,类直接从,CDC,派生,它使调用和释放整个窗口(包括客户区和非客户区)的设备环境过程自动化。,CWindowDC,对象在构造时调用,Windows API,函数,GetWindowDC,在析构时调用相应的,API,函数,ReleaseDC,这意味着,CWindowtDC,对象可访问,CWnd,所指向的整个屏幕区域。,CWindowDC,允许在显示器的任意位置绘图,,坐标原点在整个窗口的左上角,。由于使用,CWindowDC,可以在整个窗口类绘图,这给了程序员很大的自由度,但使用不当会带来麻烦。,在使用,CWindowDC,进行绘图时,一般要调用,GetWindowRect,函数来获取整个应用程序窗口区域的大小。,CWindowDC,对象的,窗口句柄保存在成员变量,m_,hWnd,为构造,CWindowDC,,,需将,CWnd,作为参数传递给构造函数。,3.2. Visual C+,的文本操作,文本输出函数,文本属性控制,文本的字体,3.2.1. 基本的文本输出函数,设置前景色:,CDC:SetTextColor(int,nColor,);,设置背景色:,CDC:SetBkColor(int,nColor,);,文本输出函数:,CDC:TextOut,();,示例,:,dc.SetTextColor(WHITE,);,dc.SetBkColor(DK_BLUE,);,dc.TextOut(10,10,“Here it is.”);,扩展的文本输出函数,文本输出除了前面讲的,TextOut,(),外,常见的还有,ExtTextOut,():,该函数的原型为:,BOOL,ExtTextOut,int,x,int,y; /,输出的位置,UINT,nOptions,;/,指定矩形的类型,LPCRECT,lpRect,;/,输出的字符的矩形区域,const,CString,&,str,;/,欲输出的字符,LPINT,lpDxWidths,;/,字符间距,;,该函数用来在一个给定的矩形,lpRect,区域内输出字符串,str,,,此矩形可以设置为透明的(,nOptions,=ETO_OPAQUE),或不透明的,当矩形区域为不透明时,用当前的背景色填充矩形。,扩展的文本输出函数,此矩形也可以设置为裁剪(,nOptions,=ETO_CLIPPED),性质或非裁剪性质,,当设置为裁剪性质时,所有在矩形外面的字符串将被裁剪掉,。,上述参数中,,nOptions,主要设置矩形的类型,可以为,ETO_OPAQUE,和,ETO_CLIPPED,两个值的一个或两个组合;,lpDxWidths,是一个指向整数数组的指针,,此数组中存放以逻辑单位表示的字符间的距离,,第,n,个数代表第,n,个和,n+1,个字符之间的距离。该参数为,NULL,时,则按缺省值处理。,3.2.2.文本属性控制-,设置文本的背景色,缺省时,在绘制图形或者输出文本时,背景颜色是白色。可以使用,CDC,的成员函数,SetBkColor,函数来设置新的背景颜色,函数原型为:,Virtual COLORREF,SetBkColor(COLORREF,crcolor,);,其中参数,crcolor,用于指定新的背景颜色。,例如要将背景颜色设为红色,可以用以下语句:,SetBkColor(RGB(255,0,0);,文本属性控制-,控制文本的背景色,在设备描述表中有两项可以影响背景,,一个是背景色,另一个是背景模式,。背景模式可以为透明的(,Transparent),或不透明的(,Opaque),,缺省为不透明的。当,背景模式为不透明时,按背景颜色的值填充字符的空余部分,,如果,背景模式为透明的,将不用背景颜色填充,保留屏幕上原来的颜色,。背景模式可用函数,SetBkMode,来设置,它设置当前的背景模式并返回原来的背景模式,该函数的原型为:,int,SetBkMode(int,nBkMode,);,参数,nkbmode,指定背景模式,其值可以是,OPAQUE,或者,TRANSPARENT,,如果值为,OPAQUE,,则显示时背景都改变为当前背景颜色。如果值为,TRANSPARENT,,则不改变背景颜色,此时,任何,SetBkColor,函数调用都无效,缺省的背景模式为,OPAQUE。,文本属性控制-,设置文本的排列方式,在文本显示时遇到的另一个问题是文本的排列方式,它控制文本和给定点的相对位置。在一个图形中加字符说明时,常常知道一个字符串的某一个边界,如左边界不应超过某个位置,或右边界不应超过某个位置,或显示的几行字符串的中心点对齐等。利用,CDC,的成员函数,SetTextAlign,函数就能方便地实现这种控制,其原型为:,UINT,SetTextAlign,(UINT,nFlags,);,其中,,nFlags,为文本的对齐方式,其值如下:,TA_LEFT,将点同边界矩形的水平中心对齐,TA_BASELINE S,将点同所选字体的基线对齐,TA_BOTTOM,将点同边界矩形的底线对齐,3.2.3.文本的字体,字体反映了字符外观特性,如汉字有宋体、楷体、黑体等,西文也有字体如,Arial、Roman,等,,同一个字符以不同的字体输出时外观会不太一样,。,VC,提供了丰富的字体控制功能,不仅,可以使用,Windows,提供的字体,还可以自己创建字体,,这使得,Windows,下文本输出具有很大的灵活性,可以随心所欲,最大限度地满足用户对复杂文本的输出要求。可以这样说,,Word,字处理程序所能应用的有关字体的功能,在设备环境中都能给以支持。,文本的字体-,使用库存字体,Windows,系统本身提供了一些库存字体,对于大多数应用程序,使用库存字体即可完成基本的文本输出功能。,要想使用库存字体,需要使用,CDC,的成员函数,SelectStockObject,(),来完成,例如:,SelectStockObject(OEM_FIXED_FONT,);,该语句把终端字体选入设备环境,这样,用,TextOut,或,TextOutEx,输出文本时,将使用,DOS,命令窗口的字体。其实,每个设备环境都有一个缺省字体,对于显示器而言,缺省字体就是,SYSTEM_FONT,系统字体,如果应用程序不需要执行很复杂的文本输出,使用缺省字体即可,。,文本的字体-,使用自定义逻辑字体,逻辑字体是用和设备无关的方式来描述一个字体,它使用通用的术语来描述一个字符的宏观特性,(如高度、宽度、旋转角度、是否有下划线等),但它不能描述微观特性,没有足够的信息来显示字体,是从应用的角度描述一个字体,因为在应用时没有必要把字体的细微结构都描述出来,这会使使用变得很繁琐,这些细节由物体字体描述。我们使用时用逻辑字体来描述需要的文本,,GDI,根据逻辑字体的描述选配最接近的物理字体,由物理字体进行输出。,MFC,提供的,CFont,类封装了逻辑字体,。创建自定义字体并不是创建一种新的字体,而是创建一种逻辑字体。逻辑字体是一种字体属性的列表,如高度、宽度、字符集和字样等。字体映射器按逻辑字体给出的字体特性选择与之匹配的物理字体,文本的字体-,创建字体,要创建字体,首先要声明一个,CFont,对象来表示逻辑字体,然后初始化,CFont,对象。常见的初始化方法有以下几种:,(1)用,CFont,的成员函数,CreatePointFont,直接创建逻辑字体,函数原型为:,BOOL,CreatePointFont,(,int,nPointSize, LPCTSTR,lpszFaceName, CDC*,pDC,= NULL );,其中,字体的高度由,nPointSize,指定,它以1/10点数为一个单位。例如如该值为100,则字体的高度为10点(1点=0.013837英寸),字体的名称由,lpszFaceName,指定。下面为使用该函数的典型代码:,CClientDC,dc(this);/,声明客户区设备环境变量,dc,CFont,font; /,声明逻辑字体变量,font,font.CreatePointFont(120, Arial, ,CFont,* def_font =,dc.SelectObject(&font,);,dc.TextOut(5, 5, Hello, 5);,dc.SelectObject(def_font,); /,恢复旧字体,font.DeleteObject,(); /,删除所建立的字体,文本的字体-,创建字体,(2),用,CFont,的成员函数,CreateFont,直接创建逻辑字体,函数原型为:,BOOL,CreateFont,(,int,nHeight,int,nWidth,int,nEscapement,int,nOrientation,int,nWeight,BYTE,bItalic, BYTE,bUnderline, BYTE,cStrikeOut, BYTE,nCharSet, BYTE,nOutPrecision,BYTE,nClipPrecision, BYTE,nQuality,BYTE,nPitchAndFamily, LPCTSTR,lpszFacename,);,3.3. 常用绘图函数,(1)设置画笔当前位置的函数,MoveTo,,,BOOL,MoveTo,(,int,X,int,Y,),(2) 从当前位置向指定坐标点画直线的函数,LineTo,,,BOOL,LineTo,(,int,X,int,Y) /,X,和,Y,为线段的终点坐标,(3),从当前位置开始,依次用线段连接,lpPoints,中指定的各点,BOOL,Polyline,(,LPPOINT,lpPoints,/,指向包含各点坐标的,POINT,结构数组的指针,int nCount,/,nCount,为,POINT,数组中点的个数,),(4) 绘制椭圆弧线的函数,Arc,,BOOL,Arc,(,int,X1,intY1,/,边框矩形左上角的逻辑坐标,int,X2,int,Y2,/,边框矩形右下角的逻辑坐标,int,X3,int,Y3,/,椭圆弧起始点坐标,int,X4,int,Y4/,椭圆弧终止点坐标,),(,x1,y1),(,x2,y2),(,x3,y3),(,x4,y4),所画曲线,(5) 绘制饼图,并用当前画刷进行填充,BOOL,Pie,(,int,X1,intY1,/,边框矩形左上角的逻辑坐标,int,X2,int,Y2,/,边框矩形右下角的逻辑坐标,int,X3,int,Y3,/,椭圆弧起始经线的确定点坐标,int,X4,int,Y4/,椭圆弧终止经线的确定点坐标,),(,x1,y1),(,x2,y2),(,x3,y3),(,x4,y4),所填区域,(6) 绘制矩形,并用当前画刷进行填充,BOOL,Rectangle,(,int,X1,int,Y1,int,X2,int,Y2,),(,X1,Y1),和,(,X2,Y2),分别,为矩形的左上角和右下角的逻辑坐标,(7) 绘制圆角矩形,并用当前画刷填充,BOOL,RoundRect,(,int,X1,int,Y1,int,X2,int,Y2,int nHeight,int nWidth,),圆角的高度和宽度,(8) 绘制椭圆,并用当前画刷填充,BOOL,Ellipse,(intX1,intY1,intX2,intY2),(9)绘制多边形,并用当前画刷填充,BOOL,Polygon,(,LPPOINT,lpPoints,int nCount,),包含各点坐标的,POINT,数组的地址,多边形点的个数,(10) 绘制,弓形图,,并用当前画刷填充,BOOL Chord(,int,x1,int,y1,int,x2,int,y2,int,x3,int,y3,int,x4,int,y4 );,(11),画点函数,:,COLORREF,SetPixel,( POINT point, COLORREF,crColor,);,3.4. 绘图模式,画笔和画刷,对点线的绘制和图形的填充起着很重要作用,除此之外,还有设备描述表中的,绘图模式,(又称光栅操作模式)。例如当绘制一条线段时,该,线段的颜色不仅取决于画笔的颜色,而且也取决于该线段所在显示区域的颜色,。,当,Windows,使用画笔画线时,它实际上是在画笔像素和目标位置处原像素之间执行一种按位布尔运算,称为,“,光栅操作,”,(,Raster Operation),,简记为,“,ROP,”,。,由于画线操作只涉及两种像素(画笔像素和目标像素),所以这种布尔运算又称为,“,二元光栅操作,”,(,ROP2)。Windows,定义了16种,ROP2,码,用来表示画笔像素和目标像素各种不同的组合方式。,可以调用,CDC,的成员函数,SetROP2,改变绘图模式,函数原型为:,int,SetROP2(int,nDrawMode,);,3.5. 总结: 绘图基本步骤,(1) 获取设备环境,(2) 设置逻辑坐标及逻辑原点,(3) 设置物理坐标及其设备原点,(4) 初始化绘图工具,(5) 调用绘图函数绘图,(3) 释放设备环境结束绘图,习题:,绘制多边形,1、,当按鼠标左键时,,开始,绘制直线。,2、,当按,住,鼠标左键在屏幕,上,移动鼠标时,在屏幕上 画一条直线;该直线开始于原先按下鼠标左键的位置,终止于当前鼠标移动到的位置。随着鼠标的移动,该直线也在移动,但直线的起始点不动,类似于一个橡皮筋固定在一端,而在拉动它的另一端。,3、,当,鼠标左键,起来时,结束画直线操作。,4、,当按鼠标,右,键时,,封闭所画的多边形。,5、,要求能选择直线的宽度、线的颜色、线型。,6、,要求能选择填充的图案、填充的颜色。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!