第章图形文本和打印ppt课件_第1页
第章图形文本和打印ppt课件_第2页
第章图形文本和打印ppt课件_第3页
第章图形文本和打印ppt课件_第4页
第章图形文本和打印ppt课件_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第7章图形、文本和打印章图形、文本和打印图形、文本和打印图形、文本和打印nWindow为操作系统和硬件提供了图形用户接口为操作系统和硬件提供了图形用户接口GUI(Graphics Users Interface)。一切的信。一切的信息,甚至文本,在息,甚至文本,在Windows下都可以作为图形下都可以作为图形画到屏幕上。画到屏幕上。nWindow的的GDI(设备图形接口设备图形接口)提供了绘图的根提供了绘图的根本工具,如画点、线、多边形、位图以及文本输本工具,如画点、线、多边形、位图以及文本输出。主要担任系统与用户或绘图程序之间的信息出。主要担任系统与用户或绘图程序之间的信息交换,并在输出设

2、备上显示图形或文字。交换,并在输出设备上显示图形或文字。nMFC提供了设备环境类提供了设备环境类CDC和图形对象类和图形对象类CGdiObject来完成绘图操作。来完成绘图操作。7.1 设备环境和简单数据类设备环境和简单数据类设备环境设备环境n设备环境是由设备环境是由Windows保管的一个数据构造,保管的一个数据构造,包含运用程序向设备输出时所需求的信息,如当包含运用程序向设备输出时所需求的信息,如当前背风光或区域图案、区域的无效部分等。前背风光或区域图案、区域的无效部分等。nWindows经过设备环境确定任何输出设备的经过设备环境确定任何输出设备的GDI输出的位置和图形的属性。输出的位置和

3、图形的属性。n当用户绘图时,需求访问设备描画表当用户绘图时,需求访问设备描画表DC(Device Context),它的主要作用是提供程序与物理设备,它的主要作用是提供程序与物理设备或者伪设备之间的联络,另外还处置绘图属性设或者伪设备之间的联络,另外还处置绘图属性设置,如文本颜色设置。置,如文本颜色设置。7.1.1 设备环境类设备环境类n设备环境类设备环境类CDC是是GDI封装在封装在MFC中的最大的一中的最大的一个类,它表示总的个类,它表示总的DC,是一切,是一切DC类的基类。类的基类。CDC类定义环境对象,并提供在显示器、打印机类定义环境对象,并提供在显示器、打印机或窗口客户区上绘制图形的

4、方法,它封装了运用或窗口客户区上绘制图形的方法,它封装了运用设备环境的设备环境的GDI函数。函数。nCDC类的成员函数有近类的成员函数有近200个,可分为位图函数、个,可分为位图函数、剪裁函数、绘图属性函数、初始化函数和字体函剪裁函数、绘图属性函数、初始化函数和字体函数等。数等。7.1.1 设备环境类设备环境类n设备环境类设备环境类CDC提供了绘制和打印的全部函数。提供了绘制和打印的全部函数。为了能让用户运用一些特殊的设备环境,为了能让用户运用一些特殊的设备环境,CDC还还派生了派生了CPaintDC、CClientDC、CWindowDC和和CMetaFileDC类。类。n (1)CPain

5、tDC比较特殊,它的构造函数和析构比较特殊,它的构造函数和析构函数都是针对函数都是针对OnPaint进展的,但用户一旦获得进展的,但用户一旦获得相关的相关的CDC指针,就可以将它当成任何设备环境指针,就可以将它当成任何设备环境(包括屏幕、打印机包括屏幕、打印机)指针来运用。指针来运用。CPaintDC类类的构造函数会自动调用的构造函数会自动调用BeginPaint,而它的析构,而它的析构函数那么会自动调用函数那么会自动调用EndPaint。7.1.1 设备环境类设备环境类n (2)CClientDC只能在窗口的客户区只能在窗口的客户区(不包括边框、标不包括边框、标题栏、菜单栏以及形状栏题栏、菜

6、单栏以及形状栏)中进展绘图,点中进展绘图,点(0,0)通常指通常指的是客户区的左上角。而的是客户区的左上角。而CWindowDC允许在窗口的恣允许在窗口的恣意位置中进展绘图,点意位置中进展绘图,点(0,0)指整个窗口的左上角。指整个窗口的左上角。WindowDC和和CClientDC构造函数分别调用构造函数分别调用GetWindowDC和和GetDC,但它们的析构函数都是调,但它们的析构函数都是调用用ReleaseDC函数。函数。n (3)CMetaFileDC封装了在一个封装了在一个Windows图元文件中图元文件中绘图的方法。图元文件是一系列与设备无关的图片的集绘图的方法。图元文件是一系列

