《Visual C++ 第二版》第8章图形和文本

上传人:hjk****65 文档编号:204685944 上传时间:2023-04-27 格式:PPT 页数:43 大小:460.50KB
收藏 版权申诉 举报 下载
《Visual C++ 第二版》第8章图形和文本_第1页
第1页 / 共43页
《Visual C++ 第二版》第8章图形和文本_第2页
第2页 / 共43页
《Visual C++ 第二版》第8章图形和文本_第3页
第3页 / 共43页
资源描述:

《《Visual C++ 第二版》第8章图形和文本》由会员分享,可在线阅读,更多相关《《Visual C++ 第二版》第8章图形和文本(43页珍藏版)》请在装配图网上搜索。

1、第第8章章图形和文本图形和文本 8.18.1设备环境和简单数据类设备环境和简单数据类 8.28.2图形设备接口图形设备接口 8.38.3图形绘制图形绘制 8.48.4字体与文字处理字体与文字处理 8.1设备环境和简单数据类设备环境和简单数据类 8.1.18.1.1设备环境和简单数据类设备环境和简单数据类 设备环境类CDC提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。(1)(1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC

2、指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。(2)(2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数。(3)(3)CMetaFileDC封装了在一个Windows图元文件中绘

3、图的方法。图元文件是一系列与设备无关的图片的集合,由于它对图象的保存比像素更精确,因而往往在要求较高的场合下使用,例如AutoCAD的图像保存等。目前的Windows已使用增强格式(enhanced-format)的32位图元文件来进行操作。8.1设备环境和简单数据类设备环境和简单数据类 8.1.2坐标映射坐标映射 为了能保证打印的结果不受设备的影响,定义了一些映射模式,这些映射模式决定了设备坐标和逻辑坐标之间的关系,如表。这样,我们就可以通过调用CDC:SetMapMode(int nMapMode)来设置相应的映射模式。在MM_ISOTROPIC映射模式下,纵横比总是1:1;但在MM_AN

4、ISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,调用CDC:SetWindowExt(设置窗口大小)和CDC:SetViewportExt(设置视口大小)函数来设置所需要的比例因子。所谓“窗口”,可以理解成是一种逻辑坐标下的窗口,“视口”是实际看到的那个窗口。根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:x比例因子=视口x大小/窗口x大小y比例因子=视口y大小/窗口y大小 8.1设备环境和简单数据类设备环境和简单数据类(1)(1)创建一个默认的单文档应用程序Ex

5、_Draw。(2)(2)在CEx_DrawView:OnDraw函数中添加下列代码:void CEx_DrawView:OnDraw(CDC*pDC)CEx_DrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect rectClient;GetClientRect(rectClient);/获得当前窗口的客户区大小pDC-SetMapMode(MM_ANISOTROPIC);/设置MM_ANISOTROPIC映射模式pDC-SetWindowExt(1000,1000);/设置窗口范围pDC-SetViewportExt(rectClient.ri

6、ght,-rectClient.bottom);/设置视口范围pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);pDC-Ellipse(CRect(-500,-500,500,500);(3)(3)编译运行,如图。8.1设备环境和简单数据类设备环境和简单数据类 8.1.3CPoint、CSize和和CRect CPoint、CSize和和CRect类的构造函数类的构造函数 CPoint类带参数的常用构造函数原型如下:CPointCPoint(intint initX,intint initY););CPointCPoint(P

7、OINT(POINT initPt););CSize类带参数的常用构造函数原型如下:CSizeCSize(intint initCX,intint initCY););CSizeCSize(SIZE(SIZE initSize););CRect类带参数的常用构造函数原型如下:CRect(int CRect(int l,int,int t,int,int r,int,int b););CRectCRect(const RECT&(const RECT&srcRect););CRectCRect(LPCRECT(LPCRECT lpSrcRect););CRectCRect(POINT(POINT

8、 point,SIZE,SIZE size););CRectCRect(POINT(POINT topLeft,POINT,POINT bottomRight););l、t、r、b指定CRect的left、top、right和bottom成员的值。srcRect 和lpSrcRect用一个RECT结构或指针来初始化CRect的成员。point指定矩形的左上角位置。size指定矩形的长度和宽度。topLeft和bottomRight指定CRect的左上角和右下角的位置。8.1设备环境和简单数据类设备环境和简单数据类 CRect类的常用操作类的常用操作 传递LPRECT、LPCRECT或RECT结

