VC6.0绘图基础

上传人:枫** 文档编号:569264985 上传时间:2024-07-28 格式:PPT 页数:126 大小:1.38MB
返回 下载 相关 举报
VC6.0绘图基础_第1页
第1页 / 共126页
VC6.0绘图基础_第2页
第2页 / 共126页
VC6.0绘图基础_第3页
第3页 / 共126页
VC6.0绘图基础_第4页
第4页 / 共126页
VC6.0绘图基础_第5页
第5页 / 共126页
点击查看更多>>
资源描述

《VC6.0绘图基础》由会员分享,可在线阅读,更多相关《VC6.0绘图基础(126页珍藏版)》请在金锄头文库上搜索。

1、VC+6.0VC+6.0绘图基础绘图基础上机周五5-6节1125国庆后开始国庆后开始本章学习目标MFC上机操作步骤VC+6.0基本绘图函数本章内容2.2 MFC上机操作步骤2.3 基本绘图函数2.4 本章小结习题2.2 MFC上机操作步骤关于工具Visual C+ 6.0是目前使用极为广泛的可视化编程平台。使用VC+语言开发的图形,与使用Turbo C语言开发的图形相比,不仅可以显示真彩色,而且可以实现交互式绘图。Microsoft Foundation Class Library微软基类库MFC是以C+形式封装的Windows API(Application Program Interfac

2、e)包含了一百多个已经定义好的常用类 MFC上机操作过程启动Microsoft Visual C+ 6.0从【File】菜单中选择【New】命令,弹出【New】对话框,切换到【Projects】选项卡。在左边窗口中选择MFC AppWizard(exe),在右边的Projects name文本框中键入应用程序名,这里输入Test,在Location文本框中出现用于存放应用程序的根目录,这里设置为D:Test。其余保持默认值。如图所示。单击【OK】按钮。在对话框【MFC AppWizard-Step1】中,选中Single Document单选按钮,其余保持默认值,如图所示。单击【Finish】

3、按钮结束。完成上述步骤后,应用程序Test的框架即被生成,出现程序工作区。如图所示。在工作区的【ClassView】面板中显示所创建的类和成员函数 在【Resource View】面板中显示所创建的资源 在【FileView】面板中显示源程序文件,主要包括程序源文件(*.CPP) 、头文件(*.h) 和资源文件(*.ico、*.bmp等) 从【ClassView】面板可以看出CTestApp是应用的主函数类,用来处理消息。MFC中的数据是存储在CTestDoc类文档中结果的显示是在CTestView类中文档类负责管理和维护数据本身视图类负责处理用户鼠标和键盘的操作全部展开FileView面板后

4、,显示如图的界面内容后续编程过程中一般使用的是CTestView类的TestView.h头文件和TestView.cpp源文件。OnDraw(CDC* pDC)函数void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC定义为CDC类的指针。pDoc通过GetDocument()函数得到了指向文档类CTestDoc的指针。OnDraw(CDC* pDC)函数void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();AS

5、SERT_VALID(pDoc);ASSERT_VALID(pDoc)函数使pDoc指针有效。使用pDC指针,可以对CDC类的成员函数进行操作。注意:OnDraw函数是由系统框架直接调用的,程序一运行就会自动执行。!按钮点击工具条上的 “!”按钮,就可以直接编译、运行程序尽管未编写一句代码,但Test程序已经形成一个可执行程序框架2.3 基本绘图函数在Windows平台上,应用程序的图形设备接口(Graphics Device Interface,GDI)被抽象化为设备上下文设备上下文(Device Content,DC) 在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数

6、都在CDC基类中定义。2.3 基本绘图函数2.3.1 CDC类结构和GDI对象2.3.2 映射模式2.3.3 CDC类的主要绘图成员函数2.3.4 设备上下文的调用和释放2.3.5 VC+绘制图形的几种方法2.3.1 CDC类结构和GDI对象1. CDC类CDC类有4个派生类CClientDC类显示器客户区设备上下文类CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏的空白区域)进行绘图点(0,0)是客户区的左上角其构造函数调用GetDC函数其析构函数调用ReleaseDC函数CMetaFileDC类Windows图元文件设备上下文类CMetaFileDC封装了在一个W

