《visualc图形程序设计》由会员分享,可在线阅读,更多相关《visualc图形程序设计(47页珍藏版)》请在金锄头文库上搜索。
1、第八章 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 a
2、ssignments are posted on the bulletin board and on the class Web site.,1.2. 图形设备接口与设备环境,Windows图形设备接口(GDI)是为与设备无关的图形设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置,GDI的一些基本概念 设备描述表即为设备环境的属性的集合,应用程序与输出设备之间的桥梁,Win系统,外设,直接访问,统一的设备环境(DC),使应用程序与设备相连,应用程序,设备描述表及其属性,通过设备描述表的句柄来间接地存取,应用程序每一次图形操作均参照设
3、备描述表中的属性执行,1.3.图形刷新,(1) 刷新请求,(2) 系统对刷新请求的响应 当用户区的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT消息,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理,三种 刷新,窗口移动后的刷新 被覆盖区域的刷新 对象穿越后的刷新 (系统自动完成),用户区移动或显示 用户窗口大小改变 程序通过滚动条滚动窗口,窗口被另一个窗口覆盖的 恢复如下拉式菜单关闭等,光标穿过用户区 图标拖过用户区,窗口被另一个窗口覆盖的区域称为无效区域。 Windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构中包含了包围无效区域的一个最小矩形
4、的结构RECT,应用程序可以根据这个无效矩形执行刷新操作。,Typedef struct tagPAINTSTRUCT HDC hdc; /设备环境句柄 BOOL fErase; /一般取真值,表示擦除无效矩形的背景 RECT rcPaint; /无效矩形标识 BOOL fRestore; /系统保留 BOOL fIncUpdate; /系统保留 BYTE rgbReserved16;/系统保留 PAINTSTRUCT;,常用的Windows应用程序刷新窗口的方法,保存副本。刷新时将副本拷贝到相应的窗口中,记录事件。刷新时重新执行这个曾经发生的事件,重新绘制。将图形绘制处理程序放在消息WM_P
5、AINT响应模块中,刷新时重绘图形,(3) 有效的刷新方法,1.4.映像模式 映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况,窗口:对应逻辑坐标系上程序员设定的区域 视口:对应实际输出设备上程序员设定的区域,窗口和视口 如何映射?,映射示意图-原始文档和显示的文档,原始文档和显示的文档,坐标系统,逻辑坐标系统,设备坐标系统,CDC * pDC1; (1) 设置坐标的映射模式 pDC1-SetMapMode(MM_ISOTROPIC); (2) 设置逻辑坐标 pDC1-SetWindowExt(200,20
6、0); 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
7、.1. 画笔-计算机中一条线有哪些属性?,线的坐标 线型 线宽 线的颜色,CPen类的操作步骤,(1)声明CPen对象。 (2)初始化画笔。 通过调用CreatePen成员函数可以初始化笔,该函数的原型为:BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); (3)将新建的画笔对象选进设备场景中,同时保存原画笔对象的指针: pOldPen=pDC-SelectObject( (4)调用绘图函数生成图形。 (5)选择设备场景的原有画笔对象。,画笔的各种效果演示,2.2 画刷-有哪些属性?,画刷起什么作用?,画笔对象是用来绘制
8、图形边界的。 画刷则是给图形内部着色的。 CBrush:CreateSolidBrush() 函数来初始化纯色画刷。 CBrush:CreateHatchBrush() 函数来初始化阴影画刷。,画刷起什么作用?,画笔对象是用来绘制图形边界的。 画刷则是给图形内部着色的。 CBrush:CreateSolidBrush() 函数来初始化纯色画刷。 CBrush br; br.CreateSolidBrush(RGB(255,0,0); CBrush:CreateHatchBrush() 函数来初始化阴影画刷。 CBrush:CreateHatchBrush(int nIndex, DWORD c
9、rColor); 例如:创建一个十字线阴影的红色图案刷子 CBrush br; br.CreateHatchBrush(HS_CROSS,RGB(255,0,0);,三、Visual C+ 绘图操作 CDC类及其子类,画家=程序员 绘图操作= CDC类及其子类 绘图工具=CGdiObject类及其子类,3.1. CDC子类介绍- CClientDC类,CClientDC类只能在客户区绘图。 所谓客户区是指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等以外的部分,它是用户可以操作的区域。 例如打开Word文档将是将某个.doc文件显示在其客户区域中。 在使用CClientDC进行绘图时,一
10、般要调用GetClientRect函数来获取客户区域的大小。 CClientDC类由CDC派生而来,它使调用和释放设备环境的过程 自动化。CClientDC对象在构造时调用Windows API函数GetDC, 在析构时调用响应的API函数ReleaseDC,这意味着与CClientDC对象相关的设备环境是窗口的客户区 CClientDC对象的窗口句柄保存在成员变量m_hWnd, 为构造CClientDC,需将CWnd作为参数传递给构造函数。,CDC子类介绍- CWindowDC类,派生类CWindowDC(管理框架窗口) CWindowDC类直接从CDC派生,它使调用和释放整个窗口(包括客户
11、区和非客户区)的设备环境过程自动化。 CWindowDC对象在构造时调用Windows API函数GetWindowDC, 在析构时调用相应的API函数ReleaseDC,这意味着CWindowtDC对象可访问CWnd所指向的整个屏幕区域。 CWindowDC允许在显示器的任意位置绘图,坐标原点在整个窗口的左上角。由于使用CWindowDC可以在整个窗口类绘图,这给了程序员很大的自由度,但使用不当会带来麻烦。 在使用CWindowDC进行绘图时,一般要调用GetWindowRect函数来获取整个应用程序窗口区域的大小。 CWindowDC对象的窗口句柄保存在成员变量m_hWnd,为构造CWin
12、dowDC,需将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()外,常见的还有Ex
13、tTextOut(): 该函数的原型为: BOOL ExtTextOut int x, int y; /输出的位置 UINT nOptions;/指定矩形的类型 LPCRECT lpRect;/输出的字符的矩形区域 const CString 该函数用来在一个给定的矩形lpRect区域内输出字符串str,此矩形可以设置为透明的(nOptions=ETO_OPAQUE)或不透明的,当矩形区域为不透明时,用当前的背景色填充矩形。,扩展的文本输出函数,此矩形也可以设置为裁剪(nOptions=ETO_CLIPPED)性质或非裁剪性质,当设置为裁剪性质时,所有在矩形外面的字符串将被裁剪掉。 上述参数中
14、,nOptions主要设置矩形的类型,可以为ETO_OPAQUE和ETO_CLIPPED两个值的一个或两个组合; lpDxWidths是一个指向整数数组的指针,此数组中存放以逻辑单位表示的字符间的距离,第n个数代表第n个和n+1个字符之间的距离。该参数为NULL时,则按缺省值处理。,3.2.2.文本属性控制-设置文本的背景色,缺省时,在绘制图形或者输出文本时,背景颜色是白色。可以使用CDC的成员函数SetBkColor函数来设置新的背景颜色,函数原型为: Virtual COLORREF SetBkColor(COLORREF crcolor); 其中参数crcolor用于指定新的背景颜色。
15、例如要将背景颜色设为红色,可以用以下语句: SetBkColor(RGB(255,0,0);,文本属性控制-控制文本的背景色,在设备描述表中有两项可以影响背景,一个是背景色,另一个是背景模式。背景模式可以为透明的(Transparent)或不透明的(Opaque),缺省为不透明的。当背景模式为不透明时,按背景颜色的值填充字符的空余部分,如果背景模式为透明的,将不用背景颜色填充,保留屏幕上原来的颜色。背景模式可用函数SetBkMode来设置,它设置当前的背景模式并返回原来的背景模式,该函数的原型为: int SetBkMode(int nBkMode); 参数nkbmode指定背景模式,其值可以
16、是OPAQUE或者TRANSPARENT,如果值为OPAQUE,则显示时背景都改变为当前背景颜色。如果值为TRANSPARENT,则不改变背景颜色,此时,任何SetBkColor函数调用都无效,缺省的背景模式为OPAQUE。,文本属性控制-设置文本的排列方式,在文本显示时遇到的另一个问题是文本的排列方式,它控制文本和给定点的相对位置。在一个图形中加字符说明时,常常知道一个字符串的某一个边界,如左边界不应超过某个位置,或右边界不应超过某个位置,或显示的几行字符串的中心点对齐等。利用CDC的成员函数SetTextAlign函数就能方便地实现这种控制,其原型为: UINT SetTextAlign (UINT nFlags); 其中,nFlags为文本的对齐方式,其值如下: TA_LEFT 将点同边界矩形的水平中心对齐 TA_BASELINE S将点同所选