7、与设备无关的图片的集合,由于它对图象的保管比像素更准确,因此往往在要合,由于它对图象的保管比像素更准确,因此往往在要求较高的场所下运用。目前的求较高的场所下运用。目前的Windows已运用加强格已运用加强格式式(enhanced-format)的的32位图元文件来进展操作。位图元文件来进展操作。7.1.2 坐标映射坐标映射要指定绘图位置,需运用坐标系。Windows提供了两类坐标系:设备坐标系和逻辑坐标系。 逻辑坐标就是内存中虚拟的坐标,可以了解为看不见的,而设备坐标就是跟详细的设备相联络的坐标系统,如:显示器和打印机设备坐标系下的坐标,大小与分辨率有关。 为了能保证打印的结果不受设备的影响,

8、Windows定义了一些映射方式,不同的映射方式决议了设备坐标和逻辑坐标之间的转换关系,也就是两种坐标系统在相互转换时,逻辑单位和设备单位之间的某种比例关系。阐明:Windows中,只需对需求设备环境句柄作参数的GDI函数,映射方式才会起作用。 映映 射射 模模 式式映射模式含 义MM_TEXT每个逻辑单位等于一个设备像素,每个逻辑单位等于一个设备像素,x向右向右为正,为正,y向下为正向下为正MM_HIENGLISH每个逻辑单位为每个逻辑单位为0.001英寸,英寸,x向右为正,向右为正,y向上为正向上为正MM_LOENGLISH每个逻辑单位为每个逻辑单位为0.01英寸,英寸,x向右为正,向右为

9、正,y向上为正向上为正MM_HIMETRIC每个逻辑单位为每个逻辑单位为0.01毫米,毫米,x向右为正,向右为正,y向上为正向上为正MM_LOMETRIC每个逻辑单位为每个逻辑单位为0.1毫米,毫米,x向右为正,向右为正,y向向上为正上为正 MM_TWIPS每个逻辑单位为一个点的每个逻辑单位为一个点的1/20(一个点是(一个点是1/72 英寸),英寸),x向右为正,向右为正,y向上为正向上为正MM_ANISOTROPICx,y可变比例可变比例MM_ISOTROPICx,y等比例等比例 视口和窗口视口和窗口窗口:可以了解成一种逻辑坐标下的窗口视口:可以了解成实践看到的那个窗口,即设备坐标下的窗口

10、,通常与客户区一样,窗口和视口是与映射方式相关联的,映射方式就是用于从“窗口逻辑坐标到“视口设备坐标的映射。在映射方式MM_ANISOTROPIC和MM_ISOTROPIC中,经常可以调用CDC:SetWindowExt()和CDC:SetViewportExt()来设置所需求的比例因子。根据“窗口和“视口的大小可以确定x和y的比例因子,它们的关系如下:x比例因子 =视口x大小/窗口x大小y比例因子 =视口y大小/窗口y大小 7.1.3. CPoint、CSize和和CRect CPoint、CSize和和CRect类是对类是对Windows的的POINT、SIZE和和RECT构造的封装,因此

11、它们构造的封装,因此它们可以直接运用各自构造的数据成员。可以直接运用各自构造的数据成员。 typedef struct tagPOINTLONG x; /点的点的x坐标坐标LONG y; /点的点的y坐标坐标 POINT;CPoint类带参数的常用构造函数原型如下:类带参数的常用构造函数原型如下: CPoint( int initX, int initY ); CPoint( POINT initPt );7.1.3. CPoint、CSize和和CRecttypedef struct tagSIZEint cx; /程度大小程度大小int cy; /垂直大小垂直大小SIZE;CSize类带参

12、数的常用构造函数原型如下:类带参数的常用构造函数原型如下: CSize( int initCX, int initCY ); CSize( SIZE initSize ); 7.1.3. CPoint、CSize和和CRecttypedef struct tagRECTLONG left; /左上角点的左上角点的x坐标坐标LONG top; /左上角点的左上角点的y坐标坐标LONG right; /右下角点的右下角点的x坐标坐标LONG bottom;/右下角点的右下角点的y坐标坐标RECT;CRect类带参数的常用构造函数原型如下:类带参数的常用构造函数原型如下: CRect( int l,

13、 int t, int r, int b ); CRect( const RECT& srcRect ); CRect( LPCRECT lpSrcRect ); CRect( POINT point, SIZE size ); CRect( POINT topLeft, POINT bottomRight );CRect的常用操作的常用操作(1)成员函数成员函数功能说明功能说明int Width( ) const;返回矩形的宽度返回矩形的宽度int Height( ) const;返回矩形的高度返回矩形的高度CSize Size( ) const;返回矩形的大小,返回矩形的大小,CS

14、ize中的中的cx和和cy成成员分别表示矩形的宽度和高度员分别表示矩形的宽度和高度CPoint& TopLeft( );返回矩形左下角的点坐标返回矩形左下角的点坐标CPoint& BottomRight( ); 返回矩形右下角的点坐标返回矩形右下角的点坐标CPoint CenterPoint( ) const;返回返回CRect的中点坐标的中点坐标BOOL IsRectEmpty() const;如果一个矩形的宽度或高度是如果一个矩形的宽度或高度是0或负值,或负值,则称这个矩形为空,返回则称这个矩形为空,返回TRUEBOOL IsRectNull() const;如果一个矩形的

