1、GDI与MFC n概述 nGDI Windows图形设备接口n绘图三大要素画布、绘图工具、绘图动作 nDC GDI将画布和绘图工具合在一起称为DC或“设备描述表”nGDI对象类MFC将GDI中的绘图工具封装到CGdiObject类中,称为GDI对象类 1.CDC 类MFC将画布、绘图动作和GDI对象封装到CDC类中,称为设备环境类1.MFC程序中的绘图方法:1.取得CDC对象、2.创建并选择CGdiObject对象、将CGdiObject对象附加到CDC对象、使用该CDC对象的绘图成员函数绘制图形 1GDI与MFC n设备环境类 nCPaintDC n通常以窗口内用户区为目标,可以在窗口内绘制
2、图形,适用于在接到WM_PAINT消息时进行绘图操作 n创建方法CPaintDC dc(this)nCClientDC n通常以窗口内用户区为目标,可以在窗口内绘制图形,适用于在未接到WM_PAINT消息时,“主动”进行绘图操作 n创建方法CClientDC dc(this);nCWindowDC n通常以整个窗口为目标,可以在整个窗口(含边框)上绘制图形,用法与CClientDC相同,只是绘制范围更大 n创建方法CWindowDC dc(this)nCMetaFileDC n通常用于创建Windows图元文件 2GDI与MFC nGDI对象类 nCPen类 n该类封装一个Win32画笔对象。
3、画笔对象可用于画线及绘制有形边框,并可以指定它的颜色、粗细、虚实等属性 nCBrush类 n该类封装一个Win32画刷对象。画刷对象定义了一种位图形式的画笔,可用于对区域内进行填充等操作 nCBitmap类 n该类封装一个Windows位图对象,位图对象可以用来进行显示图像和创建画刷等操作nCPalette类 n该类封装一个Windows调色板对象。调色板对象提供了一个从应用程序到颜色输出设备的接口,在某些场合使用它可以改善颜色显示效果nCRgn类 n该类封装一个Windows区域对象。一个区域一般是窗口之中的一个椭圆形的或者多边形的区域。区域对象可用于剪裁、填充及判断等操作 3绘制图形-开始
4、绘图 n画一条直线 pDC-MoveTo(CPoint(10,10);pDC-LineTo(CPoint(55,30);n绘制一个矩形 pDC-Rectangle(CRect(10,60,55,90);n绘制弧 pDC-Arc(CRect(10,120,55,150),/圆弧外接矩形CPoint(10,120),/用来计算实际起点CPoint(55,120);/用来计算实际终点 n绘制椭圆或圆 pDC-Ellipse(CRect(255,10,310,30);n绘制饼图 pDC-Pie(CRect(255,60,310,90),CPoint(255,60),CPoint(310,60);4绘制
5、图形-开始绘图 n绘制指定风格的矩形 pDC-DrawEdge(CRect(255,120,310,150),EDGE_BUMP,BF_RECT);n绘制一系列相邻的线 CPoint pt4;pt0=CPoint(500,10);pt1=CPoint(515,15);pt2=CPoint(520,20);pt3=CPoint(560,30);pDC-Polyline(pt,4);n绘制一个封闭多边形 CPoint pt4;pt0=CPoint(500,60);pt1=CPoint(555,60);pt2=CPoint(535,70);pt3=CPoint(555,90);pDC-Polygon
6、(pt,4);n绘制圆角矩形 pDC-RoundRect(CRect(5,185,50,215),CPoint(15,15);5绘制图形-更改画笔 nCPenn画笔可用于绘制线条、曲线以及勾勒形状轮廓n通过修改画笔的属性可以更改线条的外观和颜色 nCPen用法 n创建画笔对象 n指定画笔的属性 n将画笔附加到CDC对象 n绘制图形 n编码CPen*pOldPen;CPen NewPen(PS_DASHDOTDOT,1,RGB(255,0,0);pOldPen=pDC-SelectObject(&NewPen);/绘图pDC-SelectObject(pOldPen);/恢复原画笔6绘制图形-使
7、用画刷 nCBrush n画刷可用于在封闭图形内以指定风格进行填充n画刷类型:原色画刷、阴影画刷和位图画刷 nCPen用法 n创建画刷对象 n指定画刷的属性 n将画刷附加到CDC对象 n绘制图形 n编码CBrush*pOldBrush;CBrush NewBrush(RGB(255,0,0);pOldBrush=pDC-SelectObject(&NewBrush);/绘图pDC-SelectObject(pOldBrush);/恢复原画笔 7绘制图形-使用位图 nCBitmap nCBitmap可用于显示、操作Windows位图n位图可以程序创建也可以作为资源载入n使用程序创建位图(了解)n
8、使用资源位图n添加位图资源IDB_BITMAP1 n显示位图代码CBitmapBitmap;Bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bm;Bitmap.GetObject(sizeof(BITMAP),&bm);/取得图片信息CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap*pOldBitmap=MemDC.SelectObject(&Bitmap);pDC-BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);MemDC.SelectObject(pOldB
9、itmap);8输出文本 n输出文本n在指定位置输出字符串 pDC-TextOut(10,10,使用TextOut输出);n在指定矩形区域内输出字符串int x=50,45,40,35,30,25,20,15,15,15,15,15,15,15,15,15;pDC-ExtTextOut(10,50,ETO_CLIPPED,CRect(0,40,600,62),“使用ExtTextOut输出,x);n更改颜色 n设置文本颜色 COLORREF OldColor,NewColor=RGB(255,0,0);OldColor=pDC-SetTextColor(NewColor);/输出文本pDC-S
10、etTextColor(OldColor);/恢复原文本颜色n设置文本背景颜色 COLORREF OldColor,NewColor=RGB(255,0,0);OldBkColor=pDC-SetBkColor(NewColor);/输出文本pDC-SetBkColor(OldColor);/恢复原文本颜色n设置背景模式 CDC:SetBkMode(int nBkMode)9输出文本 n更改字型、字体 nCFont类封装了GDI中的字体对象 n使用字体的方法如下 n先创建CFont对象;n对字体对象进行初始化;n附加到CDC对象;n使用文本输出函数输出文字n创建、使用简单字体 CFont My
11、Font1,MyFont2,*pOldFont;MyFont1.CreatePointFont(300,隶书,pDC);/MyFont1需定义为CMyTextView成员对象MyFont2.CreatePointFont(350,黑体,pDC);/MyFont2需定义为CMyTextView成员对象pDC-TextOut(10,20,使用系统默认字体、默认输出尺寸输出);pOldFont=pDC-SelectObject(&MyFont1);pDC-TextOut(10,50,使用隶书输出,尺寸=30磅);pDC-SelectObject(&MyFont2);pDC-TextOut(10,12
12、0,使用黑体输出,尺寸=35磅);pDC-SelectObject(pOldFont);10输出文本 n创建、使用复杂字体方法一 CFont*pOldFont,MyFont;MyFont.CreateFont(50,25,45,0,FW_BOLD,1,1,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DRAFT_QUALITY,DEFAULT_PITCH|FF_SCRIPT,隶书);pOldFont=pDC-SelectObject(&MyFont);pDC-TextOut(10,70,使用CreateFont建立字体输出);p
13、DC-SelectObject(pOldFont);11输出文本 n创建、使用复杂字体方法二 CFont*pOldFont,MyFont;LOGFONT lf;pOldFont=pDC-GetCurrentFont();:GetObject(:GetStockObject(SYSTEM_FONT),sizeof(LOGFONT),&lf);lf.lfItalic=1;lf.lfWidth=20;MyFont.CreateFontIndirect(&lf);pOldFont=pDC-SelectObject(&MyFont);pDC-TextOut(10,70,字体修改后的输出);pDC-Sel
14、ectObject(pOldFont);12坐标与坐标模式 n坐标模式 nCDC:SetMapModee(int nMapMode)n窗口和视口 nSetWindowOrg(POINT point)/设置窗口左上角值nSetWindowExt(SIZE size)/设置窗口的大小nSetViewportOrg(POINT point)/设置视口左上角值SetViewportExt(SIZE size)/设置视口的大小nMM_ANISOTROPIC坐标模式CRect clientRect;GetClientRect(clientRect);pDC-SetMapMode(MM_ANISOTROPI
15、C);pDC-SetWindowOrg(0,0);pDC-SetWindowExt(500,500);pDC-SetViewportOrg(0,0);pDC-SetViewportExt(clientRect.right,clientRect.bottom);13坐标与坐标模式 nMM_ISOTROPIC坐标模式CRect clientRect;GetClientRect(clientRect);pDC-SetMapMode(MM_ISOTROPIC);pDC-SetWindowOrg(0,0);pDC-SetWindowExt(500,500);pDC-SetViewportOrg(0,0)
16、;pDC-SetViewportExt(clientRect.right,clientRect.bottom);14坐标与坐标模式 n平移坐标CRect clientRect;GetClientRect(clientRect);pDC-SetMapMode(MM_ISOTROPIC);pDC-SetWindowOrg(200,0);pDC-SetWindowExt(500,500);pDC-SetViewportOrg(0,0);pDC-SetViewportExt(clientRect.right,clientRect.bottom);15坐标与坐标模式 n修改坐标方向CRect clien
17、tRect;GetClientRect(clientRect);pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowOrg(0,0);pDC-SetWindowExt(clientRect.right,-clientRect.bottom);pDC-SetViewportOrg(0,clientRect.bottom);pDC-SetViewportExt(clientRect.right,clientRect.bottom);pDC-MoveTo(0,0);pDC-TextOut(0,16,(0,0);pDC-LineTo(300,200);pDC-Tex
18、tOut(300,200,(300,200);pDC-LineTo(600,120);pDC-TextOut(600,120,(600,120);16习题 1.GDI绘图有哪几大要素?2.有哪几种设备环境类,各有什么用处?3.GDI有哪几类绘图工具?4.有哪几种坐标模式,各有什么特点?5.简述使用绘图工具类对象的步骤。6.有哪几种显示文字的函数,各有什么功能?7.编写一个程序显示一象棋棋盘,棋盘上有棋子,棋盘两侧有对弈者头像和名字(名字自取)。要求只有棋子和对弈者头像可以使用图片,画面要美观。8.2014年美国GDP 为16万亿美元,中国GDP为9万亿美元,假设未来一段时间内,美国GDP每年以2.5%速度增长,中国GDP每年以7%速度增长,绘制从2014年到2049年两国GDP增长曲线。要求设置视图左下角为坐标原点,并绘制坐标轴。9.创建一个文本文件,编辑录入若干个点的坐标,编写程序读入该文件中这些点的坐标,设置窗口右为x轴正方向,向上为y轴正方向。要求显示全部这些点并绘制坐标轴。在9题的基础上,从第一个点到最后一个点画路径连接所有的点,使得从第一个点到最后一个点且连接所有点的路径总长度最短17
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。