《第五章 图形处理.ppt》由会员分享,可在线阅读,更多相关《第五章 图形处理.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章 图形程序处理1本章内容l图形设备接口(图形设备接口(GDI)l画笔和画刷画笔和画刷l文本和字体文本和字体l位图、图标和光标位图、图标和光标2一、图形设备接口(一、图形设备接口(GDI)lGDI是Windows提供的一个支持图形编程处理的抽象接口,它内含各种绘图工具,程序员通过使用这些抽象工具,避免了直接与各式各样的设备硬件打交道,实现了编程中的“设备无关性”。1、GDI概述概述lGDI在图形处理、输出和显示方面是一种全能的编程接口lGDI功能被封装于Gdi32.dll中,包含大量图形处理函数。3视窗APP绘图的一般过程:2、设备环境、设备环境(Device Context,简称简称DC
2、)l程序员要使用GDI,必须先获取一个DC,实则一个设备环境的句柄(HDC),然后由句柄去调用相关的图形绘制函数或设置DC的属性。应应用用程程序序设设备备环环境境GDI设备设备驱驱动动程程序序图形图形输输出出设设备备4l为了满足不同的DC应用要求,MFC将DC封装成几种不同的类,每一种类都封装了相应的设备环境句柄。CDC类CPaintDC类CClientDC类CWindowDC类CMetaFileDC类53、GDI坐标系和映射模式坐标系和映射模式(1)GDI坐标系坐标系l逻辑坐标系是面向DC的坐标系。l设备坐标系是面向显示或打印输出设备的坐标系设备坐标系细分为3种:屏幕坐标系原点在屏幕左上角。
3、可控制窗口在屏幕上的位置。窗口坐标系原点在当前窗口的左上角。很少使用。客户区坐标系原点在客户区左上角,很常用。CDC类提供了两种坐标转换函数:DPtoLP()、LPtoDP()。6l鼠标使用设备坐标系,CDC绘图函数使用逻辑坐标系l用鼠标支配所绘图形应当实施坐标转换 在鼠标左键按下和移动函数中,加入语句:CClientDC dc(this);OnPrepareDC(&dc);/调整DC的属性dc.DPtoLP(&point);(2)GDI映射模式(映射模式(8种)种)8种映射模式:MM_TEXT、MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH
4、、MM_TWIPS、MM_ISOTROPIC、MM_ANISOTROPIC,逻辑单位分别是:1像素、0.1mm、0.01mm、0.01吋、0.001吋、1/1440吋、系统确定。前6种属于“固定比例”的映射方式,不可改变其固有的量纲。74、绘图颜色的设置、绘图颜色的设置lGDI用COLORREF宏存放颜色,它实则一个32位的整型数据:高位字节为0,其余3个字节分别对应于RGB三原色值,每一原色的取值范围均为0255。lCOLORREF宏定义宏定义:RGB(byRed,byGreen,byBlue)COLORREF类型的变量,可以应用于多种绘图函数中,如CDC:SetBkColor()CDC:S
5、etTextColor()8二、画笔和画刷二、画笔和画刷Pen和Brush是GDI中最重要的绘图工具1、GDI对象对象GDI提供了一系列抽象的绘图工具。MFC对GDI对象作了封装,形成了在CGdiObject基类基础上的各种派生类。CPenCBrushCFontCBitmapCPaletteCRgn9l使用绘图工具的步骤:创建GDI对象选择GDI对象使用对象绘图释放GDI对象l通过设置绘图模式,也可以修正绘图的效果,函数为:int SetROP2(int nDrawMode);/函数返回旧模式参数nDrawMode的取值有:R2_BLACK:表示像素为黑色;R2_WHITE:表示像素为白色;R
6、2_NOP:表示像素为无色透明;R2_NOT:表示像素为背景反色;R2_COPYPEN:表示像素为画笔颜色;R2_NOTCOPYPEN:表示像素为画笔颜色的反色;102、使用画笔、使用画笔GDI的画笔工具用于绘制点、线、多边形、矩形、椭圆等几何图形。在DC中使用自定义画笔的三大步骤:创建选用还原。(1)创建画笔创建画笔方法1:CPen pen(PS_DASH,1,RGB(255,0,0);方法2:CPen pen;pen.CreatePen(PS_DASH,1,RGB(255,0,0);11(2)选用画笔选用画笔CPen*pOldPen;/本声明语句可与pen的声明合并 pOldPen=pDC
7、-SelectObject(&pen);(3)还原画笔还原画笔pDC-SelectObject(pOldPen);/恢复原先画笔pen.DeleteObject();/删除自定义GDI画笔,清除内存编程实例:编程实例:创建UsePen程序,选用不同风格和属性绘图。1213CPen*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(
8、60,10,用不同样式的画笔绘图);/输出风格标题for(int i=0;iSelectObject(&pen);pDC-TextOut(10,30+20*i,strStylei);/输出风格字串列pDC-MoveTo(108,40+20*i);pDC-LineTo(208,40+20*i);pDC-SelectObject(pOldPen);/恢复原先画笔pen.DeleteObject();/删除自定义GDI画笔,清除内存/“笔宽”和“笔色“的输出与绘图方式参照上述语句实现/char*strWidth=1,2,3,4,5,6,7,;/char*strColor=红,绿,蓝,黄,紫,青,灰;
9、COLORREF penColor=RGB(255,0,0),RGB(0,255,0),);143、使用画刷、使用画刷(1)创建画刷创建画刷画刷有3种基本类型:纯色、阴影、图案画刷。l创建方式创建方式1:/用构造函数CBrush brush1(RGB(255,0,0);/纯色画刷CBrush brush2(HS_CROSS,RGB(255,0,0);/阴影画刷CBrush brush3(&bmp);/图案画刷,位图要先入内存其中,阴影画刷有6种样式,分别是HS_CROSS,HS_VERTICAL,HS_DIAGCROSS,HS_HORIZONAL,HS_BDIAGONAL,HS_FDIAGON
10、AL。分别表示“十字网”、“竖线纹”、“交叉网”、“水平纹”、“反斜纹”、“正斜纹”。l创建方式创建方式2:/用画刷的创建函数Solid,Hatch,PatternCBrush brush;brush.CreateSolidBrush(RGB(255,0,0);15(2)使用画刷使用画刷编程实例:编程实例:创建对话框应用程序,并重设其背景颜色l先创建UseBrh的基于对话框的应用程序,并为其添加一个CBrush类型的成员变量m_bkColor.l再在对话框的初始化函数中添加创建画刷的语句:m_bkColor.CreateSolidBrush(RGB(0,0,255);l最后用类向导添加WM_C
11、TLCOLOR消息函数,注释掉原语句,然后添加 return m_bkColor;l编译并运行程序。16174、几何图形的绘制函数、几何图形的绘制函数SetPixel()用指定颜色用指定颜色画画“像素像素”点点,返回,返回RGB值值MoveTo()移笔移笔至新坐标,返回旧坐标至新坐标,返回旧坐标LineTo()画直线画直线,返回非,返回非0值值Polyline()依据多点依据多点画折线画折线Polygon()依据多点依据多点画多边形画多边形PolyBezier()依据多点依据多点画贝兹尔曲线画贝兹尔曲线Rectangle()依据两点依据两点画矩形画矩形RoundRect()依据两点圆角及圆角半
12、径依据两点圆角及圆角半径画圆角矩形画圆角矩形Ellipse()依据矩形依据矩形画内切椭圆画内切椭圆或或圆圆Arc(),ArcTo()逆时针逆时针画弧画弧,画弧至终点画弧至终点还有:Pie()画扇形;Chord()画弦;DrawIcon()画图标18画图函数的用法:画图函数的用法:SetPixel()直接用直接用坐标点坐标点;MoveTo()与与LineTo()起止点起止点配合使用;配合使用;Polyline()、Polygon()、PolyBezier()先需要定先需要定义义多个坐标点多个坐标点,然后将其作为首要参数,次要参数为,然后将其作为首要参数,次要参数为坐坐标点数目标点数目。Recta
13、ngle()、RoundRect()参数包括矩形参数包括矩形左上角左上角点和右下角点坐标点和右下角点坐标,后者还需要,后者还需要圆角半径圆角半径参数。参数。Ellipse()需要需要一对坐标点一对坐标点;Arc(),ArcTo()需要至少需要至少2个以上的个以上的偶数坐标点偶数坐标点。19三、文本与字体三、文本与字体1、绘制文本的常用、绘制文本的常用CDC函数函数TextOut()起点坐标,起点坐标,“字符串字符串”DrawText()在矩形区域内输出在矩形区域内输出“多行文本多行文本”ExtDrawText()用指定矩形用指定矩形“剪裁剪裁”多行文本多行文本SetTextColor()设置文
14、本颜色(设置文本颜色(RGB值)值)SetBkColor()设置文本背景颜色(设置文本背景颜色(RGB值)值)SetBkMode()背景模式背景模式(OPAQUE,TRANSPARENT)SetTextAlign()设置文本对齐方式,以设置文本对齐方式,以TA_为前缀为前缀SetTextCharacterExtra()设置字符间距设置字符间距与上述“Set”函数相对应的还有“Get”函数。202、字体概述、字体概述l字体(font)是指采用某种字样的一套字符。字体三要素字样、风格、尺寸。字样指字体的样式和外观;风格字体精细和倾斜度l字体的类型:光栅、矢量、TrueType字体光栅字体矢量字体T
15、rueType字体213、创建逻辑字体、创建逻辑字体lWindows系统带有丰富的字体,需要时可以方便地调用。l逻辑字体:是一种抽象的与设备无关的字体描述,使用时由程序员自己创建。(1)使用使用CreateFont()函数函数函数有14个参数(默认值为0):字高,字宽,行倾斜度(1/10度),字倾斜度(1/10度),粗细(01000),斜体(0/1),下划线(0/1),删除线(0/1),字符集(ANSI_CHARSET等),输出精度,裁剪精度,输出质量,间距和字库族,匹配字样。后5项常取0。实例编程:实例编程:请参阅SDI应用程序RotateText。22(2)使用字体通用对话框使用字体通用对
16、话框实例编程:实例编程:编写一个SDI应用程序FontDlg,通过通用字体对话框的调用方便地使用字体。l创建程序,添加菜单项ID_FONT_DLG;l为视图类创建成员变量:CFont m_Font;COLORREF m_ftClr;l为新菜单添加消息处理函数,并添加实现代码(见下页);l在OnDraw()函数中输出字符串,并应用所选择的字体;CFont*pOldFont=pDC-SelectObject(&m_Font);pDC-SetTextColor(m_ftClr);pDC-TextOut(10,10,“此例使用通用字体对话框动态选择字体!);pDC-SelectObject(pOldF
17、ont);23/菜单消息映射函数中的代码/CFontDialog ftDlg;if(ftDlg.DoModal()=IDOK)m_Font.DeleteObject();m_Font.CreateFontIndirect(ftDlg.m_cf.lpLogFont);m_ftClr=ftDlg.m_cf.rgbColors;Invalidate();24四、位图、图标和光标四、位图、图标和光标1、位图、位图位图位图是一系列按位排列的数据组成的像素矩阵,每个像素点所对应的数据都是该点的颜色信息。有两种类型:DDB位图位图GDI位图,位图的数据结构与具体显示设备有关,显示依赖于调色板。DIB位图位图
18、是一种与设备无关的位图,以.bmp为扩展名,比较通用,可方便地通过VC+开发环境将其导入工程中。MFC只提供了处理DDB位图的类CBitmap.25(1)MFC显示位图的步骤及实例显示位图的步骤及实例调用CDC类的成员CreateCompatibleDC()创建兼容内存DC;调用CBitmap类的成员LoadBitmap()装入位图资源,或者调用CreateCompatibleBitmap()函数创建与内存DC兼容的位图;调用CDC类的成员SelectObject()将位图选入DC;调用CDC类的成员BitBlt()或StretchBlt()将位图从内存DC中复制至指定显示或打印设备。实例编程
19、:实例编程:在ShowBitMap程序中动态显示位图。方法:方法:先导入位图资源,然后改写OnDraw()函数。26CDC MemDC;MemDC.CreateCompatibleDC(&dc);/创建内存DCCBitmap Bitmap,*pOldBitmap;Bitmap.LoadBitmap(IDB_BITMAP1);/装入位图资源pOldBitmap=MemDC.SelectObject(&Bitmap);/位图选入DCBITMAP bm;Bitmap.GetObject(sizeof(BITMAP),&bm);/读取位图数据dc.BitBlt(0,0,bm.bmWidth,bm.bm
20、Height,&MemDC,0,0,SRCCOPY);/绘制位图MemDC.SelectObject(pOldBitmap);/恢复原来的位图对象272、图标、图标图标图标(Icon)是应用程序的可视化标识。l图标是特殊形式的位图,一般有16x16,32x32,48x48三种尺寸,程序开发时只需要建立前2种尺寸图标。l图标没有专门的MFC类来管理,因此用户图标的显示需要3步编程:由程序“应用类”的成员LoadIcon()来加载并获得句柄;由“主框架类”的指针m_pMainWnd调用SetIcon(T/F)来设置图标尺寸;调用CDC类的成员DrawIcon()来显示图标;28实例编程实例编程:S
21、DI应用程序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()-L
22、oadIcon(IDI_ICON1);/加载图标pDC-DrawIcon(50,10,hIcon);/显示图标DestroyIcon(hIcon);/释放图标资源hIcon=AfxGetApp()-LoadStandardIcon(IDI_EXCLAMATION);/加载系统图标pDC-DrawIcon(150,20,hIcon);/显示图标DestroyIcon(hIcon);/释放图标资源293、光标、光标光标光标(Cursor)是鼠标专用的指示标志,与图标相似,它是一种32x32像素的特殊位图。与图标不同,光标的编辑只能用VC+自带的编辑器来进行,该编辑器为光标专门提供了一个设置“热点”
23、的工具,热点是光标不可缺少的元素,它指示光标的当前位置。lWindows常用3种光标:箭头(Arrow)、沙漏(Wait)、I形光标(IBeam)。不同形状的光标指示了程序当前的运行状态。IDC_CROSS十字十字;IDC_UPARROW向上箭头向上箭头;IDC_SIZE带小方形带小方形;IDC_SIZEALL四方箭头四方箭头;IDC_SIZENWSE西北西北-东南箭头东南箭头;IDC_SIZENESW东北东北-西南箭头西南箭头;IDC_SIZENS南北箭头南北箭头;IDC_SIZEWE东西箭头。东西箭头。30实例编程:实例编程:SDI应用程序MyCursor,当光标移到客户区时,显示自定义光
24、标形状,移到用户对话框内部时,光标变成系统预定义的四向箭头。(1)创建程序,创建用户光标IDC_HAND,设置热点;(2)为视图类添加WM_SETCURSOR消息处理函数,加代码HCURSOR hCursor=AfxGetApp()-LoadCursor(IDC_HAND);SetCursor(hCursor);return TRUE;(3)添加“使用系统光标”的Dialog资源,创建Dlg类,并添加WM_SETCURSOR消息处理函数,加代码:代码与(2)相似,函数改为LoadStandardCursor(IDC_SIZEALL)(4)创建新菜单项调用对话框,在消息处理函数中加代码:CMyDlg dlg;dlg.DoModal();31