15、上、左、下和右边的如果一个矩形的上、左、下和右边的值都等于值都等于0,则返回,则返回TRUECRect的常用操作的常用操作(2)成员函数功能说明BOOL PtInRect( POINT point ) const;如果点如果点point位于矩形中位于矩形中(包括包括点在矩形的边上点在矩形的边上),则返回,则返回TRUEvoid SetRect( int x1, int y1, int x2, int y2 );将矩形的各边设为指定的值,将矩形的各边设为指定的值,左上角点为左上角点为(x1, y1),右下角点,右下角点为为(x2, y2)void SetRectEmpty();将矩形的所有坐标设

16、置为零将矩形的所有坐标设置为零void NormalizeRect( );使矩形符合规范使矩形符合规范void OffsetRect( int x, int y );void OffsetRect( POINT point );void OffsetRect( SIZE size );移动矩形,水平和垂直移动量移动矩形,水平和垂直移动量分别由分别由x、y或或point、size的两的两个成员来指定个成员来指定CRect的常用操作的常用操作(3)成员函数功能说明void InflateRect(int x,int y)void InflateRect(SIZE size)扩大一个矩形,扩大一个矩

17、形,x、cx用来扩大用来扩大矩形左右边的数值,矩形左右边的数值,y、cy用来用来扩大矩形上、下边的数值扩大矩形上、下边的数值(总宽度和总高度将被扩大两倍总宽度和总高度将被扩大两倍)void InflateRect(LPCRECT lpRect)void InflateRect(int l,int t,int r,int b)lpRect的各个成员用来指定扩的各个成员用来指定扩大每一边的数值。大每一边的数值。l、t、r、b分别用来指定扩大矩分别用来指定扩大矩形左、上、右和的数值形左、上、右和的数值BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect

18、2)两个矩形相交,结果为空时返两个矩形相交,结果为空时返回回FALSE,否则返回,否则返回TRUEBOOL UnionRect(LPCRECT lpRect1, LPCRECT lpRect2)两个矩形合并,结果为空时返两个矩形合并,结果为空时返回回FALSE,否则返回,否则返回TRUE7.1.4. 颜色和颜色对话框颜色和颜色对话框一个彩色象素的显示需求颜色空间的支持,常用一个彩色象素的显示需求颜色空间的支持,常用的颜色空间有的颜色空间有RGB和和YUV两种。两种。RGB颜色空间选用红颜色空间选用红(R)、绿、绿(G)、蓝、蓝(B)三种基色分量,经过对这三种基色三种基色分量,经过对这三种基色不

19、同比例的混合,可以得到不同的彩色效果。而不同比例的混合,可以得到不同的彩色效果。而YUV颜色空间是将一个彩色像素表示成一个亮度分量颜色空间是将一个彩色像素表示成一个亮度分量(Y)和和两个色度分量两个色度分量(U、V)。在在MFC中,中,CDC运用的是运用的是RGB颜色空间,其中,颜色空间,其中,COLORREF是用来表示是用来表示RGB颜色的一个颜色的一个32位的数据类位的数据类型。它可以用以下的十六进制表示一个型。它可以用以下的十六进制表示一个RGB值:值:0 x00bbggrr,其中,其中bb、gg、rr分别表示蓝、绿、红分别表示蓝、绿、红3个颜色分量的十六进制值。个颜色分量的十六进制值。

20、7.1.4. 颜色和颜色对话框颜色和颜色对话框在详细操作在详细操作RGB颜色时,可运用以下的宏操作:颜色时,可运用以下的宏操作:GetBValue、GetGValue、GetRValue来获得其中来获得其中各个颜色分量值。各个颜色分量值。如:如:int nRed=GetBValue(color);RGB来将指定的三个分量值转换成一个来将指定的三个分量值转换成一个32位的位的RGB颜色值。颜色值。如:如:COLORREF color=RGB(nRed,nGreen,nBlue);7.1.4. 颜色和颜色对话框颜色和颜色对话框MFC的的CColorDialog类为运用程序提供了颜色选类为运用程序提

21、供了颜色选择通用对话框,构造函数如下:择通用对话框,构造函数如下:CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd * pParentWnd=NULL);其中,其中,clrInit指定选择的默许颜色值,默以为指定选择的默许颜色值,默以为RGB(0,0,0)黑色。黑色。pParentWnd指定对话框的父窗口指定对话框的父窗口指针。指针。dwFlags指定对话框外观和功能指定对话框外观和功能(见教材见教材P209)。当对话框单击当对话框单击OK退出时,可调用以下成员函数获得相退出时,可调用以下成员函数获得相应的颜色。应的颜色。COLORREF