7、indows图元文件中绘图的方法图元文件是一系列与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用例如,AutoCAD中的图像保存等。CPaintDC类成员函数OnPaint中使用的显示器上下文类CPaintDC只在处理WM_PAINT消息中使用,用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)的指针来使用CPaintDC类的构造函数会自动调用CWnd:BeginPaintCPaintDC类的析构函数则会自动调用CWnd:EndPaint CWindowDC类整个窗口区域的显示器设备上下文类,包括客户区和非客户区CWindowDC

8、允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角其构造函数调用GetWindowDC其析构函数调用ReleaseDC2. 常用绘图类常用绘图类常用绘图类CPoint类:存放点坐标(x,y)。CRect类:存放矩形左上角顶点和右下角顶点的坐标(top,left,right,bottom)CSize类:存放矩形的宽度和高度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的高度。3. 绘图工具类绘图工具类绘图工具类CGdiObject类:GDI绘图工具的基类,一般不能直接使用。CBitmap:封装了一个GDI位图,提供位图操作的接口。CBrush类:封装了GDI画刷,可以选作设备

9、上下文的当前画刷。画刷用于填充图形内部。绘图工具类CFont:封装了GDI字体,可以选作设备上下文中的当前字体。CPallette:封装了GDI调色板,提供应用程序和显示器之间的颜色接口。CPen:封装了GDI画笔,可以选作设备上下文的当前画笔。画笔是用于绘制图形边界线。2.3.2 映射模式把图形显示在屏幕坐标系中的过程称为映映射射根据映射模式的不同可以分为逻辑坐标逻辑坐标:单位是米制尺度或其它与字体相关的尺度设备坐标设备坐标:单位是像素窗口和视区(视口)数据显示和图形绘制并不是直接在屏幕上进行的,而是首先将图形绘制到一个具有逻辑坐标系的虚拟窗口中,然后再根据预先设置好的映射模式,将虚拟窗口中

10、的图形或图像映射到屏幕或打印机等设备中。这个虚拟的窗口被称作窗口(windows),显示图像的设备就是视区(Viewport),对应着实际的屏幕或打印机。逻辑坐标和设备坐标换算的步骤1 设置映像模式2 设置窗口原点3 设置视口原点4 坐标换算(由Windows系统内置的程序来完成,我们只做前3步)映射模式模式代码坐标单位坐标系特征MM_TEXT一个像素设备坐标。屏幕左上角为坐标原点,X轴向右,Y轴向下。MM_LOMETRIC0.1mm逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_HIMETRIC0.01mm逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_LOENG

11、LISH0.01inch逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_HIENGLISH0.001inch逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。映射模式模式代模式代码坐坐标单位位坐坐标系特征系特征MM_TWIPS1/440inch或1/20点逻辑坐标。坐标原点位置可以自由设置,X轴向右,Y轴向上。MM_ISOTROPIC用户自定义,X轴和Y轴比例相等逻辑坐标。坐标原点位置可以自由设置,X轴和Y轴方向自定义。MM_ANSIOTROPIC用户自定义,X轴和Y轴比例独立设置逻辑坐标。坐标原点位置可以自由设置,X轴和Y轴方向自定义。映射模式在缺省情况下,一般使用的是设

12、备坐标系MM_TEXT,坐标原点位于客户区的左上角,X轴水平向右,Y轴垂直向下,坐标基本单位为一个像素。 1. 设置映射模式函数类属:CDC:SetMapMode原型:virtual int SetMapMode(int nMapMode );返回值:原映射模式。参数说明:nMapMode是表2-1的模式代码。2. 设置窗口范围函数类属:CDC:SetWindowExt 原型:virtual CSize SetWindowExt ( int cx, int cy );返回值:原窗口范围的CSize对象。参数说明:cx窗口x范围的逻辑坐标,cy窗口y范围的逻辑坐标。3. 设置视区范围函数类属:C