9、构作为参数的任何地方,都可以用CRect对象来代替。构造一个CRect时,要使它符合规范。即使其left小于right,top小于bottom。一个不 符 合 规 范 的 矩 形,CRect的 许 多 成 员 函 数 都 不 会 有 正 确 的 结 果。常 常 用CRect:NormalizeRect函数使一个不符合规范的矩形合乎规范。成员函数InflateRect和DeflateRect用来扩大和缩小一个矩形。由于它们的操作是相互的,也就是说,若指定InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此下面只给出InflateRect函数的原型:void void Infla

10、teRectInflateRect(intint x,intint y););void void InflateRectInflateRect(SIZE(SIZE size););void void InflateRectInflateRect(LPCRECT(LPCRECT lpRect););void void InflateRectInflateRect(intint l,intint t,intint r,intint b););x指定扩大CRect左、右边的数值。y指定扩大CRect上、下边的数值。size中的cx成员指定扩大左、右边的数值,cy指定扩大上、下边的数值。lpRect的

11、各个成员指定扩大每一边的数值。l、t、r和b指定扩大CRect左、上、右和下边的数值。对于前两个重载函数来说,CRect的总宽度被增加了两倍的x或cx,总高度被增加了两倍的y或cy。成员函数IntersectRect和UnionRect用来将两个矩形进行相交和合并。原型如下:BOOL BOOL IntersectRectIntersectRect(LPCRECT(LPCRECT lpRect1,LPCRECT,LPCRECT lpRect2););BOOL BOOL UnionRectUnionRect(LPCRECT(LPCRECT lpRect1,LPCRECT,LPCRECT lpRe

12、8.1设备环境和简单数据类设备环境和简单数据类8.1设备环境和简单数据类设备环境和简单数据类 8.1.4颜色和颜色对话框颜色和颜色对话框 一个彩色象素常用的颜色空间有RGB和YUV两种。CDC使用的是RGB颜色空间。COLORREF是用来表示RGB颜色的一个32位的数据类型,它可以用十六进制表示一个RGB值:0 x00bbggrr rr、gg、bb表示红、绿、蓝三个颜色分量的16进制值。使用下列的宏操作:GetBValue 获得32位RGB颜色值中的蓝色分量GetGValue 获得32位RGB颜色值中的绿色分量GetRValue 获得32位RGB颜色值中的红色分量RGB 将指定的R、G、B分量

13、值转换成一个32位的RGB颜色值。MFC的CColorDialog类为应用程序提供了颜色选择通用对话框。构造函数:CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd*pParentWnd=NULL);dwFlags表示定制对话框外观和功能的系列标志参数。可以是下列之一或”|”组合:CC_ANYCOLOR 在基本颜色单元中列出所有可得到的颜色CC_FULLOPEN 显示所有的颜色对话框界面CC_PREVENTFULLOPEN 禁用“规定自定义颜色”按钮CC_SHOWHELP 在对话框中显示“帮助”按钮CC_SOLIDCOLOR 在基本颜色单元

14、中只列出所得到的纯色 单击对话框“确定”退出(即DoModal返回 IDOK)时,可调用下列成员获得相应的颜色。COLORREF COLORREF GetColorGetColor()const;()const;/返回用户选择的颜色。void void SetCurrentColorSetCurrentColor(COLORREF(COLORREF clr);/);/强制使用clr作为当前选择的颜色static COLORREF*GetSavedCustomColors();/返回用户自己定义颜色 8.2图形设备接口图形设备接口 Windows为设备环境提供了各种各样的绘图工具,例如用于画线的

15、“画笔”、填充区域的“画刷”以及用于绘制文本的“字体”。MFC封装了这些工具,并提供相应的类来作为应用程序的图形设备接口GDI,这些类有一个共同的抽象基类CGdiObject,如表。8.2图形设备接口图形设备接口 8.2.1GDI对象一般使用方法对象一般使用方法 选择GDI对象进行绘图时,往往遵循着下列的步骤:(1)(1)在堆栈中定义一个GDI对象,用相应的函数创建此GDI对象。要注意:有些GDI派生类的构造函数允许用户提供足够的信息,从而一步即可完成对象的创建任务。(2)(2)将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来。(3)(3)绘图结束后,恢复当前设备环境

16、中原来的GDI对象。(4)(4)GDI对象是在堆栈中创建中,程序结束后,框架会自动删除程序创建的GDI对象。具体操作可像下面的代码过程:void CMyView:OnDraw(CDC*pDC)CPen penBlack;/定义一个画笔变量penBlack.CreatePen(PS_SOLID,2,RGB(0,0,0);/创建画笔/将此画笔选入当前设备环境并保存原来的画笔CPen*pOldPen=pDC-SelectObject(&penBlack);/用此画笔绘图pDC-MoveTo(.);pDC-LineTo(.);pDC-SelectObject(pOldPen);/恢复设备环境中原来的画

17、笔8.2图形设备接口图形设备接口 8.2.2画笔画笔 画笔是绘制各种直线和曲线的一种图形工具,可分为修饰画笔和几何画笔两种类型。几何画笔不但有修饰画笔的属性,还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。修饰画笔通常用在简单的直线和曲线等场合。一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。如表。8.2图形设备接口图形设备接口创建一个修饰画笔,可以使用CPen

18、类的CreatePen函数,其原型如下:BOOL BOOL CreatePenCreatePen(intint nPenStyle,intint nWidth,COLORREF,COLORREF crColor););参数nPenStyle、nWidth、crColor指定画笔的风格、宽度和颜色。此外,还有一个CreatePenIndirect函数也是用来创建画笔对象,它的作用与CreatePen函数是完全一样的,只是画笔的三个属性不是直接出现在函数参数中,而是通过一个LOGPEN结构间接地给出。BOOL BOOL CreatePenIndirectCreatePenIndirect(LPLO

19、GPEN(LPLOGPEN lpLogPen););此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下:typedef struct tagLOGPEN /*lgpn*/UINT lopnStyle;/画笔风格 POINT lopnWidth;/POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor;/画笔颜色 LOGPEN;注意:l修 饰 画 笔 的 宽 度 大 于 1个 像 素 时,画 笔 的 风 格 只 能 取 PS_NULL、PS_SOLID或 PS_INSIDEFRAME,定义为其他风格不会起作用。l画笔的创建工作也可在画笔的构造

20、函数中进行,它具有下列原型:CPen(int nPenStyle,int nWidth,COLORREF crColor);8.2图形设备接口图形设备接口 8.2.3画刷画刷 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制,它比画笔的内容更加丰富。画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8 x 8位图,填充样式往往是CDC内部定义的一些特性,是以HS_为前缀的标识,如图:8.2图形设备接口图形设备接口 CBrush类根据画刷属性提供了相应的创建函数,原型如下:BOOL BOOL Cr

21、eateSolidBrushCreateSolidBrush(COLORREF(COLORREF crColor););/创建填充色画刷BOOL BOOL CreateHatchBrushCreateHatchBrush(intint nIndex,COLORREF COLORREF crColor );/);/创建填充样式画刷 与画笔相类似,也有一个LOGBRUSH 逻辑结构用于画刷属性的定义,并通过 CBrush的成员函数CreateBrushIndirect来创建,原型如下:BOOL BOOL CreateBrushIndirectCreateBrushIndirect(const LO

22、GBRUSH*(const LOGBRUSH*lpLogBrush););LOGBRUSH 逻辑结构如下定义:typedef struct tagLOGBRUSH /lb UINT lbStyle;/风格 COLORREF lbColor;/填充色 LONG lbHatch;/填充样式 LOGBRUSH;注意:l画刷的创建工作也可在其构造函数中进行,它具有下列原型:CBrushCBrush(COLORREF(COLORREF crColor););CBrushCBrush(intint nIndex,COLORREF,COLORREF crColor););CBrushCBrush(CBitm

23、apCBitmap*pBitmap););l画刷也可用位图来指定其填充图案,但该位图应该是88像素,若位图太大,Windows则只使用其左上角的8 8的像素。l 画刷仅对绘图函数Chord、Ellipse、FillRect、FrameRect、InvertRect、Pie、Polygon、PolyPolygon、Rectangle、RoundRect有效。8.2图形设备接口图形设备接口8.2.4位图位图 CBitmap类类 LoadBitmap是位图的初始化函数,其函数原型如下:BOOL BOOL LoadBitmapLoadBitmap(LPCTSTR(LPCTSTR lpszResourc

24、eName););BOOL BOOL LoadBitmapLoadBitmap(UINT(UINT nIDResource););函数从应用程序中调入一个位图资源。若用户直接创建一个位图对象,可使用CBitmap类中的CreateBitmap、CreateBitmapIndirect以及CreateCompatibleBitmap函数,其原型如下。BOOL BOOL CreateBitmapCreateBitmap(intint nWidth,intint nHeight,UINT UINT nPlanes,UINT UINT nBitcount,const void*,const void*

25、lpBits););该函数用指定的宽度、和位模式创建一个位图对象。参数nPlanes表示位图的颜色位面的数目,nBitcount表示每个像素的颜色位个数,lpBits表示包含位值的短整型数组;若此数组为NULL,则位图对象还未初始化。BOOL BOOL CreateBitmapIndirectCreateBitmapIndirect(LPBITMAP(LPBITMAP lpBitmap););该函数直接用BITMAP结构来创建一个位图对象。BOOL BOOL CreateCompatibleBitmapCreateCompatibleBitmap(CDC*(CDC*pDC,intint nWi

26、dth,intint nHeight););该函数为某设备环境创建一个指定的宽度和高度的位图对象。8.2图形设备接口图形设备接口 GDI位图的显示位图的显示 对于GDI位图的显示则必须遵循下列步骤:(1)(1)CreateBitmap、CreateCompatibleBitmap及 CreateBitmapIndirect函数创建一个适当的位图对象。(2)(2)调用CDC:CreateCompatibleDC函数创建一个内存设备环境,以便位图在内存中保存下来,并与指定设备(窗口设备)环境相兼容;(3)(3)调用CDC:SelectObject函数将位图对象选入内存设备环境中;(4)(4)调用C