22、 GetColor() const;void SetCurrentColor(COLORREF clr);static COLORREF * GetSavedCustomColors()7.1.5. 图形设备接口图形设备接口 Windows为设备环境提供了各种各样的绘图工为设备环境提供了各种各样的绘图工具,例如用于画线的具,例如用于画线的“画笔、填充区域的画笔、填充区域的“画刷以画刷以及用于绘制文本的及用于绘制文本的“字体。字体。MFC封装了这些工具,并提供相应的类来作为运用封装了这些工具,并提供相应的类来作为运用程序的图形设备接口程序的图形设备接口GDI(这些类有一个共同的笼统基这些类有一个

23、共同的笼统基类类CGdiObject)。类 名说 明CBitmap “位图位图”是一种位矩阵,每一个显示象素都对应于其中是一种位矩阵,每一个显示象素都对应于其中的一个或多个位。用户可以利用位图来表示图像,也可的一个或多个位。用户可以利用位图来表示图像,也可以利用它来创建画刷。以利用它来创建画刷。CBrush“画刷画刷”定义了一种位图形式的象素,利用它可对区域定义了一种位图形式的象素,利用它可对区域内部填充颜色或样式。内部填充颜色或样式。CFont“字体字体”是一种具有某种风格和尺寸的所有字符的完整是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还依集合,它常

24、常被当作资源存于磁盘中,其中有一些还依赖于某种设备。赖于某种设备。CPalette “调色板调色板”是一种颜色映射接口,它允许应用程序在不是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下,可以充分利用输出设备的干扰其他应用程序的前提下,可以充分利用输出设备的颜色描绘能力。颜色描绘能力。CPen“画笔画笔”是一种用来画线及绘制有形边框的工具,用户是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及宽度,并且可以指定它画实线、点可以指定它的颜色及宽度,并且可以指定它画实线、点线或虚线等。线或虚线等。CRgn“区域区域”是由多边形、椭圆或二者组合形成的一种范围,是由多边形、椭圆或

25、二者组合形成的一种范围,可以利用它来进行填充、裁剪以及鼠标点中测试等。可以利用它来进行填充、裁剪以及鼠标点中测试等。7.1.5. 图形设备接口图形设备接口在选择在选择GDI对象进展绘图时,可遵照以下步骤:对象进展绘图时,可遵照以下步骤:在堆栈中定义一个在堆栈中定义一个GDI对象对象(如如CPen对象对象),然后用相,然后用相应的函数应的函数(如如CreatePen)创建此创建此GDI对象,有些对象可对象,有些对象可用带参的构造函数一步创建完成。用带参的构造函数一步创建完成。将构造的将构造的GDI对象选入当前设备环境中,同时将原来对象选入当前设备环境中,同时将原来的的GDI对象保管起来。对象保管

26、起来。绘图终了后,恢复当前设备环境中原来的绘图终了后,恢复当前设备环境中原来的GDI对象。对象。程序终了后,框架会自动删除程序创建的程序终了后,框架会自动删除程序创建的GDI对象。对象。7.1.5. 图形设备接口图形设备接口void C*View:OnDraw(CDC* pDC)CPen penBlack; /创建对象创建对象penBlack.CreatePen(PS_SOLID,2,RGB(0,0,0);CPen *pOldPen=pDC-SelectObject(&penBlack);/用该画笔绘图用该画笔绘图pDC-MoveTo(20,50);pDC-LineTo(80,120)

27、;/恢复原来的画笔恢复原来的画笔pDC-SelectObject(pOldPen);7.1.5. 图形设备接口图形设备接口除了自定义的除了自定义的GDI对象外,还可运用对象外,还可运用CDC的成员函数的成员函数SelectStockObject将将Windows预定义的库存预定义的库存GDI对对象选入当前设备环境中,并前往原先被选中的对象指针,象选入当前设备环境中,并前往原先被选中的对象指针,同时使原先被选中的对象从设备环境中分别出来。同时使原先被选中的对象从设备环境中分别出来。可被选中的库存可被选中的库存GDI对象类型:对象类型:BLACK_BRUSH GRAY_BRUSHLTGRAY_BR

28、USH DKGRAY_BRUSH HOLLOW_BRUSH NULL_BRUSH WHITE_BRUSH BLACK_PENWHITE_PEN NULL_PENSYSTEM_FONT DEVICE_DEFAULT_FONT7.2 简单图形绘制简单图形绘制7.2.1. 画画 笔笔 画笔是画笔是Windows运用程序中用来绘制各种直线和曲运用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。型。几何画笔通常在逻辑单元中绘图并受当前绘图方式的影几何画笔通常在逻辑单元中绘图并受当前绘图方式的影响。修饰画笔通常在设备单元中绘

29、图而忽略当前绘图方式。响。修饰画笔通常在设备单元中绘图而忽略当前绘图方式。在这两种类型中,几何画笔的定义最复杂,它不但有修在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的款式、阴影线类型有关,饰画笔的属性,而且还跟画刷的款式、阴影线类型有关,通常用在对绘图有较高要求的场所。而修饰画笔只需简单通常用在对绘图有较高要求的场所。而修饰画笔只需简单的几种属性,通常用在简单的直线和曲线等场所。的几种属性,通常用在简单的直线和曲线等场所。7.2.1. 画画 笔笔一个修饰画笔通常具有宽度、风格和颜色三种一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度

30、,它属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默许的画笔宽度是一个像是用设备单位表示的。默许的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线笔的风格确定了所绘图形的线型,它通常有实线(PS_SOLID)、虚线、虚线(PS_DASH)、点线、点线(PS_DOT)、点划线、点划线(PS_DASHDOT)、双点划、双点划线线(PS_DASHDOTDOT)、不可见线、不可见线(PS_NULL)和内框线和内框线(PS_INSIDEFRAME)等七种风格。等七种风格。 1. 创建画笔创建画笔

31、CPenCPen类封装图形设备接口类封装图形设备接口GDIGDI画笔对象的功能。创画笔对象的功能。创建画笔可以采用以下几种方法:建画笔可以采用以下几种方法:(1)(1)运用无参构造函数声明对象,之后调用成员函运用无参构造函数声明对象,之后调用成员函数数CreatePen()CreatePen()创建详细的画笔。创建详细的画笔。BOOL CreatePen(int nPenStyle, int nWidth, BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor); COLORREF crColor); 其中其中nPenStylen