13、DC:SetViewportExt 原型:virtual CSize SetViewportExt( int cx, int cy );返回值:原视区范围的CSize对象。参数说明:cx视区x范围的逻辑坐标,cy视区范围的逻辑坐标。4. 设置窗口坐标原点函数类属:CDC:SetWindowsOrg 原型:virtual CPoint SetWindowsOrg( int x, int y );返回值:原窗口原点的CPoint对象。参数说明:参数x,y是窗口的新原点坐标。 5. 设置视区坐标原点函数类属:CDC:SetViewportOrg 原型:virtual CPoint SetViewpo

14、rtOrg( int x, int y );返回值:原视区原点的CPoint对象。参数说明:参数x,y是视区的新原点坐标。 当使用MM_ANISOTROPIC和MM_ISOTROPCI模式时,需要调用SetWindowExt和SetViewportExt函数,其他模式不需要调用2.3.3 CDC类的主要绘图成员函数 1. 绘制像素函数类属:CDC:SetPixel 原型:COLORREF SetPixel(int x,int y,COLORREF crColor );设置某像素点的RGB值1. 绘制像素函数参数说明:SetPixel 函数中,COLORREF是32位颜色数据类型;第一和第二个参

15、数x,y是像素点位置的逻辑坐标值,第三个参数crColor是像素点的颜色值,COLORREF型变量可以利用RGB(bRed,bGreen,bBlue)来指定相应的颜色值,每种颜色用一个字节表示,可以被设定为0255之间的任意值,0代表无色,代表无色,255代表全色代表全色。 2. 获取像素颜色函数类属:CDC:GetPixel 原型:COLORREF GetPixel(int x,int y)const;返回值:指定像素的RGB值。参数说明:得到指定像素的RGB颜色值例2-4在屏幕的(20,20)坐标位置处绘制一个红色像素点。然后取出该像素点的颜色,在屏幕的(60,20)坐标处绘制一个相同颜色