27、DC:BitBlt或CDC:StretchBlt函数将位图复制到实际设备环境中。(5)(5)使用之后,恢复原来的内存设备环境。8.2图形设备接口图形设备接口 (1)(1)创建一个默认的单文档应用程序Ex_BMP。(2)(2)按快捷键Ctrl+R,弹出“插入资源”对话框,选择Bitmap资源类型。(3)(3)单击导入,将文件类型选择为“所有文件(*.*)”,从外部文件中选定一个位图文件,单击Import。保留默认的位图资源标识IDB_BITMAP1。(4)(4)在CEx_BMPView:OnDraw函数中添加下列代码:void CEx_BMPView:OnDraw(CDC*pDC)CEx_BMP

28、Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);CBitmap m_bmp;m_bmp.LoadBitmap(IDB_BITMAP1);/调入位图资源BITMAP bm;/定义一个BITMAP结构变量,以便获取位图参数m_bmp.GetObject(sizeof(BITMAP),&bm);CDC dcMem;/定义并创建一个内存设备环境dcMem.CreateCompatibleDC(pDC);CBitmap*pOldbmp=dcMem.SelectObject(&m_bmp);pDC-BitBlt(0,0,bm.bmWidth,bm.bmHeight,&d

29、cMem,0,0,SRCCOPY);/将位图复制到实际的设备环境中dcMem.SelectObject(pOldbmp);/恢复原来的内存设备环境 8.2图形设备接口图形设备接口 (5)(5)编译运行,如图。通过上述代码过程可以看出:位图的最终显示是通过调用CDC:BitBlt函数来完成的。除此之外,也可以使用CDC:StretchBlt函数。这两个函数的区别在于:StretchBlt函数可以对位图进行缩小或放大,而BitBlt则不能,但BitBlt的显示更新速度较快。它们的原型如下:BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrc

