VISUAL C++ MFC编程XB

上传人:桔**** 文档编号:567664500 上传时间:2024-07-22 格式:PPT 页数:45 大小:878KB
返回 下载 相关 举报
VISUAL C++ MFC编程XB_第1页
第1页 / 共45页
VISUAL C++ MFC编程XB_第2页
第2页 / 共45页
VISUAL C++ MFC编程XB_第3页
第3页 / 共45页
VISUAL C++ MFC编程XB_第4页
第4页 / 共45页
VISUAL C++ MFC编程XB_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《VISUAL C++ MFC编程XB》由会员分享,可在线阅读,更多相关《VISUAL C++ MFC编程XB(45页珍藏版)》请在金锄头文库上搜索。

1、 本次课以Visual C+ 6.0为对象,主要介绍Visual C+集成编程环境的使用、图形设备接口和常用图形程序设计等基础,目的是通过对Visual C+的学习,掌握Visual C+图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。Visual C+的集成开发环境 n n从开始菜单中启动Visual C+ 6.0,进入开发集成环境。打开一个项目后,可以看到Visual C+ 6.0的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏组成,见下图所示。n n Visual C+提供了一种称为App Wizard的工具,利用该工具,用户可以方便地按照

2、自己的需要创建符合需要的应用程序框架。在这个基础上,用户可以进一步将自己编写的程序加入到这个框架中,实现用户程序的功能。下面介绍建立VcApp应用程序框架的方法,其它应用程序的方法都与此类似。n n第一步:启动Visual C+,选择工程方法,项目类型选择MFC AppWizard (exe),输入工程的名字(如VcApp),选择项目放置的位置,然后单击“确定”按钮。n n第二步:设置应用程序的特性。 这些设置包括六个问题,每一个问题都有不同的选项供选择。一个问题选择完后,通过“下一步”(Next)选择下一个问题,直到六个问题选择完毕。还可以通过“上一步”(Back)返回上一个问题重新选择。下

3、面继续上面的例子,在单击“确定”按钮后,弹出第一个问题窗口,如下图所示。第二个问题是数据库的支持第二个问题是数据库的支持, ,是否用是否用ODBCODBC存取数据库存取数据库 选择是否对ActiveX的支持 应用程序的特性和高级选项项目的风格、原文件注释和MFC库类型通知MFC产生的类名称 n nAppWizard会把将要建立的新类的名称通知用户。AppWizard将为应用程序建立四个新类,CVcAppApp是应用程序类,它是CWinApp的派生类。CMainFrame是一个拥有应用程序主窗口的类。CVcAppDoc和CVcAppView是该应用程序的文档和视图类。这些名字用户可以改变。最后单