16、的像素点。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);COLORREF c;pDC-SetPixel(20,20,RGB(255,0,0);c=pDC-GetPixel(20,20);pDC-SetPixel(60,20,c);语句:COLORREF c;注释:变量c用于存放像素点的颜色值语句:pDC-SetPixel(20,20,RGB(255,0,0);注释:在屏幕的(20,20)坐标位置处,绘制一个红色的像素点语句: c=pDC-GetPixel(20,20);注释: c

17、保存该像素点的颜色语句: pDC-SetPixel(60,20,c);注释:在像素点(60,20)处以颜色值c绘制一个像素点。3. 画笔函数画笔是用来绘制直线直线、曲线曲线或图形的边界图形的边界线线,是绘图工具类之一画笔通常具有线型线型、宽度宽度和颜色颜色三种属性画笔的线型通常有实线实线、虚线虚线、点线点线、点点划线划线、双点划线双点划线、不可见线不可见线和内框架线内框架线7种,这些线型都是以PS_为前缀的预定义标识符3. 画笔函数默认的画笔是一个像素单位的黑色实线要想更换画笔,可以在创建新画笔对象后,将其选入设备上下文,就可使用新画笔进行绘图。画笔的风格 风格代格代码线型型宽度度颜色色PS_

18、SOLID实线任意指定纯色PS_DASH虚线1(不可任意指定)纯色PS_DOT点线1(不可任意指定)纯色PS_DASHDOT点划线1(不可任意指定)纯色PS_DASHDOTDOT双点画线 1(不可任意指定)纯色PS_NULL不可见线 1(不可任意指定)纯色PS_INSIDEFRAME内框架线 任意指定纯色(1)创建画笔函数类属:CPen:CreatPen 原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);返回值:非零。参数说明:第一个参数nPenStyle是画笔的风格代码第二个参数nWidth是画笔的宽度第三个参数crCo

19、lor是画笔的颜色。(2)选择画笔函数类属:CPen:SelectObject 原型:CPen *SelectObject(CPen *pPen);返回值:被替代画笔的指针。参数说明:参数pPen是CPen类的被选中的新画笔对象指针。本函数把原画笔换成新画笔,同时返回指向原画笔的指针。(3)删除画笔函数类属:CGdiObject:DeleteObject 原型:BOOL DeleteObject( );返回值:非零。参数说明:画笔使用完毕,把已成自由状态的画笔从系统内存中清除。(4)选择一支库画笔函数类属:CDC:SelectStockObject 原型:virtual CGdiObject

20、*SelectStockObject(int nIndex);返回值:被替代的CGdiObject类对象的指针。 (4)选择一支库画笔函数参数说明:参数nIndex是库笔代码Windows系统中准备了一些使用频率较高的画笔,不需要创建,可以直接选用。同样,使用完库画笔时也不需要调用DeleteObject()函数从内存中删除已使用过的画笔。三种常用库笔 库笔代笔代码含含义BLACK_PEN宽度为1的黑笔实线笔WHITE_PEN宽度为1的白笔实线笔NULL_PEN透明笔4. 画刷函数VC+中的画刷用于对图形内部进行填充对图形内部进行填充,也是绘图工具类之一在使用VC+的画刷之前必须先创建或选择画

21、刷对象。画刷函数创建实体画刷函数BOOL CreateSolidBrush(COLORREF crColor );选择画刷函数CBrush *SelectObject(CBrush *pBrush );删除画刷函数BOOL DeleteObject( );创建阴影画刷函数BOOL CreateHatchBrush(int nIndex,COLORREF crColor);第一个参数nIndex是阴影样式代码第二个参数crColor是阴影线的颜色选择一只库画刷函数virtual CGdiObject *SelectStockObject(int nIndex);5. 绘制直线函数设置直线的起点位

22、置CPoint MoveTo(int x,int y);设置直线的终点位置BOOL LineTo (int x,int y);参数说明:采用起点闭区间,终点开区间起点闭区间,终点开区间的处理方法绘制直线的函数不指定直线的颜色,直线颜色可以通过画笔函数来指定。例2-5从屏幕的(20,30)到(200,300)画一条一像素宽的蓝色直线。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CPen MyPen,*OldPen; MyPen.CreatePen(PS_SOLID,1,RGB(0

23、,0,255); OldPen=pDC-SelectObject(&MyPen);pDC-MoveTo(20,30);pDC-LineTo(200,300);pDC-SelectObject(OldPen);/还原MyPen.DeleteObject();程序解释pDC-MoveTo(20,30);移动画笔到(20,30)pDC-LineTo(200,300);从(20,30)画线到(200,300)pDC-SelectObject(OldPen);还原6. 绘制矩形函数类属:CDC:Rectangle 原型:BOOL Rectangle(int x1,int y1,int x2,int y2

24、);返回值:非零。参数说明:该函数使用当前画刷填充矩形内部,并用当前画笔绘制矩形边界线。例2-6绘制左上角点为(100,100),右下角点为(600,300)的矩形。矩形边框为一像素宽的蓝色边界线,内部填充红色void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CPen MyPen, *OldPen; MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255); OldPen=pDC-SelectObject(&MyPen); CBrush MyBrush,*Old

25、Brush;MyBrush.CreateSolidBrush(RGB(255,0,0);OldBrush=pDC-SelectObject(&MyBrush);pDC-Rectangle(100,100,600,300);/画矩形pDC-SelectObject(OldPen); MyPen.DeleteObject();pDC-SelectObject(OldBrush); MyBrush.DeleteObject();7. 绘制椭圆函数类属:CDC:Ellipse 原型:BOOL Ellipse(int x1,int y1,int x2,int y2);返回值:非零。参数说明:Ellips

26、e函数中,参数x1,y1是限定椭圆范围的外接矩形左上角点的坐标;参数x2,y2是限定椭圆范围的外接矩形右下角点的坐标注意VC+中没有专门的画圆函数,只是把圆绘制为长半轴和短半轴相等的椭圆。Ellipse函数使用当前画刷填充椭圆内部,并用当前画笔绘制椭圆边界线。例2-7将一个圆绘制在视区中央,圆的形状依据视区形状而定。当窗口的形状发生改变时,圆的形状也随之改变。坐标系的中点位于屏幕中心,X轴向右,Y轴向上。圆的边界为一像素宽的蓝色边界线,内部填充为红色。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VAL

27、ID(pDoc);CRect Rect; /定义矩形对象GetClientRect(&Rect); /获得当前窗口的客户区大小pDC-SetMapMode(MM_ANISOTROPIC); /设置MM_ANISOTROPIC映射模式 pDC-SetWindowExt(Rect.Width(),-Rect.Height(); /设置窗口范围pDC-SetViewportExt(Rect.right,-Rect.bottom); /设置视区范围pDC-SetViewportOrg(Rect.right/2,Rect.bottom/2); /设置视口原点CPen MyPen,*OldPen; MyP

28、en.CreatePen(PS_SOLID,1,RGB(0,0,255); OldPen=pDC-SelectObject(&MyPen);CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(255,0,0);OldBrush=pDC-SelectObject(&MyBrush);pDC-Ellipse(-Rect.right/2, -Rect.bottom/2,Rect.right/2,Rect.bottom/2);pDC-SelectObject(OldPen); MyPen.DeleteObject();pDC-SelectObje

29、ct(OldBrush); MyBrush.DeleteObject(); 8. 绘制圆弧函数BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);参数说明:Arc函数中参数x1,y1是限定圆弧范围的外接矩形左上左上角点坐标参数x2,y2是限定圆弧范围的外接矩形右下右下角点坐标参数x3,y3为圆弧起点坐标起点坐标,该参数不一定严格位于圆弧上参数x4,y4为圆弧终点坐标终点坐标,该参数也不一定严格位于圆弧上圆弧按逆时针方向按逆时针方向绘制的。该函数使用当前画笔绘制圆弧边界线。由于圆弧可能不封闭,所以圆弧不进行填充。例8

30、 绘制第一象限内的椭圆弧void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CPen MyPen,* OldPen; MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255); OldPen=pDC-SelectObject(&MyPen); pDC-Arc(100,100,600,300,100,200, 350,600); pDC-SelectObject(OldPen); MyPen.DeleteObject();9. 绘制多边形函数BOOL Poly

31、gon(LPPOINT lpPoints,int nCount);参数说明:第一个参数lpPoints指定多边形顶点数组中每一个顶点是一个POINT结构或CPoint对象第二个参数nCount指定多边形数组中的顶点个数该函数用当前画笔绘制多边形边界线,用当前画刷填充多边形内部。例2-9绘制四个顶点分别位于视区上部中点、右部中点、下部中点和左部中点的菱形。边界线为蓝色,内部用红色填充void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);CRect Rect;GetClientRect(&

32、Rect); /获得客户区CPen PenBlue(PS_SOLID, 5, RGB(0, 0, 255); /定义粗蓝色画笔,绘制边界线CPen* OldPen=pDC-SelectObject(&PenBlue); /选取画笔CBrush BrushRed(RGB(255, 0, 0); /定义红色画刷,填充多边形内部CBrush* OldBrush = pDC-SelectObject(&BrushRed); /选取画刷CPoint p4; /定义多边形顶点数组p0.x=Rect.left+Rect.Width()/2; p0.y=Rect.top; /计算顶部中点p1.x=Rect.r

33、ight; p1.y=Rect.top+Rect.Height()/2; /计算右部中点p2.x=p0.x; p2.y=Rect.bottom; /计算下部中点p3.x=Rect.left; p3.y=p1.y; /计算左部中点pDC-Polygon(p, 4);/绘制多边形pDC-SelectObject(OldPen);pDC-SelectObject(OldBrush);10. 填充函数void FillRect(LPCRECT lpRect,CBrush *pBrush);参数说明:第一个参数lpRect指定矩形,是一个Rect结构或CRect对象第二个参数pBrush指定画刷对象指针

34、。该函数将用当前画刷填充矩形内部,但不画边界线。例2-10绘制(100,100)和(400,200)确定的红色矩形。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect Rect;CBrush pBrush(RGB(255,0,0);CBrush* OldBrush=pDC-SelectObject(&pBrush); /定义红色画刷Rect.left=100; Rect.top=100; Rect.right=400; Rect.bottom=200;pDC-FillRec

35、t(Rect,&pBrush);/选择填充矩形内部pDC-SelectObject(OldBrush);11. 路径函数打开路径BOOL BeginPath();关闭路径图BOOL EndPath();填充路径BOOL FillPath();例2-11绘制两个多边形,一个使用路径填充,另一个不使用路径填充,试观察结果的异同。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/绘制第一个多边形,用路径填充图 CPoint p7; /定义顶点数组 p0=CPoint(340,240);

36、p1=CPoint(260,160); p2=CPoint(220,260); p3=CPoint(260,370); p4=CPoint(320,300); p5=CPoint(360,380); p6=CPoint(440,220); CBrush MyBrush;MyBrush.CreateSolidBrush(RGB(255,0,0);CBrush *OldBrush=pDC- SelectObject(&MyBrush);pDC-BeginPath();pDC-MoveTo(p0);/绘制多边形for(int i=1;iLineTo(pi);pDC-LineTo(p0);pDC-En

37、dPath();pDC-FillPath();pDC-SelectObject(OldBrush);MyBrush.DeleteObject();/绘制第二个多边形,用画刷填充 p0=CPoint(740,240); p1=CPoint(660,160); p2=CPoint(620,260); p3=CPoint(660,370); p4=CPoint(720,300); p5=CPoint(760,380); p6=CPoint(840,220);MyBrush.CreateSolidBrush(RGB(255,0,0);OldBrush=pDC-SelectObject(&MyBrush

38、);pDC-Polygon(p,7);pDC-SelectObject(OldBrush);MyBrush.DeleteObject();12. 位图函数导入位图BOOL LoadBitmap(UINT nIDResource );参数nIDResource是资源的ID编号建立与位图相应的内存设备上下文virtual BOOL CreateCompatibleDC( CDC* pDC );参数pDC是设备上下文的指针,用于在向屏幕输出图形前作准备。位图函数选择位图函数CBitmap *SelectObject( CBitmap *pBitmap );参数pBitmap是CBitmap类的被选中

39、的新位图指针对象。把原位图换成新位图,同时返回指向原位图的指针。位图函数传送位图函数BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );参数x,y是目标区域的左上角点坐标参数nWidth和nHeight是目标区域的宽度和高度参数pSrcDC是源设备上下文的指针参数xSrc和ySrc是源位图的左上角点坐标参数dwRop是光栅操作码例如dwRopSRCCOPY,表示将原位图直接拷贝到目标位图。例2-12 在屏幕上显示一幅位图原始位图 例12效果图void

40、 CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); CRect Rect;/定义客户区 GetClientRect(&Rect);/获得客户区的大小 CDC MemDC;/定义一个内存设备上下文对象 CBitmap Bitmap,*OldBitmap; /定义一个CBitmap对象和一个CBitmap对象指针 Bitmap.LoadBitmap(IDB_BITMAP1); /从资源中导入图片 MemDC.CreateCompatibleDC(pDC); /建立与位图相应的内存设备上下文 Ol

41、dBitmap=MemDC.SelectObject(&Bitmap); /在内存设备上下文选用位图图像 pDC-BitBlt( 0,0,Rect.Width(),Rect.Height(), &MemDC,0,0,SRCCOPY); /将位图数据传送到屏幕 MemDC.SelectObject(OldBitmap); /从内存设备上下文中释放位图图像 13. 图形文本函数 文本颜色设置函数类属:CDC:SetTextColor原型:virtual COLORREFSetTextColor( COLORREF crColor);返回值:原文本颜色的RGB值。参数说明:指定文本颜色。图形文本函数

42、 文本背景颜色设置函数类属:CDC:SetBkColor原型:virtual COLORREF SetBkColor( COLORREF crColor);返回值:原文本背景色的RGB值。参数说明:指定文本背景颜色。图形文本函数(3) 文本输出函数类属:CDC:TextOut原型:BOOL TextOut(int x,int y,const CString& str);返回值:非零。参数说明:参数x,y是文本的起点坐标,参数str是CString对象。图形文本函数 文本格式函数类属:CString:Format原型:void Format(LPCTSTR lpszFormat, . );返回值

43、:无。参数说明:参数lpszFormat是格式控制字符串,如d、f、c等。本格式常用于输出数值型数据。 例2-13在点(100,100)处输出黄底红字“Compute Graphics Based on VC+!”;在(300,100)输出“BoChuang Research Institute”;在(100,130)整数(5,8);在(130,130)处输出小数(5.0,8.0)。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); int a1=5,b1=8; double a2=

44、5.2,b2=8.3; CString data,c=BoChuang Research Institute; pDC-SetTextColor(RGB(255,0,0); pDC-SetBkColor(RGB(255,255,0);pDC-TextOut(100,100,Compute Graphics Based on VC+!);/输出文本1data.Format(%s,c);/输出文本2pDC-TextOut(330,100,data);data.Format(%d,%d,a1,b1);/输出整数pDC-TextOut(100,130,data);data.Format(%f,%f,a

45、2,b2);/输出小数pDC-TextOut(130,130,data);例2-14使用双缓冲机制双缓冲机制在位图上输出“斗破苍穹”文字。void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect Rect; /定义客户区 GetClientRect(&Rect); /获得客户区的大小 CDC MemDC; /定义内存设备上下文 CDC Picture; /定义图片; CBitmap Bitmap,*OldBitmap; /定义一个CBitmap对象和一个CBitmap对象指

46、针 Bitmap.LoadBitmap(IDB_BITMAP1); /从资源中导入位图 MemDC.CreateCompatibleDC(pDC); /建立与位图相应的内存设备上下文 OldBitmap=MemDC.SelectObject(&Bitmap); /把内存设备上下文换成位图图像 MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY); /将位图数据传送到内存设备上下文 MemDC.SetBkMode(TRANSPARENT); /设置文字背景透明 MemDC.SetTextColor(RGB(255,25

47、5,255); /设置文字颜色为白色 MemDC.TextOut(500,350, 斗破苍穹); /输出文字 pDC-BitBlt(0,0,Rect.Width(),Rect.Height(), &MemDC,0,0,SRCCOPY); /将内存数据传送到屏幕 MemDC.SelectObject(OldBitmap); /从内存设备上下文中释放位图图像 MemDC.DeleteDC(); 2.3.4 设备上下文的调用和释放在VC+程序中输出图形和文本时,如果不在OnDraw函数中输出,则需要设置输出对象的设备上下文,然后才能调用相应的CDC类的成员函数,最后还需要保证将设备上下文释放给Win

48、dows,恢复原来的状态以备下次调用调用设备上下文类属:CWnd:GetDC( )原型:CDC* GetDC( );返回值:指定的客户区设备上下文指针。参数说明:获得指定的窗口客户区的设备上下文。释放设备上下文类属:CWnd:ReleaseDC原型:int ReleaseDC(CDC* pDC);返回值:非零。参数说明:释放指定客户区的设备上下文。2.3.5 VC+绘制图形的几种方法第一种方法:使用OnDraw成员函数void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO:

49、add draw code for native data herepDC-MoveTo(20,30);pDC-LineTo(200,300);第二种方法:使用CDC *pDC的菜单调用方式在MFC框架中的【FileView】面板中,双击【TestView.cpp】,在该文件最后添加成员函数DrawmyLine()的定义:voidCTestView:DrawmyLine()CDC*pDC=GetDC();pDC-MoveTo(20,30);pDC-LineTo(200,300);ReleaseDC(pDC);第二种方法:使用CDC *pDC的菜单调用方式在【FileView】面板中,双击【Te

50、stView.h】,在该文件中的“public:”下面加入成员函数声明:void DrawmyLine();在菜单中添加菜单函数OnMENU DrawmyLine( )调用DrawmyLine()成员函数。voidCTestView:OnMENUDrawmyLine()voidCTestView:OnMENUDrawmyLine() /TODO:Addyourcommandhandler/TODO:AddyourcommandhandlercodeherecodehereDrawmyLine();DrawmyLine(); 程序解释本方法需要在头文件TestView.h中声明成员函数Drawm

51、yLine(),在源程序TestView.cpp中定义成员函数DrawmyLine()。在DrawmyLine()函数中使用了CDC类指针对象,需要调用和释放设备上下文。第三种方法:使用CClientDC dc(this)的菜单调用方式成员函数DrawmyLine()的声明和菜单的调用同第二种方法的和,在TestView.cpp文件中修改DrawmyLine()成员函数的定义:voidCTestView:DrawmyLine()CClientDCdc(this);dc.MoveTo(20,30);dc.LineTo(200,300);程序解释本方法也需要在头文件TestView.h中声明成员函

52、数DrawmyLine(),在源程序TestView.cpp中定义成员函数DrawmyLine()。不同点只是使用显示器客户区设备上下文类定义了客户区对象dc,并使用客户区的this指针对dc对象进行初始化,使dc对象指向显示器的客户区,这种方法不需要调用和释放设备上下文。2.4 本章小结本章是学习后续章节的基础,介绍了面向对象程序设计基础,包括C+的类、对象、继承等概念,供读者复习;给出了使用MFC建立Test工程的上机操作步骤,为以后的案例设计建立程序框架;重点讲解了VC+中的常用基本绘图函数,为以后的图形设计奠定基础。面向对象程序设计基础不属于本课程的范畴,读者可以根据自身情况,对本章内

53、容进行适当取舍。习题1. 使用MFC设计一个长方形Rect类,使用对话框输入长方形的长度和宽度,在客户区输出长方形的周长和面积,如下图所示。2. 在长方形的输入对话框中,要求长度默认值为30,宽度默认值为20,并且要求长度的默认值处于选定状态,如下图所示。试添加MFC函数实现之。3. 分别使用SetPixel函数和LineTo函数绘制(100,100)到(400,100)的一像素宽的黑色直线,运行效果图如下图所示。观察两种方法绘制的效果有何区别。 4. 把一个半径为R的圆18等份,以每个等分点为圆心,以r为半径画n个圆。试参照本章的案例编程输出下图所示的变化的环。5. 下图所示的RGB演示程序中,单击颜色按钮可以在右侧颜色区域显示对应的颜色;拖动滑块可以改变颜色,并在滑块的右侧显示相应的RGB值;单击【颜色对话框】按钮可以打开Windows的调色板进行颜色的选取;单击【鼠标选取】按钮可以拾取任何图形上的颜色显示在颜色区域并在右下侧显示其RGB值。试编程实现之。结束语结束语谢谢大家聆听!谢谢大家聆听!126

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号