30、DC,int xSrc,int ySrc,DWORD dwRop);BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);8.3图形绘制图形绘制 8.3.1画点、线画点、线 点点 画点是通过调用CDC:SetPixel或CDC:SetPixelV函数来实现的。COLORREF COLORREF SetPixelSetPixel(intint x,x,intint y,COLORREF y,COLORREF

31、crColorcrColor););COLORREF COLORREF SetPixelSetPixel(POINT point,COLORREF(POINT point,COLORREF crColorcrColor););BOOL BOOL SetPixelV(intSetPixelV(int x,x,intint y,COLORREF y,COLORREF crColorcrColor););BOOL BOOL SetPixelVSetPixelV(POINT point,COLORREF(POINT point,COLORREF crColorcrColor););GetPixel函数

32、是用来获取指定点的颜色。COLORREF COLORREF GetPixelGetPixel(intint x,intint y)const;)const;COLORREF COLORREF GetPixelGetPixel(POINT(POINT point)const;)const;画线画线CDC的LineTo和MoveTo函数就是用来实现画线功能的两个函数:BOOL BOOL LineToLineTo(intint x,intint y););BOOL BOOL LineToLineTo(POINT(POINT point););CPointCPoint MoveToMoveTo(int

33、int x,intint y););CPointCPoint MoveToMoveTo(POINT(POINT point););8.3图形绘制图形绘制 折线折线 除了LineTo函数可用来画线之外,CDC中还提供了一系列用于画各种折线的函数。它们主要是Polyline、PolyPolyline和PolylineTo。这三个函数中,Polyline和PolyPolyline既不使用当前位置,也不更新当前位置;而PolylineTo总是把当前位置作为起始点,并且在折线画完之后,还把折线终点所在位置设为新的当前位置。BOOL BOOL PolylinePolyline(LPPOINT(LPPOIN

34、T lpPoints,intint nCount););BOOL BOOL PolylineToPolylineTo(const POINT*(const POINT*lpPoints,intint nCount););这两个函数用来画一系列连续的折线。参数lpPoints是POINT或CPoint的顶点数组;nCount表示数组中顶点的个数,它至少为2。BOOL BOOL PolyPolylinePolyPolyline(const const POINT*POINT*lpPoints,const const DWORD*DWORD*lpPolyPoints,intint nCount);)