4、击“完成”(Finish),显示所建项目的信息,单击“确定”后,项目建立完成。 输入源程序进行程序设计 n n 应用程序项目工程建立以后,就为应用程序的开发建立了一个框架,这是不输入任何程序代码,对该项目程序进行编译和运行,可以生成一个完整的窗口程序。用户根据项目工程中的不同类,输入自己设计的程序代码,完成用户的程序设计。n n 例如,从VcApp Classes中找到CVcAppView的OnDraw()函数,如图3-9所示。双击OnDraw()函数,这时系统会打开VcAppView.cpp文件,而且光标正置于OnDraw()函数中,在其中输入下列语句: pDC-TextOut(30,30,

5、同学们好,欢迎使用VC+编程!);n n编译并运行该程序,运行结果如下图所示。二二.图形设备接口和图形程序设计图形设备接口和图形程序设计n n在在WindowsWindows系统中,程序都是通过一个叫做图形系统中,程序都是通过一个叫做图形设备接口(设备接口(GDI, Graphics Device InterfaceGDI, Graphics Device Interface)的抽象接口和硬件打交道,的抽象接口和硬件打交道,WindowsWindows会自动将设会自动将设备环境表映射到相应的物理设备,并且会提供正备环境表映射到相应的物理设备,并且会提供正确的输入确的输入/ /输出指令。输出指令

6、。n nGDIGDI是是WindowsWindows系统核心的三种动态链接库之一,系统核心的三种动态链接库之一,它管理它管理WindowsWindows系统的所有程序的图形输出。在系统的所有程序的图形输出。在WindowsWindows系统中,系统中,GDIGDI向程序员提供了高层次的向程序员提供了高层次的绘图函数,只要掌握这些绘图函数,就可以很方绘图函数,只要掌握这些绘图函数,就可以很方便地进行图形程序设计。便地进行图形程序设计。n n 另一个概念是设备描述表(另一个概念是设备描述表(DC, Device DC, Device ContextContext)。)。DCDC是一个数据结构,当程

7、序向是一个数据结构,当程序向GDIGDI设备中绘图时,需要访问该设备的设备中绘图时,需要访问该设备的DCDC。MFCMFC将将GDIGDI的的DCDC封装在封装在C+C+类中,包括类中,包括CDCCDC类和类和CDCCDC派生类,这些类中的许多成员都是对本地派生类,这些类中的许多成员都是对本地GDIGDI绘绘图函数进行简单封装而形成的内联函数。图函数进行简单封装而形成的内联函数。n n DCDC的作用就是提供程序与物理设备或者虚拟的作用就是提供程序与物理设备或者虚拟设备之间的联系,除此之外,设备之间的联系,除此之外,DCDC还要处理绘图属还要处理绘图属性的设置,如文本的颜色等。程序员可以通过调

8、性的设置,如文本的颜色等。程序员可以通过调用专门的用专门的GDIGDI函数修改绘图属性,如函数修改绘图属性,如SetTextColorSetTextColor()()函数。函数。n n CDCCDC类是类是GDIGDI封装在封装在MFCMFC中最大的一个类。下表列中最大的一个类。下表列出了出了CDCCDC中的一些常用绘图函数。中的一些常用绘图函数。三.绘制基本图形 n n(1 1)画点)画点)画点)画点: : SetPixelSetPixel()()函数可以在指定的坐标位置按指定的函数可以在指定的坐标位置按指定的颜色画点。函数原型说明如下:颜色画点。函数原型说明如下: COLORREF CDC

9、: COLORREF CDC: SetPixel(intSetPixel(int X, X, intint Y, Y, COLORREF COLORREF crColorcrColor); ); 其中,(其中,(X X,Y Y)为点的坐标位置,)为点的坐标位置,crColorcrColor参数为参数为点的颜色值。颜色值通过点的颜色值。颜色值通过RGB(Red,Green,BlueRGB(Red,Green,Blue) )来设置,其中三个参数取值来设置,其中三个参数取值02550255。例如,在。例如,在VcAPPVcAPP项目中,在项目中,在CVcAppViewCVcAppView类中的类中的

