资源预览内容
第1页 / 共31页
第2页 / 共31页
第3页 / 共31页
第4页 / 共31页
第5页 / 共31页
第6页 / 共31页
第7页 / 共31页
第8页 / 共31页
第9页 / 共31页
第10页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第五章 图形程序处理,2,本章内容,图形设备接口(GDI) 画笔和画刷 文本和字体 位图、图标和光标,3,一、图形设备接口(GDI),GDI是Windows提供的一个支持图形编程处理的抽象接口,它内含各种绘图工具,程序员通过使用这些抽象工具,避免了直接与各式各样的设备硬件打交道,实现了编程中的“设备无关性”。 1、GDI概述 GDI在图形处理、输出和显示方面是一种全能的编程接口 GDI功能被封装于Gdi32.dll中,包含大量图形处理函数。,4,视窗APP绘图的一般过程:,2、设备环境(Device Context, 简称DC) 程序员要使用GDI,必须先获取一个DC,实则一个设备环境的句柄(HDC),然后由句柄去调用相关的图形绘制函数或设置DC的属性。,5,为了满足不同的DC应用要求,MFC将DC封装成几种不同的类,每一种类都封装了相应的设备环境句柄。 CDC类 CPaintDC类 CClientDC类 CWindowDC类 CMetaFileDC类,6,3、GDI坐标系和映射模式 (1) GDI坐标系 逻辑坐标系是面向DC的坐标系。 设备坐标系是面向显示或打印输出设备的坐标系 设备坐标系细分为3种: 屏幕坐标系原点在屏幕左上角。可控制窗口在屏幕上的位置。 窗口坐标系原点在当前窗口的左上角。很少使用。 客户区坐标系原点在客户区左上角,很常用。 CDC类提供了两种坐标转换函数:DPtoLP()、LPtoDP()。,7,鼠标使用设备坐标系,CDC绘图函数使用逻辑坐标系 用鼠标支配所绘图形应当实施坐标转换 在鼠标左键按下和移动函数中,加入语句: CClientDC dc(this); OnPrepareDC( (2) GDI映射模式(8种) 8种映射模式: MM_TEXT、 MM_LOMETRIC、 MM_HIMETRIC 、 MM_LOENGLISH 、 MM_HIENGLISH 、 MM_TWIPS、 MM_ISOTROPIC、 MM_ANISOTROPIC,逻辑单位分别是:1像素、 0.1mm、 0.01mm、 0.01吋、 0.001吋、 1/1440吋、系统确定。 前6种属于“固定比例”的映射方式,不可改变其固有的量纲。,8,4、绘图颜色的设置 GDI用COLORREF宏存放颜色,它实则一个32位的整型数据:高位字节为0,其余3个字节分别对应于RGB三原色值,每一原色的取值范围均为0255。 COLORREF宏定义:RGB(byRed, byGreen, byBlue) COLORREF类型的变量,可以应用于多种绘图函数中,如 CDC:SetBkColor() CDC:SetTextColor(),9,二、画笔和画刷,Pen和Brush是GDI中最重要的绘图工具 1、GDI对象 GDI提供了一系列抽象的绘图工具。MFC对GDI对象作了封装,形成了在CGdiObject基类基础上的各种派生类。 CPen CBrush CFont CBitmap CPalette CRgn,10,使用绘图工具的步骤:创建GDI对象选择GDI对象 使用对象绘图释放GDI对象 通过设置绘图模式,也可以修正绘图的效果,函数为: int SetROP2(int nDrawMode); /函数返回旧模式 参数nDrawMode的取值有: R2_BLACK:表示像素为黑色; R2_WHITE:表示像素为白色; R2_NOP:表示像素为无色透明; R2_NOT:表示像素为背景反色; R2_COPYPEN:表示像素为画笔颜色; R2_NOTCOPYPEN:表示像素为画笔颜色的反色;,11,2、使用画笔 GDI的画笔工具用于绘制点、线、多边形、矩形、椭圆等几何图形。 在DC中使用自定义画笔的三大步骤:创建选用还原。 创建画笔 方法1:CPen pen(PS_DASH,1,RGB(255,0,0); 方法2:CPen pen; pen.CreatePen(PS_DASH,1,RGB(255,0,0);,12,(2) 选用画笔 CPen *pOldPen; /本声明语句可与pen的声明合并 pOldPen=pDC-SelectObject( /删除自定义GDI画笔,清除内存 编程实例:创建UsePen程序,选用不同风格和属性绘图。,13,14,CPen *pOldPen, pen; /同时声明两个画笔对象 int nPenStyle =PS_SOLID, PS_DOT, PS_DASH, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL, PS_INSIDEFRAME; char *strStyle =“SOLID“, “DOT“, “DASH“, “DASHDOT“,; pDC-TextOut(60,10,“用不同样式的画笔绘图“); /输出风格标题 for(int i=0; iSelectObject(,15,3、使用画刷 创建画刷 画刷有3种基本类型:纯色、阴影、图案画刷。 创建方式1: /用构造函数 CBrush brush1(RGB(255,0,0); /纯色画刷 CBrush brush2(HS_CROSS,RGB(255,0,0); /阴影画刷 CBrush brush3(,16,(2) 使用画刷 编程实例:创建对话框应用程序,并重设其背景颜色 先创建UseBrh的基于对话框的应用程序,并为其添加一个CBrush类型的成员变量m_bkColor. 再在对话框的初始化函数中添加创建画刷的语句: m_bkColor.CreateSolidBrush(RGB(0,0,255); 最后用类向导添加WM_CTLCOLOR消息函数,注释掉原语句,然后添加 return m_bkColor; 编译并运行程序。,17,18,4、几何图形的绘制函数,19,画图函数的用法: SetPixel()直接用坐标点; MoveTo()与LineTo()起止点配合使用; Polyline()、Polygon()、PolyBezier()先需要定义多个坐标点,然后将其作为首要参数,次要参数为坐标点数目。 Rectangle()、RoundRect()参数包括矩形左上角点和右下角点坐标,后者还需要圆角半径参数。 Ellipse()需要一对坐标点; Arc(), ArcTo()需要至少2个以上的偶数坐标点。,20,三、文本与字体,1、绘制文本的常用CDC函数,21,2、字体概述 字体(font)是指采用某种字样的一套字符。 字体三要素字样、风格、尺寸。 字样指字体的样式和外观;风格字体精细和倾斜度 字体的类型:光栅、矢量、TrueType字体 光栅字体 矢量字体 TrueType字体,22,3、创建逻辑字体 Windows系统带有丰富的字体,需要时可以方便地调用。 逻辑字体:是一种抽象的与设备无关的字体描述,使用时由程序员自己创建。 使用CreateFont()函数 函数有14个参数(默认值为0) : 字高,字宽,行倾斜度(1/10度),字倾斜度(1/10度),粗细(01000),斜体(0/1),下划线(0/1),删除线(0/1),字符集(ANSI_CHARSET等),输出精度,裁剪精度,输出质量,间距和字库族,匹配字样。 后5项常取0。 实例编程:请参阅SDI应用程序RotateText。,23,(2) 使用字体通用对话框 实例编程:编写一个SDI应用程序FontDlg,通过通用字体对话框的调用方便地使用字体。 创建程序,添加菜单项ID_FONT_DLG; 为视图类创建成员变量: CFont m_Font; COLORREF m_ftClr; 为新菜单添加消息处理函数,并添加实现代码(见下页); 在OnDraw()函数中输出字符串,并应用所选择的字体; CFont *pOldFont=pDC-SelectObject(,24,/菜单消息映射函数中的代码/ CFontDialog ftDlg; if (ftDlg.DoModal()=IDOK) m_Font.DeleteObject(); m_Font.CreateFontIndirect(ftDlg.m_cf.lpLogFont); m_ftClr=ftDlg.m_cf.rgbColors; Invalidate(); ,25,四、位图、图标和光标,1、位图 位图是一系列按位排列的数据组成的像素矩阵,每个像素点所对应的数据都是该点的颜色信息。 有两种类型: DDB位图GDI位图,位图的数据结构与具体显示设备有关,显示依赖于调色板。 DIB位图是一种与设备无关的位图,以.bmp为扩展名,比较通用,可方便地通过VC+开发环境将其导入工程中。 MFC只提供了处理DDB位图的类CBitmap.,26,(1) MFC显示位图的步骤及实例 调用CDC类的成员CreateCompatibleDC()创建兼容内存DC; 调用CBitmap类的成员LoadBitmap()装入位图资源,或者调用CreateCompatibleBitmap()函数创建与内存DC兼容的位图; 调用CDC类的成员SelectObject()将位图选入DC; 调用CDC类的成员BitBlt()或StretchBlt()将位图从内存DC中复制至指定显示或打印设备。 实例编程:在ShowBitMap程序中动态显示位图。 方法:先导入位图资源,然后改写OnDraw()函数。,27,CDC MemDC; MemDC.CreateCompatibleDC(/恢复原来的位图对象,28,2、图标 图标(Icon)是应用程序的可视化标识。 图标是特殊形式的位图,一般有16x16, 32x32, 48x48三种尺寸,程序开发时只需要建立前2种尺寸图标。 图标没有专门的MFC类来管理,因此用户图标的显示需要3步编程: 由程序“应用类”的成员LoadIcon()来加载并获得句柄; 由“主框架类”的指针m_pMainWnd调用SetIcon(T/F)来设置图标尺寸; 调用CDC类的成员DrawIcon()来显示图标;,29,实例编程:SDI应用程序MyIcon,在标题栏显示自定义图标,并在程序视图区显示该图标和一个系统预定义图标。 (1) 创建程序,插入图标资源IDI_ICON1, 并导入一图标文件; (2) 在程序InitInstance()中添加显示用户图标的语句: HICON hIcon=AfxGetApp()-LoadCursor(IDI_ICON1); /加载图标 m_pMainWnd-SetIcon(hIcon, TRUE); /设置32x32图标 m_pMainWnd-SetIcon(hIcon, FALSE); /设置16x16图标 (3) 在OnDraw()函数中加入显示两种图标的语句: HICON hIcon=AfxGetApp()-LoadIcon(IDI_ICON1); /加载图标 pDC-DrawIcon(50,10,hIcon); /显示图标 DestroyIcon(hIcon); /释放图标资源 hIcon=AfxGetApp()- LoadStandardIcon(IDI_EXCLAMATION); /加载系统图标 pDC-DrawIcon(150,20,hIcon); /显示图标 DestroyIcon(hIcon); /释放图标资源,30,3、光标 光标(Cursor)是鼠标专用的指示标志,与图标相似,它是一种32x32像素的特殊位图。与图标不同,光标的编辑只能用VC+自带的编辑器来进行,该编辑器为光标专门提供了一个设置“热点”的工具,热点是光标不可缺少的元素,它指示光标的当前位置。 Windows常用3种光标: 箭头(Arrow)、沙漏(Wait)、I形光标(IBeam) 。不同形状的光标指示了程序当前的运行状态。 IDC
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号