35、;此函数可用来绘制多条折线。其中lpPoints同前定义,lpPolyPoints表示各条折线所需的顶点数,nCount表示折线的数目。8.3图形绘制图形绘制 8.3.2矩形和多边形矩形和多边形 矩形和圆角矩形矩形和圆角矩形 CDC的Rectangle和RoundRect函数用于矩形和圆角矩形的绘制,原型:BOOL Rectangle(BOOL Rectangle(intint x1,intint y1,intint x2,intint y2););BOOL Rectangle(LPCRECTBOOL Rectangle(LPCRECT lpRect););BOOL BOOL RoundRec

36、tRoundRect(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3););BOOL BOOL RoundRectRoundRect(LPCRECT(LPCRECT lpRect,POINT,POINT point););如图。设置多边形填充模式设置多边形填充模式 多边形填充模式有两种选择:ALTERNATE和WINDING。ALTERNATE模式是寻找相邻的奇偶边作为填充区域,WINDING是按顺时针或逆时针进行寻找;对于像五角星这样的图形,填充的结果大不一样,如图。8.3图形绘制图形绘制 多边形多边形 多边形可以说就是

37、由首尾相接的封闭折线所围成的图形。画多边形的函数Polygon原型如下:BOOL Polygon(LPPOINTBOOL Polygon(LPPOINT lpPoints,intint nCount););Polygon函数的参数形式与Polyline函数是相同的。但也稍有一点小差异。例如,要画一个三角形,使用Polyline函数,顶点数组中就得给出四个顶点(尽管始点和终点重复出现),而用Polygon函数则只需给出三个顶点。与PolyPolyline可画多条折线一样,使用PolyPolygon函数,一次可画出多个多边形,这两个函数的参数形式和含义也一样。BOOL PolyPolygon(LP

38、POINT lpPoints,LPINT lpPolyCounts,int nCount);8.3图形绘制图形绘制 8.3.3曲线曲线 圆弧和椭圆圆弧和椭圆 调用CDC的Arc函数可以画一条椭圆弧线或者整个椭圆。Arc函数的原型:BOOL Arc(BOOL Arc(intint x1,x1,intint y1,y1,intint x2,x2,intint y2,y2,intint x3,x3,intint y3,y3,intint x4,x4,intint y4);y4);BOOL Arc(LPCRECT BOOL Arc(LPCRECT lpRectlpRect,POINT,POINT pt

39、StartptStart,POINT,POINT ptEndptEnd););通过调用SetArcDirection函数将绘制方向改设为顺时针方向。intint SetArcDirectionSetArcDirection(intint nArcDirectionnArcDirection););ArcTo与Arc函数的唯一的区别是:ArcTo将圆弧的终点作为新的当前位置,而Arc不会。BOOL BOOL ArcToArcTo(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3,intint x4,intint y4););B

40、OOL BOOL ArcToArcTo(LPCRECT(LPCRECT lpRect,POINT,POINT ptStart,POINT,POINT ptEnd););调用CDC成员函数Ellipse可以用当前画刷绘制一个椭圆区域。BOOL Ellipse(BOOL Ellipse(intint x1,intint y1,intint x2,intint y2););BOOL Ellipse(LPCRECTBOOL Ellipse(LPCRECT lpRect););8.3图形绘制图形绘制弦形和扇形弦形和扇形 CDC函数Chord和Pie是用来绘制弦形(图8.8)和扇形(图8.9)。BOOL

41、Chord(BOOL Chord(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3,intint x4,intint y4););BOOL Chord(LPCRECT BOOL Chord(LPCRECT lpRect,POINT,POINT ptStart,POINT,POINT ptEnd););BOOL Pie(BOOL Pie(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3,intint x4,intint y4););BOOL Pie(LPCR

42、ECT lpRect,POINT ptStart,POINT ptEnd);Bzier曲线曲线 函数PolyBezier是用来画出一条或多条Bzier曲线的,其函数原型如下:BOOL PolyBezier(const POINT*lpPoints,int nCount);如果需要使用当前位置,那么就应该使用PolyBezierTo函数。BOOL PolyBezierTo(const POINT*lpPoints,int nCount);8.3图形绘制图形绘制8.3.4图形绘制示例图形绘制示例 例例Ex_SDI Ex_SDI 绘制线图。(1)(1)创建一个默认的单文档应用程序Ex_SDI。(2)