10、OnDrawOnDraw()()函数中加入下列画点语句:函数中加入下列画点语句:n npDC-SetPixel(100,20,RGB(255,0,0);pDC-SetPixel(100,20,RGB(255,0,0);n npDC-SetPixel(100,20,RGB(255,0,255);pDC-SetPixel(100,20,RGB(255,0,255);n npDC-SetPixel(100,20,RGB(0,255,255);pDC-SetPixel(100,20,RGB(0,255,255);(2)画直线和折线)画直线和折线 (1)(1)画直线需要画直线需要LineToLineTo

11、()()和和MoveToMoveTo()()两个函数的配合使用。两个函数的配合使用。 LineToLineTo()()函数以当前位置所在的点为直线的起点,另指定一函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。直线的颜色通过画笔的颜色个点为直线的终点,画出一段直线。直线的颜色通过画笔的颜色来设定,在后面介绍。来设定,在后面介绍。LineToLineTo()()函数原型说明如下:函数原型说明如下: BOOL CDC: BOOL CDC: LineTo(intLineTo(int nXEndnXEnd, , intint nYEndnYEnd);); 直线的终点位置由(

12、直线的终点位置由(nXEndnXEnd, , nYEndnYEnd)指定。)指定。 (2)MoveTo()(2)MoveTo()函数只是将当前位置移动到指定位置,它并没有画函数只是将当前位置移动到指定位置,它并没有画出直线,其函数说明为:出直线,其函数说明为: BOOL CDC: BOOL CDC: MoveToMoveTo ( (intint X, X, intint Y); Y);n n示例:在示例:在CVcAppViewCVcAppView类中的类中的OnDrawOnDraw()()函数中加入下列函数中加入下列画点语句:画点语句: /绘制直线绘制直线pDCpDC-TextOut(20,6

13、0,Line:);-TextOut(20,60,Line:);pDCpDC-MoveTo(20,90);-MoveTo(20,90); pDCpDC-LineTo(160,90);-LineTo(160,90); PolylinePolyline()()函数用来画一条折线,而函数用来画一条折线,而PolyPolylinePolyPolyline()()函数则用来画多条折线,它们的函数原型说明如下:函数则用来画多条折线,它们的函数原型说明如下: (1)BOOL (1)BOOL CDCCDC:Polyline(CONST:Polyline(CONST POINT * POINT *lpptlppt

14、, , intint cPointscPoints);); (2)BOOL (2)BOOL CDCCDC:PolyPolyline(CONST:PolyPolyline(CONST POINT * POINT * lpptlppt, , COUST DWORD *COUST DWORD *lpdwPolyPoints,DWORDlpdwPolyPoints,DWORD cCountcCount);); 在在PolylinePolyline()()函数中,函数中,lpptlppt是指向折线顶点数组的是指向折线顶点数组的指针,而指针,而cPointscPoints是折线顶点数组中的顶点数。例如,是

15、折线顶点数组中的顶点数。例如,绘制一条具有绘制一条具有4 4个顶点的折线,程序如下:个顶点的折线,程序如下:n n POINT polylinepoint4=70,240, 20,190, POINT polylinepoint4=70,240, 20,190, 70,190,20,240;70,190,20,240;n n pDCpDC-Polyline(polylinepoint,4);-Polyline(polylinepoint,4); 在PolyPolyline()函数中,lppt是指向保存顶点数组的指针,而各条折线的顶点数则保存在lpdwPolyPoints参数所指向的数组中,最后

16、的cCount参数指定折线的数目。例如: POINT polypolylinePt9=95,160, 120,185, 120,250, POINT polypolylinePt9=95,160, 120,185, 120,250, 145,160,120,185,90,185,150,185,80,210,160,210145,160,120,185,90,185,150,185,80,210,160,210; DWORD dwPolyPoints4=3,2,2,2; / DWORD dwPolyPoints4=3,2,2,2; /四段折线,占用四段折线,占用3,2,2,23,2,2,2个顶

17、点个顶点 pDCpDC-PolyPolyline(polypolylinePtPolyPolyline(polypolylinePt, , dwPolyPointsdwPolyPoints, 4);, 4); 注:由于一条折线至少需要2个顶点,因此dwPolyPoints数组中的数不应该小于2。(3)画弧线和曲线)画弧线和曲线 通过通过Arc()Arc()函数画弧线或整个椭圆。椭圆限定在一函数画弧线或整个椭圆。椭圆限定在一个矩形内,称为外接矩形。个矩形内,称为外接矩形。Arc()Arc()函数的圆形说明如下:函数的圆形说明如下: BOOL CDC: BOOL CDC: Arc(intArc(i

18、nt nLeftRectnLeftRect, , intint nTopRectnTopRect, , intint nRightRectnRightRect, , intint nBottomRect,intnBottomRect,int nXStartArcnXStartArc, , intint nYStartArcnYStartArc, , intint nXEndArcnXEndArc, , intint nYEndArcnYEndArc);); 其中其中, ,(nLeftRectnLeftRect, , nTopRectnTopRect)是外接矩形的左)是外接矩形的左上角坐标值,(

19、上角坐标值,(nRightRectnRightRect, , nBottomRectnBottomRect)是外接)是外接矩形的右下角坐标值。而椭圆中心与点(矩形的右下角坐标值。而椭圆中心与点(nXStartArcnXStartArc, , nYStartArcnYStartArc)所构成的射线与椭圆的交点成为弧线的)所构成的射线与椭圆的交点成为弧线的起点,椭圆中心与点(起点,椭圆中心与点(nXEndArcnXEndArc, , nYEndArcnYEndArc)所构)所构成的射线与椭圆的交点成为弧线的终点。椭圆上从始点成的射线与椭圆的交点成为弧线的终点。椭圆上从始点到终点就形成一条弧线。到终

20、点就形成一条弧线。 在在WindowsWindows系统中,弧线从始点到终点的方向是逆系统中,弧线从始点到终点的方向是逆时针方向。时针方向。intint i; i; for (i=1;i6;i+)for (i=1;iArc(260-5*i,70-5*i,260+5*i,70+5*i,0,0,0,0);-Arc(260-5*i,70-5*i,260+5*i,70+5*i,0,0,0,0); for (i=3;i6;i+)for (i=3;iArc(260-10*i, 70-10*i, 260+10*i, 70+10*i, -Arc(260-10*i, 70-10*i, 260+10*i, 70+

21、10*i, (int)260+10*i*cos(60*3.1415926/180),(int)260+10*i*cos(60*3.1415926/180),(int)70+10*i*sin(60*3.1415926/180),(int)70+10*i*sin(60*3.1415926/180),(int)260+10*i*cos(60*3.1415926/180),(int)260+10*i*cos(60*3.1415926/180),(int)70-10*i*sin(60*3.1415926/180);(int)70-10*i*sin(60*3.1415926/180); pDCpDC-Ar

22、c(260-10*i, 70-10*i, 260+10*i, 70+10*i, -Arc(260-10*i, 70-10*i, 260+10*i, 70+10*i, (int)260-10*i*cos(60*3.1415926/180),(int)260-10*i*cos(60*3.1415926/180),(int)70-10*i*sin(60*3.1415926/180),(int)70-10*i*sin(60*3.1415926/180),(int)260-10*i*cos(60*3.1415926/180),(int)260-10*i*cos(60*3.1415926/180),(in

23、t)70+10*i*sin(60*3.1415926/180);(int)70+10*i*sin(60*3.1415926/180); n nBezier曲线是最常见的非规则曲线之一。Bezier曲线属于三次曲线,需要四个控制顶点来确定一条Bezier曲线,其中曲线通过第一点和最后一点,并且第一条边和最后一条边是曲线在起点和终点处的切线,从而确定了曲线的走向。PolyBezier()函数可以画出一条或多条Bezier曲线,其函数原型说明如下: BOOL CDC: BOOL CDC: PolyBezier(CONSTPolyBezier(CONST POINT * POINT * lpptlpp

24、t, , DWORD DWORD cPointscPoints);); 其中,其中,lpptlppt参数是曲线控制顶点所组成的数组,参数是曲线控制顶点所组成的数组,cPointscPoints参数表示参数表示lpptlppt数组中的顶点数,一条数组中的顶点数,一条BezierBezier曲曲线需要四个控制顶点。如果线需要四个控制顶点。如果lpptlppt数组用于画多条数组用于画多条BezierBezier曲线,第二条以后的曲线只需要三个控制顶点,因为后曲线,第二条以后的曲线只需要三个控制顶点,因为后面的曲线总是把前一条曲线的终点作为自己的起点。面的曲线总是把前一条曲线的终点作为自己的起点。 示

25、例示例: :给出四个控制顶点,画出一条给出四个控制顶点,画出一条BezierBezier曲线和特曲线和特征多边形。征多边形。 /绘制绘制Bezier Bezier 曲线曲线 POINT polyBezier4=20,310,60,240, POINT polyBezier4=20,310,60,240, 120,300, 160,230;120,300, 160,230; pDCpDC-Polyline(polyBezier,4);-Polyline(polyBezier,4); pDCpDC-PolyBezier(polyBezier,4);-PolyBezier(polyBezier,4)

26、;(4)画封闭曲线)画封闭曲线 WindowsWindows中提供了一组画封闭曲线的函数,包括绘中提供了一组画封闭曲线的函数,包括绘制矩形、多边性、椭圆等,这些画封闭曲线的函数不但制矩形、多边性、椭圆等,这些画封闭曲线的函数不但可以利用画笔来画出轮廓线,同时还可以利用画刷来填可以利用画笔来画出轮廓线,同时还可以利用画刷来填充这些封闭曲线所围成的区域。充这些封闭曲线所围成的区域。 (a) Rectangle()(a) Rectangle()函数用来画矩形函数用来画矩形, ,函数原型说明如下:函数原型说明如下: BOOL CDC: BOOL CDC: Rectangle(intRectangle(

27、int nLeftRectnLeftRect, , intint nTopRectnTopRect, , intint nRightRectnRightRect, , intint nBottomRectnBottomRect);); 其中,参数其中,参数nLeftRectnLeftRect和和 nTopRectnTopRect给出了矩形左上给出了矩形左上角的坐标,而角的坐标,而nRightRectnRightRect和和 nBottomRectnBottomRect则给出矩则给出矩形的右下角坐标。形的右下角坐标。 ( (b)Ellipseb)Ellipse()()函数的作用则是画椭圆形。在函

28、数的作用则是画椭圆形。在Ellipse()Ellipse()函数中,函数中,椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重合,矩形的长与宽和椭圆的长短轴相等。函数说明如下:合,矩形的长与宽和椭圆的长短轴相等。函数说明如下: BOOL CDC: BOOL CDC: Ellipse(intEllipse(int nLeftRectnLeftRect, , intint nTopRectnTopRect, , intint nRightRectnRightRect, , intint nBottomRectnBottomRect););

29、其中的参数说明与其中的参数说明与Rectangle()Rectangle()函数相同。函数相同。 ( (c)RoundRectc)RoundRect()()函数用来画圆角矩形函数用来画圆角矩形, , 函数原型说明如下:函数原型说明如下: BOOL CDC: BOOL CDC: RoundRect(intRoundRect(int nLeftRectnLeftRect, , intint nTopRectnTopRect, , intint nRightRectnRightRect, , intint nBottomRect,intnBottomRect,int nWidthnWidth, ,

30、intint nHeightnHeight););其中的前四个参数与其中的前四个参数与Rectangle()Rectangle()函数相同,函数相同,nWidthnWidth表示圆角表示圆角的宽度的宽度, , nHeightnHeight表示圆角的高度。表示圆角的高度。 (d) Polygon()函数用来画封闭的任意多边形,其函数原型说明如下: BOOL CDC: Polygon(COUST POINT *lpPoints, int cCount); 其中的参数说明与Polyline()函数相同。但两个函数有区别,Polygon()函数会自动将起点和终点相连形成封闭的多边形,而Polyline

31、()函数则画出多条折线,只有当最后一点与起点相同时才画出封闭的多边形。示例,绘制矩形、圆角矩形、椭圆和多边形,程序如下:/绘制矩形、圆角矩形、椭圆和多边形绘制矩形、圆角矩形、椭圆和多边形pDCpDC-Rectangle(190,270,250,310);-Rectangle(190,270,250,310);pDCpDC-RoundRect(265,270,330,310,30,20);-RoundRect(265,270,330,310,30,20);pDCpDC-Ellipse(260-50,200-Ellipse(260-50,200-30,260+50,200+30);30,260+5

32、0,200+30);POINT polygonPts3=390,160,430,220, POINT polygonPts3=390,160,430,220, 350,210;350,210;pDCpDC-Polygon(polygonPts,3);-Polygon(polygonPts,3);(5) 画笔与画刷画笔与画刷n n当绘制图形时,线条的属性,包括颜色、宽度、样式等都是由画笔来确定的。程序员可以创建画笔,定义画笔的属性,从而画出多彩的图形。n n创建画笔包括CreatePen()和CreatePenIndirect()两个函数。MFC将这些函数封装在CPen类中,这样画笔就能够被视为

33、对象进行处理。下面介绍创建画笔的方法。 方法一:直接构造一个方法一:直接构造一个CPenCPen对象,并将定义画笔的参数传对象,并将定义画笔的参数传给它,例如:给它,例如: CPenCPen pen(PS_SOLID,1,RGB(255,0,0); pen(PS_SOLID,1,RGB(255,0,0); 创建一个宽度为一个像素、实线和红色的画笔。创建一个宽度为一个像素、实线和红色的画笔。 方法二:首先声明一个没有初始化的方法二:首先声明一个没有初始化的CPenCPen类对象,然后再类对象,然后再用用CreatePenCreatePen()()函数定义画笔的属性。例如,函数定义画笔的属性。例如

34、, CPenCPen Pen; Pen; Pen.CreatePenPen.CreatePen (PS_SOLID,1,RGB(255,0,0); (PS_SOLID,1,RGB(255,0,0); 方法三:先声明一个方法三:先声明一个CPenCPen类对象和一个描述画笔结构的类对象和一个描述画笔结构的LOGPENLOGPEN类对象,并填入画笔的属性值,然后调用类对象,并填入画笔的属性值,然后调用CreatePenIndirectCreatePenIndirect()()函数来创建画笔。如下所示:函数来创建画笔。如下所示: CPenCPen Pen; Pen; LOGPEN LOGPEN Lo

35、gPenLogPen; ; LogPen.lopnStyleLogPen.lopnStyle=PS_SOLID;=PS_SOLID; LogPen.lopnWidthLogPen.lopnWidth=1;=1; LogPen.lpenColorLogPen.lpenColor=RGB(255,0,0);=RGB(255,0,0); Pen.CreatePenIndirect(&LogPenPen.CreatePenIndirect(&LogPen);); 画笔包括样式、宽度和颜色三个属性。下表列出了GDI画笔的样式。n nintint i1; i1;n nintint nPenStylenPe

36、nStyle=PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,=PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_NULL,n nPS_INSIDEFRAME;PS_INSIDEFRAME;n n CPenCPen * *pNewPenpNewPen; ;n n CPenCPen * *pOldPenpOldPen; ;n n / /用不同样式的画笔用不同样式的画笔n n for (i1=0;i17;i1+)for (i1=0;i1CreatePen(nPenStylei1,

37、1,RGB(0,0,0)-CreatePen(nPenStylei1,1,RGB(0,0,0)n n n n pOldPenpOldPen=pDCpDC-SelectObject(pNewPenSelectObject(pNewPen); /); /选择新笔,并保存旧笔选择新笔,并保存旧笔n n pDCpDC-MoveTo(20,60+i1*20); /-MoveTo(20,60+i1*20); /画直线画直线n n pDCpDC-LineTo(160,60+i1*20);-LineTo(160,60+i1*20);n n pDCpDC-SelectObject(pOldPenSelectOb

38、ject(pOldPen); /); /恢复原有的笔恢复原有的笔n n n n elseelsen n / /出错提示出错提示n n AfxMessageBox(CreatePenAfxMessageBox(CreatePen ErroeErroe!);!);n n n n delete delete pNewPenpNewPen; /; /删除新笔删除新笔n n n n n nfor(i1=0;i17;i1+) /for(i1=0;i1CreatePen(PS_SOLID,i1+1,RGB(0,0,0)-CreatePen(PS_SOLID,i1+1,RGB(0,0,0)n n n n pO

39、ldPenpOldPen=pDCpDC-SelectObject(pNewPenSelectObject(pNewPen););n n/画直线画直线n npDCpDC-MoveTo(200,60+i1*20);-MoveTo(200,60+i1*20);n npDCpDC-LineTo(340,60+i1*20);-LineTo(340,60+i1*20);n n/恢复原有的笔恢复原有的笔n npDCpDC-SelectObject(pOldPenSelectObject(pOldPen););n n n n elseelsen n n n/出错提示出错提示n n AfxMessageBox(

40、CreatePenAfxMessageBox(CreatePen ErroeErroe!);!);n n n n/删除新笔删除新笔n n delete delete pNewPenpNewPen; ;n n n n structstruct tagColortagColor / /设置颜色表设置颜色表 intint r,g,br,g,b; ; color7= color7= 255,0,0,0,255,0,0,0,255, 255,0,0,0,255,0,0,0,255, 255,255,0,255,0,255,0,255,255,0,0,0;255,255,0,255,0,255,0,255

41、,255,0,0,0; for(i1=0;i17;i1+) / for(i1=0;i1CreatePen(PS_SOLID,2,RGB(colori1.r, -CreatePen(PS_SOLID,2,RGB(colori1.r, colori1.g,colori1.b)colori1.g,colori1.b) pOldPenpOldPen=pDCpDC-SelectObject(pNewPenSelectObject(pNewPen);); pDCpDC-MoveTo(380,60+i1*20); /-MoveTo(380,60+i1*20); /画直线画直线 pDCpDC-LineTo(5

42、20,60+i1*20);-LineTo(520,60+i1*20); pDCpDC-SelectObject(pOldPenSelectObject(pOldPen); /); /恢复原有的笔恢复原有的笔 else else AfxMessageBox(CreatePenAfxMessageBox(CreatePen Error!); / Error!); /出错提示出错提示 delete delete pNewPenpNewPen; /; /删除新笔删除新笔 (b)画刷)画刷 在进行区域填充或绘制封闭图形时,需要用到画刷。在进行区域填充或绘制封闭图形时,需要用到画刷。MFCMFC把把GDI

43、GDI画刷封装在画刷封装在CBrushCBrush类中。画刷分三种基本类型:纯色画类中。画刷分三种基本类型:纯色画刷、阴影画刷和图案画刷。刷、阴影画刷和图案画刷。 纯色画刷绘图使用单色来定义,颜色由纯色画刷绘图使用单色来定义,颜色由RGB()RGB()函数来确定。函数来确定。纯色画刷可以采用直接声明的方法,例如:纯色画刷可以采用直接声明的方法,例如: CBrushCBrush Brush(RGB(255,0,0); Brush(RGB(255,0,0); 创建一个红色画刷。创建一个红色画刷。 也可以采用分步方法,由也可以采用分步方法,由CreateSolidBrushCreateSolidBr

44、ush()()函数创建。函数创建。 CBrushCBrush Brush; Brush; Brush.CreateSolidBrush(RGB(255,0,0); Brush.CreateSolidBrush(RGB(255,0,0); Windows Windows预定义了七种画刷,包括:预定义了七种画刷,包括:BLACK_BRUSHBLACK_BRUSH、 DKGRAY_BRUSHDKGRAY_BRUSH、 GRAY_BRUSHGRAY_BRUSH、LTGRAY_BRUSHLTGRAY_BRUSH、HOLLOW_BRUSHHOLLOW_BRUSH、NULL_BRUSHNULL_BRUSH和

45、和WHITE_BRUSHWHITE_BRUSH。可。可以参照以参照CPenCPen类的方法,采用类的方法,采用CreateStockObjectCreateStockObject()()来使用预来使用预定义的画刷。定义的画刷。 阴影画刷使用预定义的六种阴影样式进行绘图。下表列出了六种阴影样式。 创建阴影画刷的方法与纯色画刷的创建方法相似,如创建阴影画刷的方法与纯色画刷的创建方法相似,如创建一个创建一个4545度方向的交叉阴影线的画刷,方法如下:度方向的交叉阴影线的画刷,方法如下: CBrushCBrush Brush(HS_DIAGCROSS,RGB(255, Brush(HS_DIAGCRO

46、SS,RGB(255, 0,0);0,0);或者或者 CBrushCBrush Brush; Brush; Brush.CreateHatchBrush(HS_DIAGCROSS,RGB(Brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0);255,0,0); 函数中有两个参数,第一个参数是画刷的阴影样式,第函数中有两个参数,第一个参数是画刷的阴影样式,第二个参数是阴影线的颜色。二个参数是阴影线的颜色。 示例:绘制缺省画刷的矩形,纯色画刷矩形和绘制示例:绘制缺省画刷的矩形,纯色画刷矩形和绘制100100单位单位的矩形,并且用白色的矩形,并且用白色45

47、45度交叉线阴影将其填充,程序如下:度交叉线阴影将其填充,程序如下:/画刷程序画刷程序pDCpDC-Rectangle(300,300,400,400); /-Rectangle(300,300,400,400); /缺省的画刷,白色缺省的画刷,白色/纯色画刷纯色画刷CBrushCBrush *pNewBrush1; *pNewBrush1;CBrushCBrush *pOldBrush1; *pOldBrush1;pNewBrush1=new pNewBrush1=new CBrushCBrush; ;if (pNewBrush1-CreateSolidBrush(RGB(255,0,0)i

48、f (pNewBrush1-CreateSolidBrush(RGB(255,0,0) /选择新画刷选择新画刷 pOldBrush1=pOldBrush1=pDCpDC-SelectObject(pNewBrush1);-SelectObject(pNewBrush1);/绘制矩形绘制矩形 pDCpDC-Rectangle(200,200,300,400);-Rectangle(200,200,300,400);/恢复原有画刷恢复原有画刷 pDCpDC-SelectObject(pOldBrush1); -SelectObject(pOldBrush1); delete pNewBrush1;

49、delete pNewBrush1;/阴影画刷阴影画刷 CBrushCBrush Brush(HS_DIAGCROSS,RGBBrush(HS_DIAGCROSS,RGB (255, (255, 255,255);255,255); CBrushCBrush * *pOldBrushpOldBrush; ; pOldBrushpOldBrush=pDCpDC-SelectObject(&BrushSelectObject(&Brush);); pDCpDC-SetBkColor(RGB(192,192,192);-SetBkColor(RGB(192,192,192); pDCpDC-Rectangle(0,0,100,100);-Rectangle(0,0,100,100); pDCpDC-SelectObject(pOldBrushSelectObject(pOldBrush););

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

最新文档


当前位置:首页 > 幼儿/小学教育 > 幼儿教育

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