《图形文本和位》PPT课件.ppt
《《图形文本和位》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《图形文本和位》PPT课件.ppt(84页珍藏版)》请在三一办公上搜索。
1、第7章 图形、文本和位图,7.1 概述Visual C+的CDC(Device Context,设备环境)类是MFC中最重要的类之一,它封装了绘图所需要的所有函数,是用户编写图形和文字处理程序必不可少的。当然,绘制图形和文字时还必须指定相应的设备环境。设备环境是由Windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息。,7.1.1 设备环境类,(1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint
2、,而它的析构函数则会自动调用EndPaint。(2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数。(3)CMetaFileDC封装了在一个Windows图元文件中绘图的方法。图元文件是一系列与设备无关的图片的集合,由于它对图象的保存比像素更精确,因而往往在要求较高的场合下使用,例如AutoCAD的
3、图像保存等。目前的Windows已使用增强格式(enhanced-format)的32位图元文件来进行操作。,7.1.2 坐标映射,在讨论坐标映射之前,先来看看下列语句:pDC-Rectangle(CRect(0,0,200,200);它是在某设备环境中绘制出一个高为200个像素,宽也为200个像素的方块。由于默认的映射模式是MM_TEXT,其逻辑坐标(在各种映射模式下的坐标)和设备坐标(显示设备或打印设备坐标系下的坐标)相等。因此这个方块在1024 x 768的显示器上看起来要比在640 x 480的显示器上显得小一些,而且若将它打印在600dpi精度的激光打印机上,这个方块就会显得更小了。
4、如表7.1所示。,表7.1 映射模式,7.1.2 坐标映射,例Ex_Draw 通过设置窗口和视口大小来改变显示的比例(1)用MFC AppWizard创建一个默认的单文档应用程序Ex_Draw。(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);
5、/设置MM_ANISOTROPIC映射模式pDC-SetWindowExt(1000,1000);/设置窗口范围pDC-SetViewportExt(rectClient.right,-rectClient.bottom);/设置视口范围pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);/设置视口原点pDC-Ellipse(CRect(-500,-500,500,500);,例Ex_Draw,(3)编译运行,结果如图7.1所示。,图7.1 改变显示比例,7.1.3 CPoint、CSize和CRect,在图形绘制操作中,常常需
6、要使用MFC中的CPoint、CSize和CRect等简单数据类由于CPoint(点)、CSize(大小)和CRect(矩形)是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示:typedef struct tagPOINT typedef struct tagSIZE LONG x;/点的x坐标 int cx;/水平大小 LONG y;/点的y坐标 int cy;/垂直大小 POINT;SIZE;typedef struct tagRECT LONG left;/矩形左上角点的x坐标 LONG top;/矩形左上角点的y坐标 LON
7、G right;/矩形右下角点的x坐标 LONG bottom;/矩形右下角点的y坐标 RECT;,7.1.3 CPoint、CSize和CRect,1.CPoint、CSize和CRect类的构造函数CPoint类带参数的常用构造函数原型如下:CPoint(int initX,int initY);CPoint(POINT initPt);其中,initX和initY分别用来指定CPoint的成员x和y的值。initPt用来指定一个POINT结构或CPoint对象来初始化CPoint的成员。CSize类带参数的常用构造函数原型如下:CSize(int initCX,int initCY);C
8、Size(SIZE initSize);其中,initCX和initCY用来分别设置CSize的cx和cy成员。initSize用来指定一个SIZE结构或CSize对象来初始化CSize的成员。CRect类带参数的常用构造函数原型如下:CRect(int l,int t,int r,int b);CRect(const RECT,7.1.3 CPoint、CSize和CRect,2.CRect类的常用操作由于一个CRect类对象包含用于定义矩形的左上角和右下角点的成员变量,因此在传递LPRECT、LPCRECT或RECT结构作为参数的任何地方,都可以使用CRect对象来代替。CRect类的操作
9、函数有很多,这里只介绍矩形的扩大、缩小以及两个矩形的“并”和“交”操作,更多的常用操作如表7.2所示。,表7.2 CRect类常用的成员函数,7.1.3 CPoint、CSize和CRect,2.CRect类的常用操作成员函数InflateRect和DeflateRect用来扩大和缩小一个矩形。由于它们的操作是相互的,也就是说,若指定InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此下面只给出InflateRect函数的原型:void InflateRect(int x,int y);void InflateRect(SIZE size);void InflateRect(
10、LPCRECT lpRect);void InflateRect(int l,int t,int r,int b);其中,x用来指定扩大CRect左、右边的数值。y用来指定扩大CRect上、下边的数值。size中的cx成员指定扩大左、右边的数值,cy指定扩大上、下边的数值。lpRect的各个成员用来指定扩大每一边的数值。l、t、r和b分别用来指定扩大CRect左、上、右和下边的数值。,7.1.3 CPoint、CSize和CRect,2.CRect类的常用操作成员函数IntersectRect和UnionRect分别用来将两个矩形进行相交和合并,当结果为空时返回FALSE,否则返回TRUE。它
11、们的原型如下:BOOL IntersectRect(LPCRECT lpRect1,LPCRECT lpRect2);BOOL UnionRect(LPCRECT lpRect1,LPCRECT lpRect2);其中,lpRect1和lpRect2用来指定操作的两个矩形。例如:CRect rectOne(125,0,150,200);CRect rectTwo(0,75,350,95);CRect rectInter;rectInter.IntersectRect(rectOne,rectTwo);/结果为(125,75,150,95)ASSERT(rectInter=CRect(125,7
12、5,150,95);rectInter.UnionRect(rectOne,rectTwo);/结果为(0,0,350,200)ASSERT(rectInter=CRect(0,0,350,200);,7.1.4 颜色和颜色对话框,在MFC中,CDC使用的是RGB颜色空间,即选用红(R)、绿(G)、蓝(B)三种基色分量,通过对这三种基色不同比例的混合,可以得到不同的彩色效果。并且,MFC使用COLORREF数据类型来表示一个32位的RGB颜色,它也可以用下列的十六进制表示:0 x00bbggrr 此形式的rr、gg、bb分别表示红、绿、蓝三个颜色分量的16进制值,最大为0 xff。在具体操作R
13、GB颜色时,还可使用下列的宏操作:GetBValue 获得32位RGB颜色值中的蓝色分量 GetGValue 获得32位RGB颜色值中的绿色分量 GetRValue 获得32位RGB颜色值中的红色分量 RGB 将指定的R、G、B分量值转换成一个32位的RGB颜色值。MFC的CColorDialog类为应用程序提供了颜色选择通用对话框,如图7.2所示。,图7.2 颜色对话框,7.1.4 颜色和颜色对话框,CColorDialog类具有下列的构造函数:CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd*pParentWnd=NULL);其中,c
14、lrInit用来指定选择的默认颜色值,若此值没指定,则为RGB(0,0,0)(黑色)。pParentWnd用来指定对话框的父窗口指针。dwFlags用来表示定制对话框外观和功能的系列标志参数。它可以是下列值之一或”|”组合:CC_ANYCOLOR 在基本颜色单元中列出所有可得到的颜色 CC_FULLOPEN 显示所有的颜色对话框界面。若此标志没有被设定,则用户单击“规定自定义颜色”按钮才能显示出定制颜色的界面 CC_PREVENTFULLOPEN 禁用“规定自定义颜色”按钮 CC_SHOWHELP 在对话框中显示“帮助”按钮 CC_SOLIDCOLOR 在基本颜色单元中只列出所得到的纯色当对话
15、框“OK”退出(即DoModal返回 IDOK)时,可调用下列成员获得相应的颜色。COLORREF GetColor()const;/返回用户选择的颜色。void SetCurrentColor(COLORREF clr);/强制使用clr作为当前选择的颜色 static COLORREF*GetSavedCustomColors();/返回用户自己定义颜色,7.1.5 图形设备接口,Windows为设备环境提供了各种各样的绘图工具,例如用于画线的“画笔”、填充区域的“画刷”以及用于绘制文本的“字体”。MFC封装了这些工具,并提供相应的类来作为应用程序的图形设备接口GDI,这些类有一个共同的抽
16、象基类CGdiObject,具体如表7.3所示。,表7.3 MFC的GDI类,7.1.5 图形设备接口,1.使用GDI对象在选择GDI对象进行绘图时,往往遵循着下列的步骤:(1)在堆栈中定义一个GDI对象(如CPen、CBrush对象),然后用相应的函数(如CreatePen、CreateSolidBrush)创建此GDI对象。但要注意:有些GDI派生类的构造函数允许用户提供足够的信息,从而一步即可完成对象的创建任务,这些类有CPen、CBrush。(2)将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来。(3)绘图结束后,恢复当前设备环境中原来的GDI对象。(4)由于
17、GDI对象是在堆栈中创建中,当程序结束后,会自动删除程序创建的GDI对象。具体操作可像下面的代码过程:void CMyView:OnDraw(CDC*pDC)CPen penBlack;/定义一个画笔变量penBlack.CreatePen(PS_SOLID,2,RGB(0,0,0);/创建画笔/将此画笔选入当前设备环境并保存原来的画笔CPen*pOldPen=pDC-SelectObject(/恢复设备环境中原来的画笔,7.1.5 图形设备接口,2.库存的GDI对象除了自定义的GDI对象外,Windows还包含了一些预定义的库存GDI对象。由于它们是Windows系统的一部分,因此用户用不着
18、删除它们。CDC的成员函数SelectStockObject可以把一个库存对象选入当前设备环境中,并返回原先被选中的对象指针,同时使原先被选中的对象从设备环境中分离出来。如下面的代码:void CEx_SDIView:OnDraw(CDC*pDC)CPen newPen(PS_SOLID,2,RGB(0,0,0)pDC-SelectObject(/newPen被分离出来,2.库存的GDI对象,函数SelectStockObject可选用的库存GDI对象类型可以是下列值之一:BLACK_BRUSH 黑色画刷DKGRAY_BRUSH 深灰色画刷GRAY_BRUSH 灰色画刷HOLLOW_BRUSH
19、 中空画刷LTGRAY_BRUSH 浅灰色画刷NULL_BRUSH 空画刷WHITE_BRUSH 白色画刷BLACK_PEN 黑色画笔NULL_PEN 空画笔WHITE_PEN 白色画笔DEVICE_DEFAULT_FONT 设备默认字体SYSTEM_FONT 系统字体,7.2 简单图形绘制,图形的绘制通常需要先创建画笔和画刷,然后调用相应的绘图函数。7.2.1 画笔画笔是Windows应用程序中用来绘制各种直线和曲线的一种图形工具,它可分为修饰画笔和几何画笔两种类型。在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场
20、合。而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。,7.2.1 画笔,表7.4 修饰画笔的风格,7.2.1 画笔,创建一个修饰画笔,可以使用CPen类的CreatePen函数,其原型如下:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);其中,参数nPenStyle、nWidth、crColor分别用来指定画笔的风格、宽度和颜色。此外,还有一个CreatePenIndirect函数也是用来创建画笔对象,它的作用与CreatePen函数是完全一样的,只是画笔的三个属性不是直接出现在函数参数中,而是通过一个LOGPE
21、N结构间接地给出。BOOL CreatePenIndirect(LPLOGPEN lpLogPen);此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下:typedef struct tagLOGPEN/*lgpn*/UINT lopnStyle;/画笔风格,同上 POINT lopnWidth;/POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor;/画笔颜色 LOGPEN;,7.2.2 画刷,画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8
22、 8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识,如图7.3所示:,7.2.2 画刷,CBrush类根据画刷属性提供了相应的创建函数,例如创建填充色画刷和填充样式画刷的函数为CreateSolidBrush和CreateHatchBrush,它们的原型如下:BOOL CreateSolidBrush(COLORREF crColor);/创建填充色画刷BOOL CreateHatchBrush(int nIndex,COLORREF crColor);/创建填充样式画刷其中,nIndex用来指定画刷的内部填充样式,而crColor表示画刷的填充色。与画笔相类似,
23、也有一个LOGBRUSH 逻辑结构用于画刷属性的定义,并通过 CBrush的成员函数CreateBrushIndirect来创建,其原型如下:BOOL CreateBrushIndirect(const LOGBRUSH*lpLogBrush);其中,LOGBRUSH 逻辑结构如下定义:typedef struct tagLOGBRUSH/lb UINT lbStyle;/风格 COLORREF lbColor;/填充色 LONG lbHatch;/填充样式 LOGBRUSH;,7.2.3 图形绘制,1.画点、线(1)画点是最基本的绘图操作之一,它是通过调用CDC:SetPixel或CDC:S
24、etPixelV函数来实现的。这两个函数都是用来在指定的坐标上设置指定的颜色,只不过SetPixelV函数不需要返回实际像素点的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);实际显示像素的颜色未必等
25、同于crColor所指定的颜色值,因为有时受设备限制,不能显示crColor所指定的颜色值,而只能取其近似值。与上述函数相对应的GetPixel函数是用来获取指定点的颜色。COLORREF GetPixel(int x,int y)const;COLORREF GetPixel(POINT point)const;,1.画点、线,(2)画线也是特别常用的绘图操作之一。CDC的LineTo和MoveTo函数就是用来实现画线功能的两个函数,通过这两个函数的配合使用,可完成任何直线和折线的绘制操作。这个当前位置还可用函数CDC:GetCurrentPosition来获得,其原型如下:CPoint G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形文本和位 图形 文本 PPT 课件
链接地址:https://www.31ppt.com/p-5484592.html