43、(2)在CEx_GDIView:OnDraw函数中添加下列代码:(3)(3)编译运行,如图。编译运行,如图。需要说明的是:l大多数的绘图函数一般都是添加在用户视图中的OnDraw函数内,这时因为OnDraw是CView类的一个虚成员函数,每当视窗需要被重新绘制时,系统都要调用OnDraw函数。当用户改变了窗口尺寸,或当窗口恢复了先前被覆盖的部分,或当应用程序改变了窗口数据时,窗口都需要被重新绘制。通过重载此函数,用户程序随OnDraw一起调用,确保图形在窗口的显示。与OnDraw类似的还有OnPaint函数。l 若对同一个GDI对象重新构造,则必须调用Detach函数把该对象从GDI中分离出来

44、。8.3图形绘制图形绘制8.3图形绘制图形绘制 8.3.5在对话框控件中绘制图形在对话框控件中绘制图形 (1)(1)创建一个基于对话框应用程序项目Ex_CtrlDraw。(2)(2)将对话框标题设为“在控件中绘图”,删除取消,将确定标题改为“退出”,打开对话框网格,添加静态文本和组合框控件。左边静态文本控件用来绘制图 形,将 其“Extended Styles”中 的“Static edge”属 性 选 中,标 识 符 设 为IDC_DRAW。(3)(3)打开Member Variables页面,为组合框添加成员变量m_hatchCombo,其类型为Control类的CComboBox。(4)

45、(4)为对话框类CEx_CtrlDrawDlg添加一个int类型的成员变量m_nHatch。(5)(5)为对话框类CEx_CtrlDrawDlg添加一个void类型的成员函数DrawCtrl,代码:void CEx_CtrlDrawDlg:DrawCtrl()CWnd*pWnd=GetDlgItem(IDC_DRAW);/获得IDC_DRAW控件窗口指针CDC*pDC=pWnd-GetDC();/获得窗口当前的设备环境指针CBrush drawBrush;/定义画刷变量drawBrush.CreateHatchBrush(m_nHatch,RGB(0,0,0);/创建一个画刷。CBrush*p

46、OldBrush=pDC-SelectObject(&drawBrush);CRect rcClient;pWnd-GetClientRect(rcClient);pDC-Rectangle(rcClient);pDC-SelectObject(pOldBrush);8.3图形绘制图形绘制(6)(6)在CEx_CtrlDrawDlg:OnInitDialog中添加下代码:BOOL CEx_CtrlDrawDlg:OnInitDialog()CDialog:OnInitDialog();CString str6=“水平线”,“竖直线”,“向下斜线”,“向上斜线”,“十字线,交叉线;int nIn

47、dex;for(int i=0;iUpdateWindow();DrawCtrl();(9)(9)编译运行并测试。8.4字体与文字处理字体与文字处理 8.4.1字体和字体对话框字体和字体对话框 字体的属性和创建字体的属性和创建 字体的属性主要属性有字样、风格和尺寸三个。字样是字符书写和显示时表现出的特定模式。字体风格主要表现为字体的粗细和是否倾斜等特点。字体尺寸是指定字符所占区域的大小。字体尺寸可以取毫米或英寸作为单位。系统定义一种“逻辑字体”,它是应用程序对于理想字体的一种描述方式。使用逻辑字体绘制文字时,系统会采用一种特定的算法把逻辑字体映射为最匹配的物理字体。逻辑字体的具体属性可由LOG

48、FONT结构来描述,这里仅列最常用到的结构成员。typedef struct tagLOGFONT /lf LONG lfHeight;/字体的逻辑高度 LONG lfWidth;/字符的平均逻辑宽度 LONG lfEscapement;/倾角 LONG lfOrientation;/书写方向 LONG lfWeight;/字体的粗细程度 BYTE lfItalic;/斜体标志 BYTE lfUnderline;/下划线标志 BYTE lfStrikeOut;/删除线标志 BYTE lfCharSet;/字符集,汉字必须为GB2312_CHARSET TCHAR lfFaceNameLF_FA

49、CESIZE;/字样名称/LOGFONT;8.4字体与文字处理字体与文字处理 lfHeight表示字符的逻辑高度。这里的高度是字符的纯高度,当此值 0时,系统将此值映射为实际字体单元格的高度;当=0时,系统将使用默认的值;当SelectObject(&cf);pDC-TextOut(100,100,Hello);pDC-SelectObject(oldfont);/恢复设备环境原来的属性cf.DeleteObject();/删除字体对象 8.4字体与文字处理字体与文字处理使用字体对话框使用字体对话框 CFontDialog类提供了字体及其文本颜色选择的通用对话框,如图。它的构造函数如下:CFo

50、ntDialog(LPLOGFONT lplfInitial=NULL,DWORD dwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);当字体对话框DoModal返回IDOK后,可使用下列的成员函数:void GetCurrentFont(LPLOGFONT lplf);/返回用户选择的LOGFONT字体CString GetFaceName()const;/返回用户选择的字体名称CString GetStyleName()const;/返回用户选择的字体样式名称int GetSize()con

51、st;/返回用户选择的字体大小COLORREF GetColor()const;/返回用户选择的文本颜色int GetWeight()const;/返回用户选择的字体粗细程度BOOL IsStrikeOut()const;/判断是否有删除线BOOL IsUnderline()const;/判断是否有下划线BOOL IsBold()const;/判断是否是粗体BOOL IsItalic()const;/判断是否是斜体。8.4字体与文字处理字体与文字处理 8.4.2常用文本输出函数常用文本输出函数 CDC类提供了四个输出文本的成员函数:TextOut、ExtTextOut、TabbedTextOu

52、t和DrawText。对于这四个函数,应根据具体情况来选用。virtual BOOL virtual BOOL TextOutTextOut(intint x,intint y,LPCTSTR,LPCTSTR lpszString,intint nCount););BOOL BOOL TextOutTextOut(intint x,intint y,const,const CStringCString&str););TextOut函数是用当前字体在指定位置(x,y)处显示一个文本。参数中lpszString和str指定即将显示的文本,nCount表示文本的字节长度。virtual virtua