32、PenStyle表示画笔的款式。表示画笔的款式。nWidthnWidth表示画笔表示画笔的线宽。的线宽。crColorcrColor表示画笔的表示画笔的RGBRGB颜色。颜色。例如:例如:CPen PenCPen Pen; Pen.CreatePen(PS_SOLID,1,RGB(255,0,0);Pen.CreatePen(PS_SOLID,1,RGB(255,0,0);/调用成员函数,创建线宽为调用成员函数,创建线宽为1 1的红色实线画笔的红色实线画笔1. 创建画笔创建画笔(2) 运用构造函数创建画笔运用构造函数创建画笔CPen(int nPenStyle,int nWidth,COLOR

33、REF cfColor)例如:例如: CPen Pen(PS_SOLID,1,RGB(255,0,0); / 调用构造函数,创建线宽为调用构造函数,创建线宽为1的红色实线画笔的红色实线画笔(3) 运用重载的构造函数创建几何画笔运用重载的构造函数创建几何画笔CPen(int nPenStyle,int nWidth, const LOGBRUSH*pLogBrush, i n t n S t y l e C o u n t = 0 , c o n s t D W O R D *lpstyle=NULL);2. 库存画笔库存画笔库存画笔又叫堆画笔。库存画笔又叫堆画笔。WindowsWindows定

34、义了三种库存画笔,定义了三种库存画笔,用户可以直接运用这些画笔,而不用创建对象。三种用户可以直接运用这些画笔,而不用创建对象。三种库存画笔分别是:库存画笔分别是:BLANK_PENBLANK_PEN:黑色画笔;:黑色画笔;WHILE_PENWHILE_PEN:白色画笔;:白色画笔;NULL_PENNULL_PEN:空画笔。:空画笔。可以运用可以运用CreatestockObject()CreatestockObject()函数进展创建。函数进展创建。CPen Pen;CPen Pen;Pen.CreatestockObject(WHILE_PEN);Pen.CreatestockObject(

35、WHILE_PEN);可以以库存画笔为参数来调用可以以库存画笔为参数来调用SelectStockObject()SelectStockObject()函数函数, ,此函数选定放入当前设备环境的新对象,并前往此函数选定放入当前设备环境的新对象,并前往一个指向被交换对象的指针,一个指向被交换对象的指针,CPenCPen* *pOldPen=pDC-pOldPen=pDC-SelectStockObject(BLANK_PEN);SelectStockObject(BLANK_PEN);3. 3. 画笔的运用方法画笔的运用方法(1) (1) 创建画笔;创建画笔;(2) (2) 运用新的画笔,保管原来

36、的画笔以便恢复;运用新的画笔,保管原来的画笔以便恢复; CPen CPen * *pOldPen;pOldPen; pOldPen=pDC-selectObject(&penRed); pOldPen=pDC-selectObject(&penRed);(3) (3) 运用新画笔作图;运用新画笔作图;(4) (4) 恢复原来的画笔恢复原来的画笔 pDC-selectObject(pOldPen);pDC-selectObject(pOldPen);保管并恢复原来画笔的缘由是每个图形设备接口保管并恢复原来画笔的缘由是每个图形设备接口对象要占用一个对象要占用一个HDCHDC句柄,而

37、可用的句柄数量有限,句柄,而可用的句柄数量有限,假设用完后未及时释放,积累下去将导致严重的运转假设用完后未及时释放,积累下去将导致严重的运转错误。错误。7.2.2 画画 刷刷画刷是用来填充图形的工具。画刷是用来填充图形的工具。画刷的属性通常包括填充色、填充图案和填充款式三画刷的属性通常包括填充色、填充图案和填充款式三种。画刷的填充色和画笔颜色一样,都是运用种。画刷的填充色和画笔颜色一样,都是运用COLORREFCOLORREF颜色类型,画刷的填充图案通常是用户定义的颜色类型,画刷的填充图案通常是用户定义的8 x 88 x 8位图,位图,而填充款式往往是而填充款式往往是CDCCDC内部定义的一些

38、特性,它们都是以内部定义的一些特性,它们都是以HS_HS_为前缀的标识,如下图:为前缀的标识,如下图:HS_BDIAGONALHS_CROSSHS_DIAGCROSSHS_FDIAGONAL HS_HORIZONTAL HS_VERTICAL图图7.3 画刷的填充款式画刷的填充款式7.2.2 画画 刷刷MFCMFC把把GDIGDI画刷封装在画刷封装在CRushCRush类中。画刷的运用方类中。画刷的运用方法同画笔。画刷分为纯色画刷、阴影画刷、堆画刷法同画笔。画刷分为纯色画刷、阴影画刷、堆画刷和图案画刷。和图案画刷。CBrushCBrush类为不同的画刷类型提供了不类为不同的画刷类型提供了不同的

39、构造函数。同的构造函数。WindowsWindows定义的堆画刷共有定义的堆画刷共有7 7种,分别是:种,分别是:BLACK_BRUSHBLACK_BRUSH:黑色画刷;:黑色画刷;DKGRAY_BRUSHDKGRAY_BRUSH:深灰色画刷;:深灰色画刷;GRAY_BRUSHGRAY_BRUSH:灰色画刷;:灰色画刷;HOLLOW_BRUSHHOLLOW_BRUSH:空画刷;:空画刷;LTGRAY_BRUSHLTGRAY_BRUSH:浅灰色画刷;:浅灰色画刷;NULL_BRUSHNULL_BRUSH:空画刷;:空画刷;WHITE_BRUSHWHITE_BRUSH:白色画刷;:白色画刷;7.2

40、.2 画画 刷刷对堆画刷,调用对堆画刷,调用SelectStockObject()SelectStockObject()函数进展函数进展选择画刷,选择画刷,例如:例如:C B r u s h C B r u s h * * p O l d B r u s h = p D C - p O l d B r u s h = p D C - SelectStockObject(WHITE_BRUSH); SelectStockObject(WHITE_BRUSH); / / 选择白色堆画刷选择白色堆画刷 创建创建CBrushCBrush对象的四个构造函数为:对象的四个构造函数为:(1) CBrush(

41、); / (1) CBrush(); / 运用前必需初始化画刷运用前必需初始化画刷(2) CBrush (COLORREF cfColor); (2) CBrush (COLORREF cfColor); / / 构造带有指定颜色的纯色画刷构造带有指定颜色的纯色画刷如:如:CBrush Brush(RGB(255,0,0); / CBrush Brush(RGB(255,0,0); / 创建红色画创建红色画刷刷(3) CBrush(int nIndex, COLORREF cfColor);(3) CBrush(int nIndex, COLORREF cfColor); / / 构造带有指定

42、填充款式和颜色的填充画刷构造带有指定填充款式和颜色的填充画刷(4) CBrush(CBitmap(4) CBrush(CBitmap* *pBitmap);pBitmap); / / 构造运用位图图案的画刷构造运用位图图案的画刷 CBitmap CBitmap对象最大可运用对象最大可运用8 88 8像素,假设位图过大,像素,假设位图过大,那么只需左上角的部分可以用作画刷图案。那么只需左上角的部分可以用作画刷图案。7.2.3 绘绘 图图 示示 例例MFC为用户的图形绘制提供了为用户的图形绘制提供了许多函数,这其中包括画点、线、许多函数,这其中包括画点、线、矩形、多边形、圆弧、椭圆、扇形矩形、多边

43、形、圆弧、椭圆、扇形以及以及Bzier曲线等。曲线等。例:一个简单图形的绘制例如,例:一个简单图形的绘制例如,表示一个班级某门课程的成果分布,表示一个班级某门课程的成果分布,它是一个直方图,反映它是一个直方图,反映90五个分数段的人数,它需求绘五个分数段的人数,它需求绘制五个矩形,相邻矩形的填充款式制五个矩形,相邻矩形的填充款式还要有所区别,并且还需求显示各还要有所区别,并且还需求显示各分数段的人数。分数段的人数。Ex_Draw运转结果运转结果7.3 字体与文字处置字体与文字处置字体字体 字体定义显示文本的符号和字符,经过字体定义显示文本的符号和字符,经过处置字体可以显示某种特殊效果的文字,处

44、置字体可以显示某种特殊效果的文字,描画输出文字的字体可用描画输出文字的字体可用CFontCFont对象。对象。CFontCFont对象的运用方法与画笔和画刷类似,对象的运用方法与画笔和画刷类似,定义字体对象,定义字体对象,创建字体并保管原来的字体,创建字体并保管原来的字体,在文字输出任务终了后恢复原来的字体。在文字输出任务终了后恢复原来的字体。7.3.1 字体和字体对话框字体和字体对话框1.字体的属性字体的属性字体的主要属性有字样、风格和尺寸。字样是字字体的主要属性有字样、风格和尺寸。字样是字符书写和显示时表现的特定方式,如宋体、楷体等符书写和显示时表现的特定方式,如宋体、楷体等多种字样。字体

45、风格主要表现为字体的粗细和能否多种字样。字体风格主要表现为字体的粗细和能否倾斜等特点。字体是用来指定字体所占区域的大小,倾斜等特点。字体是用来指定字体所占区域的大小,通常用字符高度来描画。通常用字符高度来描画。2. 字体的创建字体的创建(1)为了方便用户创建字体,系统定义一种逻辑为了方便用户创建字体,系统定义一种逻辑字体,根据定义的逻辑字体,可调用字体,根据定义的逻辑字体,可调用CFont类的类的CreateFontIndirect函数来创建字体。函数来创建字体。(P217)typedef struct tagLOGFONT LONG lfHeight; / 字体的逻辑高度字体的逻辑高度 LO

46、NG lfWidth; / 字符的平均逻辑宽度字符的平均逻辑宽度 LONG lfEscapement; / 倾角倾角 LONG lfOrientation; / 书写方向书写方向 LONG lfWeight; / 字体的粗细程度字体的粗细程度 BYTE lfItalic; / 斜体标志斜体标志 BYTE lfUnderline; / 下划线标志下划线标志 BYTE lfStrikeOut; / 删除线标志删除线标志 BYTE lfCharSet; / 字符集,汉字必需为字符集,汉字必需为GB2312_CHARSET TCHAR lfFaceNameLF_FACESIZE / 字样称号字样称号/

47、 LOGFONT; 2 2字体的创建字体的创建(2)(2)当需求某一特定的字体时,还可以运用当需求某一特定的字体时,还可以运用MFCMFC的的CFontCFont类的类的CreateFont()CreateFont()成员函数来创建字体,假设成员函数来创建字体,假设该函数调用胜利,那么前往非该函数调用胜利,那么前往非0 0值,否那么前往值,否那么前往0 0。其函数原型如下:其函数原型如下:BOOL CFont:CreateFont(BOOL CFont:CreateFont(int nHeight, / int nHeight, / 字符逻辑高度字符逻辑高度int nWidth, / int

48、nWidth, / 字符逻辑宽度字符逻辑宽度int nEscapement, / int nEscapement, / 出口矢量与出口矢量与X X轴的角度轴的角度int nOrientation, / int nOrientation, / 字符基线与字符基线与X X轴的角度轴的角度int nWeight, / int nWeight, / 字体磅值字体磅值BYTE bItalic, / BYTE bItalic, / 非非0 0那么为斜体那么为斜体BYTE bUnderline, / BYTE bUnderline, / 非非0 0那么加下划线那么加下划线BYTE cStrickOut, /

49、 BYTE cStrickOut, / 非非0 0那么加删除线那么加删除线BYTE nCharSet, / BYTE nCharSet, / 此字体的字符集此字体的字符集BYTE nClipPrecision, / BYTE nClipPrecision, / 裁剪精度裁剪精度BYTE nQualty, / BYTE nQualty, / 输出质量输出质量BYTE nPitAndFamity, / BYTE nPitAndFamity, / 调距和字体族调距和字体族LPCSTR lpszFacenameLPCSTR lpszFacename;/ / 字体的字符名字体的字符名););Create

50、Font()CreateFont()成员函数并不能产生新的成员函数并不能产生新的Windows Windows GDIGDI字体,它只是从字体,它只是从GDIGDI字库中选择一种最近似的字库中选择一种最近似的可用字体。可用字体。2 2字体的创建字体的创建(2)(2)7.3.1 字体和字体对话框字体和字体对话框3. 运用字体对话框运用字体对话框CFontDialog类提供了字体及其文本颜色选择的类提供了字体及其文本颜色选择的通用对话框。通用对话框。 它的构造函数如下:它的构造函数如下:CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags

51、 = CF_EFFECTS |CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );7.3.2 常用文本输出函数常用文本输出函数文本的最终输出不仅依赖于文本的字体,而且还跟文文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式等有很大关系。本的颜色、对齐方式等有很大关系。CDC类提供了类提供了4个个输出文本的函数。输出文本的函数。 (1)TextOut函数是用当前字体在指定位置函数是用当前字体在指定位置 (x,y) 处显示一个文本。处显示一个文本。 virtual BOOL TextOut(int x,i

52、nt y,LPCTSTR lpszString int nCount);BOOL TextOut(int x,int y,const CString & str);7.3.2 常用文本输出函数常用文本输出函数(2) TabbedTextOut也是用当前字体在指定位置也是用当前字体在指定位置处显示一个文本,但它还根据指定的制表位处显示一个文本,但它还根据指定的制表位(Tab)设设置相应字符位置,函数胜利时前往输出文本的大小。置相应字符位置,函数胜利时前往输出文本的大小。virtual CSize TabbedTextOut(int x,int y,LPCTSTR lpszString i

53、nt nCount,int nTabPositions,LPINT lpnTabStopPostions,int nTabOrigin);CSize TabbedTextOut(int x,int y,const CString &str,int nTabPositions,LPINT lpnTabStopPostions,int nTabOrigin);7.3.2 常用文本输出函数常用文本输出函数(3) DrawText函数是当前字体在指定矩形中对函数是当前字体在指定矩形中对文本进展格式化绘制。文本进展格式化绘制。 virtual int DrawText( LPCTSTR lpsz

54、String, int nCount, LPRECT lpRect, UINT nFormat );int DrawText( const CString& str, LPRECT lpRect, UINT nFormat );7.3.2 常用文本输出例如常用文本输出例如n绘制以下图形绘制以下图形(10,10)(200,140)20020停顿位为停顿位为40个单位个单位停顿位为停顿位为80个单位个单位停顿位为停顿位为默许值默许值在在C*View类的类的OnDraw(CDC *pDC)函数中函数中添加绘图代码:添加绘图代码:CRect rc(10, 10, 200, 140);pDC-R

55、ectangle( rc );pDC-DrawText( 单行文本居中单行文本居中, rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);在在C*View类的类的OnDraw(CDC *pDC)函数中函数中添加绘图代码:添加绘图代码:rc.OffsetRect( 200, 0 );/ 将矩形向右偏移将矩形向右偏移200pDC-Rectangle( rc );int nTab = 40; /将将Tab位的值指定为位的值指定为40个逻辑单位个逻辑单位pDC-TabbedTextOut( rc.left, rc, 绘制绘制tTabt文文本本t例如例如, 1, &a

56、mp;nTab, rc.left); / 运用自定义的停顿位运用自定义的停顿位(Tab)nTab = 80;pDC-TabbedTextOut( rc.left, rc+20, 绘制绘制tTabt文本文本t例如例如, 1, &nTab, rc.left); / 运用自定义的停顿位运用自定义的停顿位(Tab)pDC-TabbedTextOut( rc.left, rc+40, 绘制绘制tTabt文本文本t例如例如, 0, NULL, 0);/ 运用默许的停顿位运用默许的停顿位7.3.3 文本格式化属性文本格式化属性文本的格式属性通常包括文本颜色、对齐方式、字文本的格式属性通常包括文本颜色

57、、对齐方式、字符间隔以及文本调整等。在绘图设备环境中,默许的符间隔以及文本调整等。在绘图设备环境中,默许的文本颜色是黑色,而文本背风光为白色,文本颜色是黑色,而文本背风光为白色,在在CDC类中,类中,SetTextColor、SetBkColor和和SetBkMode函数就是分别用来设置文本颜色、文本函数就是分别用来设置文本颜色、文本背风光和背景方式,而与之相对应的背风光和背景方式,而与之相对应的GetTextColor、GetBkcolor和和GetBkMode函数那么是分别获取这函数那么是分别获取这三项属性的。三项属性的。SetTextAlign、GetTextAlign函数是设置和获取函

58、数是设置和获取文本对齐方式文本对齐方式(文本的对齐方式如文本的对齐方式如P221表表7.5所示所示)。7.3.3 文本格式化属性文本格式化属性virtual COLORREF SetTextColor( COLORREF crColor );COLORREF GetTextColor( ) const;virtual COLORREF SetBkColor( COLORREF crColor );COLORREF GetBkColor( ) const;int SetBkMode( int nBkMode );int GetBkMode( ) const;UINT SetTextAlign(U

59、INT nFlags);UINT GetTextAlign() const;7.3.4 计算字符的几何尺寸计算字符的几何尺寸在打印和显示文本时,假设了解字符的高度在打印和显示文本时,假设了解字符的高度计算及字符的丈量方式,能更好地控制文本输出计算及字符的丈量方式,能更好地控制文本输出效果。效果。在在CDC类中,类中,GetTextMetrics(LPTEXTMETRIC lpMetrics)函数是用来获得指定映射方式下相关设备环境的函数是用来获得指定映射方式下相关设备环境的字符几何尺寸及其它属性的。字符几何尺寸及其它属性的。7.3.4 计算字符的几何尺寸计算字符的几何尺寸typedef str

60、uct tagTEXTMETRIC int tmHeight; / 字符的高度字符的高度 int tmAscent; / 高于基准线部分的值高于基准线部分的值 int tmDescent; / 低于基准线部分的值低于基准线部分的值 int tmInternalLeading; / 字符内标高字符内标高 int tmExternalLeading; / 字符外标高字符外标高 int tmAveCharWidth; / 字体中字符平均宽度字体中字符平均宽度 int tmMaxCharWidth; / 字符的最大宽度字符的最大宽度 / TEXTMETRIC; 7.3.4 计算字符的几何尺寸计算字符的几何尺寸计算字符的几何尺寸的方法:计算字符的几何尺寸的方法:利用利用TEXTMETRIC类型变量的成员。类型变量的成员。如:计算字符的总高

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论