第6章 图形文本和打印.pptx
《第6章 图形文本和打印.pptx》由会员分享,可在线阅读,更多相关《第6章 图形文本和打印.pptx(95页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 6.1概述概述 6.2 6.3图形设备接口图形设备接口图形绘制图形绘制 6.4 6.5字体与文字处理字体与文字处理图标与光标图标与光标 6.6打印与打印预览打印与打印预览6.1.1 设备环境类设备环境类设备环境类CDC提供了绘制和打印的全部函数。(1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。(2)CClientDC只能在窗口的客户区中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。(
2、3)CMetaFileDC封装了在一个Windows图元文件中绘图的方法。看看下列语句:pDC-Rectangle(CRect(0,0,200,200);它是在某设备环境中绘制出一个高为200个像素,宽也为200个像素的方块。由于默认的映射模式是MM_TEXT,其逻辑坐标(在映射模式下的坐标)和设备坐标(显示设备或打印设备坐标系下的坐标)相等。如表6.1所示。映射模式映射模式含含 义义MM_TEXT每个逻辑单位等于一个设备像素,x向右为正,y向下为正MM_HIENGLISH每个逻辑单位为,x向右为正,y向上为正MM_LOENGLISH每个逻辑单位为,x向右为正,y向上为正MM_HIMETRIC
3、每个逻辑单位为,x向右为正,y向上为正MM_LOMETRIC每个逻辑单位为,x向右为正,y向上为正 MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72 英寸),x向右为正,y向上为正MM_ANISOTROPICx,y可变比例MM_ISOTROPICx,y等比例在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC:SetWindowExt(设置窗口大小)和CDC:SetViewportExt(设置视口大小)函数来设置所需要的比例因子。根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:x比例因子=视口x大小/窗口x大小y比例因子
4、=视口y大小/窗口y大小下面的示例是通过设置窗口和视口大小来改变显示的比例。创建一个默认的单文档应用程序Ex_Scale。在CEx_ScaleView:OnDraw函数中添加下列代码:voidCEx_ScaleView:OnDraw(CDC*pDC)CEx_ScaleDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRectrectClient;GetClientRect(rectClient);/获得当前窗口的客户区大小pDC-SetMapMode(MM_ANISOTROPIC);/设置MM_ANISOTROPIC映射模式pDC-SetWindowExt(
5、1000,1000);/设置窗口范围pDC-SetViewportExt(rectClient.right,-rectClient.bottom);/设置视口范围pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);/设置视口原点pDC-Ellipse(CRect(-500,-500,500,500);编译运行,结果如图6.1所示。在图形绘制操作中,常常需要使用MFC中的CPoint、CSize和CRect等简单数据类。由于CPoint(点)、CSize(大小)和CRect(矩形)是对Windows的POINT、SIZE和RECT
6、结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示:typedefstructtagPOINTLONGx;/点的x坐标LONGy;/点的y坐标POINT;typedefstructtagSIZEintcx;/水平大小intcy;/垂直大小SIZE;typedefstructtagRECTLONGleft;/矩形左上角点的x坐标LONGtop;/矩形左上角点的y坐标LONGright;/矩形右下角点的x坐标LONGbottom;/矩形右下角点的y坐标RECT;1.CPoint、CSize和和CRect类的构造函数类的构造函数CPoint类带参数的常用构造函数原型如下:CPoint(in
7、t initX,int initY);CPoint(POINT initPt);CSize类带参数的常用构造函数原型如下:CSize(int initCX,int initCY);CSize(SIZE initSize);CRect类带参数的常用构造函数原型如下:CRect(int l,int t,int r,int b);CRect(const RECT&srcRect);CRect(LPCRECT lpSrcRect);CRect(POINT point,SIZE size);CRect(POINT topLeft,POINT bottomRight);2.CRect类的常用操作类的常用操
8、作由于一个CRect类对象包含用于定义矩形的左上角和右下角点的成员变量,因此在传递LPRECT、LPCRECT或RECT结构作为参数的任何地方,都可以使用CRect对象来代替。CRect类的操作函数有很多,这里只介绍矩形的扩大、缩小以及两个矩形的“并”和“交”操作,更多的常用操作如表6.2所示。成员函数成员函数功能说明功能说明int Width()const;返回矩形的宽度int Height()const;返回矩形的高度CSize Size()const;返回矩形的大小,CSize中的cx和cy成员分别表示矩形的宽度和高度CPoint&TopLeft();返回矩形左下角的点坐标CPoint&
9、BottomRight();返回矩形右下角的点坐标CPoint CenterPoint()const;返回CRect的中点坐标BOOL IsRectEmpty()const;如果一个矩形的宽度或高度是0或负值,则称这个矩形为空,返回TRUEBOOL IsRectNull()const;如果一个矩形的上、左、下和右边的值都等于0,则返回TRUEBOOL PtInRect(POINT point)const;如果点point位于矩形中(包括点在矩形的边上),则返回TRUEvoid SetRect(int x1,int y1,int x2,int y2);将矩形的各边设为指定的值,左上角点为(x1,
10、y1),右下角点为(x2,y2)void SetRectEmpty();将矩形的所有坐标设置为零void NormalizeRect();使矩形符合规范void OffsetRect(int x,int y);void OffsetRect(POINT point);void OffsetRect(SIZE size);移动矩形,水平和垂直移动量分别由x、y或point、size的两个成员来指定成员函数InflateRect和DeflateRect用来扩大和缩小一个矩形。由于它们的操作是相互的,也就是说,若指定InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此下面只给出In
11、flateRect函数的原型:void InflateRect(int x,int y);void InflateRect(SIZE size);void InflateRect(LPCRECT lpRect);void InflateRect(int l,int t,int r,int b);成员函数IntersectRect和UnionRect分别用来将两个矩形进行相交和合并,当结果为空时返回FALSE,否则返回TRUE。它们的原型如下:BOOL IntersectRect(LPCRECT lpRect1,LPCRECT lpRect2);BOOL UnionRect(LPCRECT lp
12、Rect1,LPCRECT lpRect2);在MFC中,CDC使用的是RGB颜色空间,并使用COLORREF数据类型来表示一个32位的RGB颜色,它也可以用下列的十六进制表示:0 x00bbggrr此形式的rr、gg、bb分别表示红、绿、蓝三个颜色分量的16进制值,最大为0 xff。在具体操作RGB颜色时,还可使用下列的宏操作:GetBValue获得32位RGB颜色值中的蓝色分量GetGValue获得32位RGB颜色值中的绿色分量GetRValue获得32位RGB颜色值中的红色分量RGB将指定的R、G、B分量值转换成一个32位的RGB颜色值。MFC的CColorDialog类为应用程序提供了
13、颜色选择通用对话框,如图6.2所示。它具有下列的构造函数:CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd*pParentWnd=NULL);例如用于画线的“画笔”、填充区域的“画刷”以及用于绘制文本的“字体”。MFC封装了这些工具,并提供相应的类来作为应用程序的图形设备接口GDI,这些类有一个共同的抽象基类CGdiObject,具体如表6.3所示。类类 名名说说 明明CBitmap“位图”是一种位矩阵,每一个显示象素都对应于其中的一个或多个位。用户可以利用位图来表示图像,也可以利用它来创建画刷。CBrush“画刷”定义了一种位图形式的象
14、素,利用它可对区域内部填充颜色或样式。CFont“字体”是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还依赖于某种设备。CPalette“调色板”是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下,可以充分利用输出设备的颜色描绘能力。CPen“画笔”是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及宽度,并且可以指定它画实线、点线或虚线等。CRgn“区域”是由多边形、椭圆或二者组合形成的一种范围,可以利用它来进行填充、裁剪以及鼠标点中测试等。在选择GDI对象进行绘图时,往往遵循着下列的步骤:在堆栈中定义一个GDI对象(如CPen、CBr
15、ush对象),然后用相应的函数(如CreatePen、CreateSolidBrush)创建此GDI对象。但要注意:有些GDI派生类的构造函数允许用户提供足够的信息,从而一步即可完成对象的创建任务,这些类有CPen、CBrush。将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来。绘图结束后,恢复当前设备环境中原来的GDI对象。由于GDI对象是在堆栈中创建中,当程序结束后,会自动删除程序创建的GDI对象。具体操作可像下面的代码过程:voidCMyView:OnDraw(CDC*pDC)CPenpenBlack;/定义一个画笔变量penBlack.CreatePen(PS
16、_SOLID,2,RGB(0,0,0);/创建画笔/将此画笔选入当前设备环境并保存原来的画笔CPen*pOldPen=pDC-SelectObject(&penBlack);/用此画笔绘图pDC-MoveTo(.);pDC-LineTo(.);/其他绘图函数pDC-SelectObject(pOldPen);/恢复设备环境中原来的画笔画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。这些风格在Windows中都是以PS_为前缀的预定义的标识,如表6.4所示。风风 格格含含 义义图图 例例PS_SOLID实线P
17、S_DASH虚线PS_DOT点线PS_DASHDOT点划线PS_DASHDOTDOT双点划线PS_NULL不可见线PS_INSIDEFRAME内框线创建一个修饰画笔,可以使用CPen类的CreatePen函数,其原型如下:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);其中,参数nPenStyle、nWidth、crColor分别用来指定画笔的风格、宽度和颜色。此外,还有一个CreatePenIndirect函数也是用来创建画笔对象,它的作用与CreatePen函数是完全一样的,只是画笔的三个属性不是直接出现在函数参数中,而是
18、通过一个LOGPEN结构间接地给出。BOOL CreatePenIndirect(LPLOGPEN lpLogPen);此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下:typedefstructtagLOGPEN/*lgpn*/UINTlopnStyle;/画笔风格,同上POINTlopnWidth/POINT结构的y不起作用,而用x表示画笔宽度COLORREFlopnColor;/画笔颜色LOGPEN;画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8x8位图,而填充样式
19、往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识,如图6.3所示:HS_BDIAGONALHS_CROSSHS_DIAGCROSSHS_FDIAGONAL HS_HORIZONTAL HS_VERTICALCBrush类根据画刷属性提供了相应的创建函数,例如创建填充色画刷和填充样式画刷的函数为CreateSolidBrush和CreateHatchBrush,它们的原型如下:BOOL CreateSolidBrush(COLORREF crColor);/创建填充色画刷BOOL CreateHatchBrush(int nIndex,COLORREF crColor);/创建填充样
20、式画刷与画笔相类似,也有一个LOGBRUSH逻辑结构用于画刷属性的定义,并通过CBrush的成员函数CreateBrushIndirect来创建,其原型如下:BOOL CreateBrushIndirect(const LOGBRUSH*lpLogBrush);1.CBitmap类类CBitmap类封装了Windows的GDI位图操作所需的大部分函数。其中,LoadBitmap是位图的初始化函数,其函数原型如下:BOOL LoadBitmap(LPCTSTR lpszResourceName);BOOL LoadBitmap(UINT nIDResource);该函数从应用程序中调入一个位图资
21、源(由nIDResource或lpszResourceName指定)。若用户直接创建一个位图对象,可使用CBitmap类中的CreateBitmap、CreateBitmapIndirect以及CreateCompatibleBitmap函数,其原型如下。BOOL CreateBitmap(int nWidth,int nHeight,UINT nPlanes,UINT nBitcount,const void*lpBits);2.GDI的的显示显示调用CBitmap类的CreateBitmap、CreateCompatibleBitmap以及CreateBitmapIndirect函数创建一
22、个适当的位图对象。调用CDC:CreateCompatibleDC函数创建一个内存设备环境,以便位图在内存中保存下来,并与指定设备(窗口设备)环境相兼容;调用CDC:SelectObject函数将位图对象选入内存设备环境中;调用CDC:BitBlt或CDC:StretchBlt函数将位图复制到实际设备环境中。使用之后,恢复原来的内存设备环境。下面的示例过程就是调用一个位图并在视图中显示。用MFCAppWizard(exe)创建一个默认的单文档应用程序Ex_BMP。按快捷键Ctrl+R,弹出“插入资源”对话框,选择Bitmap资源类型。单击“引入”按钮,出现“引入资源”对话框,将文件类型选择为“
23、所有文件(*.*)”,从外部文件中选定一个位图文件,然后单击“引入”按钮。在CEx_BMPView:OnDraw函数中添加下列代码:voidCEx_BMPView:OnDraw(CDC*pDC)CEx_BMPDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CBitmapm_bmp;m_bmp.LoadBitmap(IDB_BITMAP1);/调入位图资源BITMAPbm;/定义一个BITMAP结构变量m_bmp.GetObject(sizeof(BITMAP),&bm);CDCdcMem;/定义并创建一个内存设备环境dcMem.CreateCompatibl
24、eDC(pDC);CBitmap*pOldbmp=dcMem.SelectObject(&m_bmp);/将位图选入内存设备环境中pDC-BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);/将位图复制到实际的设备环境中dcMem.SelectObject(pOldbmp);/恢复原来的内存设备环境编译运行,结果如图6.4所示。6.3.1 画点、线画点、线1.点点画点是最基本的绘图操作之一,它是通过调用CDC:SetPixel或CDC:SetPixelV函数来实现的。这两个函数都是用来在指定的坐标上设置指定的颜色,只不过SetPixelV
25、函数不需要返回实际像素点的RGB值;正是因为这一点,函数SetPixelV要比SetPixel快得多。COLORREF SetPixel(int x,int y,COLORREF crColor);COLORREF SetPixel(POINT point,COLORREF crColor);BOOL SetPixelV(int x,int y,COLORREF crColor);BOOL SetPixelV(POINT point,COLORREF crColor);与上述函数相对应的GetPixel函数是用来获取指定点的颜色。COLORREF GetPixel(int x,int y)co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 图形文本和打印 图形 文本 打印
限制150内