53、l CSizeCSize TabbedTextOutTabbedTextOut(intint x,intint y,LPCTSTRLPCTSTR lpszString,intint nCount,int int nTabPositions,LPINTLPINT lpnTabStopPositions,int int nTabOrigin ););CSizeCSize TabbedTextOutTabbedTextOut(intint x,intint y,const,const CStringCString&str,intint nTabPositions,LPINT,LPINT lpnTab

54、StopPositions,int,int nTabOrigin););TabbedTextOut也是用当前字体在指定位置处显示一个文本,它还根据指定的制表位(Tab)设置相应字符位置,函数成功时返回输出文本的大小。nTabPositions表示lpnTabStopPositions数组的大小,lpnTabStopPositions表示多个递增的制表位的数组,nTabOrigin表示制表位x方向的起始点(逻辑坐标)。如果nTabPositions为0,且lpnTabStopPositions为NULL,则使用默认的制表位,即一个Tab相当于8个字符。virtual virtual intint

55、 DrawTextDrawText(LPCTSTRLPCTSTR lpszString,intint nCount,LPRECTLPRECT lpRect,UINT UINT nFormat););int DrawText(const CString&str,LPRECT lpRect,UINT nFormat);8.4字体与文字处理字体与文字处理 DrawText函数是当前字体在指定矩形中对文本进行格式化绘制。lpRect指定文本绘制时的参考矩形,本身不显示;nFormat表示文本的格式,可以是常用值之一或“|”组合:DT_BOTTOM 下对齐文本,该值还必须与DT_SINGLELINE组合

56、DT_CENTER 水平居中DT_END_ELLIPSIS 使用省略号取代文本末尾的字符DT_PATH_ELLIPSIS 使用省略号取代文本中间的字符DT_EXPANDTABS 使用制表位,默认的制表长度为8个字符DT_LEFT 左对齐DT_MODIFYSTRING 将文本调整为能显示的字符串DT_NOCLIP 不裁剪DT_NOPREFIX 不支持“&”字符转义DT_RIGHT 右对齐DT_SINGLELINE 指定文本的基准线为参考点DT_TABSTOP 设置停止位。nFormat的高位字节是每个制表位的数目DT_TOP 上对齐DT_VCENTER 垂直居中DT_WORDBREAK 自动换行

57、DT_NOCLIP及 DT_NOPREFIX等不能与 DT_TABSTOP组合。默认时,上述文本输出函数既不使用也不更新“当前位置”。若要使用和更新“当前位置”,必须调用SetTextAlign,并将参数nFlags设置为TA_UPDATECP。使用时,最好在文本输出前用MoveTo将当前位置移动至指定位置后,再调用文本输出函数;这样,文本输出函数参数中x,y或指定的矩形的左边才会被忽略。8.4字体与文字处理字体与文字处理(1)(1)用MFC AppWizard创建一个默认的单文档应用程序Ex_DrawText。(2)(2)在CEx_DrawTextView:OnDraw中添加下列代码:voi

58、d CEx_DrawTextView:OnDraw(CDC*pDC)CEx_DrawTextDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect rc(10,10,200,140);pDC-Rectangle(rc);pDC-DrawText(单 行 文 本 居 中,rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);rc.OffsetRect(200,0);/将矩形向右偏移200pDC-Rectangle(rc);int nTab=40;/将一个Tab位的值指定为10个逻辑单位pDC-TabbedTextOut(rc.lef

59、t,rc.top,绘制tTabt文本t示例,1,&nTab,rc.left);/使用自定义的停止位(Tab)nTab=80;pDC-TabbedTextOut(rc.left,rc.top+20,绘制tTabt文本t示例,1,&nTab,rc.left);/使用自定义的停止位(Tab)pDC-TabbedTextOut(rc.left,rc.top+40,绘制tTabt文本t示例,0,NULL,0);/使用默认的停止位 8.4字体与文字处理字体与文字处理(3)(3)编译运行,如图。8.4字体与文字处理字体与文字处理 8.4.3文本格式化属性文本格式化属性 通常包括文本颜色、对齐方式、字符间隔以

60、及文本调整等。在CDC类中,SetTextColor、SetBkColor和SetBkMode函数分别设置文本颜色、文本背景色和背景模式,GetTextColor、GetBkcolor和GetBkMode函数分别获取这三项属性的。原型:virtual COLORREF virtual COLORREF SetTextColorSetTextColor(COLORREF(COLORREF crColor););COLORREF COLORREF GetTextColorGetTextColor()const;()const;virtual COLORREF virtual COLORREF Se

61、tBkColorSetBkColor(COLORREF(COLORREF crColor););COLORREF COLORREF GetBkColorGetBkColor()const;()const;intint SetBkModeSetBkMode(intint nBkMode););intint GetBkModeGetBkMode()const;()const;文本对齐方式的设置和获取是由CDC函数SetTextAlign和GetTextAlign决定的。原型:UINT UINT SetTextAlignSetTextAlign(UINT(UINT nFlags););UINT Ge

62、tTextAlign()const;8.4字体与文字处理字体与文字处理 8.4.4计算字符的几何尺寸计算字符的几何尺寸 打印和显示某段文本时,要了解字符的高度计算及字符的测量方式。在CDC类中,GetTextMetrics是获得指定映射模式下相关设备环境的字符几何尺寸及其它属性的,其TEXTMETRIC结构描述如下:typedef struct tagTEXTMETRIC /tm int tmHeight;/字符的高度(ascent+descent)int tmAscent;/高于基准线部分的值 int tmDescent;/低于基准线部分的值 int tmInternalLeading;/字

63、符内标高 int tmExternalLeading;/字符外标高 int tmAveCharWidth;/字体中字符平均宽度 int tmMaxCharWidth;/字符的最大宽度/TEXTMETRIC;在CDC类中计算字符串的宽度和高度的函数主要两个:GetTextExtent函数(用于字符串没有制表符时)和GetTabbedTextExtent函数(用于含有制表符的字符串)。原型:CSizeCSize GetTextExtentGetTextExtent(LPCTSTR(LPCTSTR lpszString,intint nCount)const;)const;CSizeCSize Ge

64、tTextExtentGetTextExtent(const(const CStringCString&str)const;)const;CSizeCSize GetTabbedTextExtentGetTabbedTextExtent(LPCTSTR(LPCTSTR lpszString,intint nCount,intint nTabPositions,LPINT,LPINT lpnTabStopPositions)const;)const;CSizeCSize GetTabbedTextExtentGetTabbedTextExtent(const(const CStringCStri

65、ng&str,int nTabPositions,LPINT lpnTabStopPositions)const;8.4字体与文字处理字体与文字处理 8.4.5文档内容显示及其字体改变文档内容显示及其字体改变 (1)(1)用MFC AppWziard创建一个单文档应用程序Ex_Text,在创建的第6步将视图的基类选择为CScrollView。(2)(2)为CEx_TextDoc类添加CStringArray类型的成员变量m_strContents,将读取的文档内容保存。(3)(3)在CEx_TextDoc:Serialize函数中添加读取文档内容的代码:void CEx_TextDoc:Ser

66、ialize(CArchive&ar)if(ar.IsStoring()elseCString str;m_strContents.RemoveAll();while(ar.ReadString(str)m_strContents.Add(str);(4)(4)为CEx_TextView类添加LOGFONT类型的成员变量m_lfText,用来保存当前所使用的逻辑字体。8.4字体与文字处理字体与文字处理 (5)(5)在CEx_TextView类构造函数中添加m_lfText的初始化代码:CEx_TextView:CEx_TextView()memset(&m_lfText,0,sizeof(LOGFONT);m_lfText.lfHeight=-12;m_lfText.lfCharSet=GB2312_CHARSET;strcpy(m_lfText.lfFaceName,宋体);(6)(6)用MFC ClassWizard为CEx_TextView类添加WM_LBUTTONDBLCLK(双击鼠标)的消息映射函数,并增加下列代码:void CEx_TextView:OnLButtonDbl

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!