




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 图形绘制 在Visual C+6.0中,掌握图形程序设计方法是非常重要的。因为图形在任何一个可视化工程项目中都是不可缺少的。CDC(设备环境)类封装了图形绘制所需要的各种操作。本章我们将通过实际例子和较详细的阐述,来了解和掌握如何使用设备环境类(CDC)及图形设备接口(GDI)进行图形绘制。51 设备环境与设备环境类(CDC)511 设备环境设备环境也称设备上下文(Device Context,简称DC),是计算机物理设备的代表,也是图形设备接口的主要组成部分。由于Windows是一个与设备无关的操作系统,即Windows不允许直接访问硬件,如果用户想将文本和图形绘制到显示器或其它设备中去,必须通过“设备环境”这个抽象层与硬件进行通信,设备上下文对象的作用就是实现Windows的设备无关性,任何向屏幕上进行输出的功能都要间接地通过它来完成。设备上下文是Windows的一种数据结构,它包含了有关如显示器或打印机等设备的绘图属性信息。所有绘画都是通过设备上下文对象来实现的,该对象封装了Windows的画线、图形和文本的API函数。设备上下文允许在Windows下独立于设备的绘画。设备上下文不仅能够被用来在屏幕上绘画,它也可以将绘画输出到打印机和图元文件中。512 设备环境类设备环境类CDC直接继承于CObject类,该类定义了一类设备对象。CDC对象提供了非常多的成员函数,与设备环境的显示器、打印机等一起工作。例如,如果要在显示器等设备上绘制图形,我们可以用MFC提供的设备环境类CDC类,因为CDC类中包含了绘图所需要的所有成员函数。同时。MFC还提供了以下几个CDC的派生类:1、CPaintDC类此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。2、CClientDC和CWindowDC类CClientDC只能在窗口的客户区(不包括边框、工具条、标题栏、滚动条、菜单栏以及状态栏)进行绘图,点(0,0)通常指的是客户区的左上角。其构造函数调用GetDC,析构函数调用ReleaseDC函数。 CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。其构造函数调用GetWindowDC,析构函数调用ReleaseDC函数。3、CMetaFileDC类封装了在一个Windows图元文件中绘图的方法。图元文件是一系列与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用,例如:AutoCAD的图像保存等。目前的Windows已使用增强格式(enhanced-format)的32位图元文件来进行操作。设备环境类CDC及其派生类如图5.1.1所示。 CDC CClientDC CPaintDC CWindowDC 图5.1.1 CDC与其子类继承图 52 绘图程序521 CDC基类CDC类是其它DC类的基类,CDC类封装了使用设备环境的各种图形设备接口(GDI)函数,它用于定义一个设备环境对象,并提供了在显示器、打印机和窗口的客户区域上画图的方法。1、在视图类的OnDraw()函数中绘图在视图类的OnDraw函数中绘图时,直接使用OnDraw()函数中的CDC形参指针pDC,调用它的函数进行绘图:例51 绘制矩形与文本(1)创建一个单文档应用程序,名为:显示绘图(2)在视图类的实现文件“显示绘图 View.cpp”的OnDraw函数中加如下代码:void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); 图5.2.1 绘制矩形和文本/选择画刷,浅灰色画刷,见表5.2pDC-SelectStockObject(LTGRAY_BRUSH); CRect rect(10,10,200,70);/定义一个矩形 pDC-Rectangle(rect);/绘制一个矩形pDC-TextOut(20,80,我们会编制图形程序了 !); /绘制文本 pDC-TextOut(20,100,”努力学好Visual C+ !”); 3)编译运行,结果如图5.2.1所示。说明:SelectStockObject( ) 该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。参数:LTGRAY_BRUSH:亮灰色画笔;BLACK_BRUSH黑色画笔; NULL_BRUSH:空画笔(相当于HOLLOW_BRUSH);WHITE_BRUSH:白色画笔;BLACK_PEN:黑色钢笔;.2、在视图类的一般函数中绘图例52 在鼠标放下函数WM_LBUTTONDOWN函数中绘图(1)创建一个单文档应用程序,名为:一般函数绘图(2)利用MFC ClassWizard将鼠标放下WM_LBUTTONDOWN消息映射到视图类CMyView中,并添加代码:void CMyView:OnLButtonDown(UINT nFlags, CPoint point) /定义一个矩形CRect rect(0,0,100,100);/GetDC检索整个屏幕的设备上下文环境CDC *pDC=GetDC();pDC-Rectangle(rect);/绘制矩形ReleaseDC(pDC);/释放pDC空间CView:OnLButtonDown(nFlags, point);(3)编译运行,鼠标点击窗口,出现 图5.2.2 在OnLButtonDown函数中绘图图5.2.2所示的矩形。522 CPaintDC类CPaintDC对象代表了一个窗口的绘图画面,主要用来绘图。它可以用来处理来自Windows的WM_PAINT消息。改变窗口大小或移动覆盖在窗上的窗口或对话框时,Windows会发送WM_PAINT消息以通知客户区的变动,而WM_PAINT消息的处理是在OnPaint()消息处理函数中进行的。例53 在WM_PAINT消息函数中绘图(1)创建一个单文档的应用程序,名为:绘图(2)利用MFC ClassWizard将WM_PAINT消息映射到视图类(View)中,并添加代码:void CMyView:OnPaint() /CPaintDC dc(this);/调用MoveTo函数,定点到点(10,10)dc.MoveTo(10,10); /调用LineTo函数,画线到点(100,100)dc.LineTo(100,100); /画线/调用画椭圆函数Ellipse画椭圆dc.Ellipse(120,120,160,160);(3)编译运行,结果见5.2.3所示 画直线图5.2.3 运行结果523 CClientDC类CClientDC对象用来自动处理对描述窗口的客户程序区域的设备环境进行调用和释放。在CClientDC对象创建时自动调用GetDC(),在撤销时将自动调用ReleaseDC()。例54 在客户区画一条直线(1)创建一个单文档的应用程序,名为:画直线 (2)利用MFC ClassWizard将鼠标放下WM_LBUTTONDOWN消息映射到视图类CMyView中,并添加代码:void CMyView:OnLButtonDown(UINT nFlags, CPoint point) CClientDC dc(this); CRect rect; /定义一个矩形。/ 取得客户区矩形区域GetClientRect(&rect); /调用MoveTo,定点到客户区的左上角dc.MoveTo(rect.left,rect.top); /调用LineTo函数,画线到客户区的右下角dc.LineTo(rect.right,rect.bottom); 图5.2.4 绘制一条直线 (3)编译运行,鼠标左键点击窗口任一点,便在窗口上画一条直线,如图5.2.4所示。53 图形设备接口(GDI)对象GDI(Graphic Device Interface)对象与设备环境对象的关系,类似于笔和纸的关系。也就是说,GDI提供了用于在DC上画图的绘图工具。MFC的GDI中包含了各种绘图类并提供各类的绘图函数即定义了若干种对于Windows的绘图工具的对象,该类的继承关系如图5.3.1所示;GDI中包含的各种绘图类有一个共同的抽象基类CGdiObject,具体如表5.1所示: CGdiObject CBitmap CBrush CFont CPalette CPen CRgn 图5.3.1 MFC 的GDI类继承图1、使用GDI对象 选择GDI对象进行绘图时,一般要遵循下列步骤:(1)定义一个GDI对象(如CPen、CBrush对象),然后用相应的函数(如CreatePen、CreateSolidBrush)创建此GDI对象。但要注意;有些GDI派生类的构造函数允许用户提供足够的信息,从而一步即可完成对象的创建任务,这些类有CPen、CBrush。(2)将构造的GDI对象选入当前设备坏境中,但不要忘记将原来的GDI对象保存起来。(3)绘图结束后,恢复当前设备环境中原来的GDI对象。2、库存的GDI对象 除了自定义的GDI对象外,Windows还包含了一些预定义的库存GDI对象。由于它们是Windows系统的一部分,因此用户用不着删除它们。CDC的成员函数SelectStockObject可以把一个库存对象选入当前设备环境中,并返回原先被选中的对象指针,同时使原先被选中的对象从设备环境中分离出来。函数SelectStockObject可选用的库存GDI对象类型可以是表5.2所示值之一。表5.1 MFC的GDI类 类 名 说 明 CBitmap “位图”是一种位矩阵,每一个显示像素都对应于其中的一个或多个位,用户可以利用位图来表示图象,也可以利用它来创建画刷CBrush “画刷”定义了一种位图形式的像素,利用它可对区域内部填充颜色或样式CFont “字体”是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当做资源存于磁盘中,其中有一些还依赖于某种设备CPalette “调色板”是一种颜色映射接口,它允许应用程序在不干扰其它应用程序的前提下,充分利用输出设备的颜色描绘能力CPen “画笔”是一种用于画线及绘制有形边框的工具,用户可以指定它的颜色及宽度,并且可以指定它实线、点线或虚线等CRgn “区域”是由多边形、椭圆或二者组合形成的一种范围,可以利用它来进行填充、裁剪以及鼠标点中测试等表5.2 函数SelectStockObject可选用的库存GDI对象类型值类型值 含 义 BLACK_BRUSH 黑色画刷 DKGRAY_BRUSH 深灰色画刷 GRAY_BRUSH 灰色画刷 HOLLOW_BRUSH 中空画刷 LTGRAY_BRUSH 浅灰色画刷 NULL_BRUSH 空画刷 WHITE_BRUSH 白色画刷 BLACK_PEN 黑色画笔 NULL_PEN 空画笔WHITE_PEN 白色画笔DEVICE_DEFAULT_FONT 设备默认字体SYSTEM_FONT 系统字体 531 画笔CPen类CPen类封装了一个Windows GDI画笔,并且提供了用于操作CPen对象的若干方法。CPen类用来决定画线的风格和颜色。在使用画笔之前,首先必须构造画笔对象,有2种方法:(1)构造和初始化对象都在带参数的构造函数中一步完成,如:生成颜色为绿色,宽度为2个像素的实心画笔:CPen newPen(PS_SOLID,2,RGB(0,255,0); (2)构造初始化分2步完成:构造由不带参数的构造函数完成,而初始化由初始化函数完成。如:生成颜色为红色,宽度为2个像素的实心画笔:CPen newPen;newPen.CreatePen(PS_SOLID,2,RGB(255,0,0); 参 数: PS_SOLID: 画笔的风格,见表5.3所示 2: 画笔的宽度(2个像素)RGB(255,0,0):画笔的颜色表5.3 修饰画笔的风格风 格 含 义 图例 PS_SOLID 实 线 PS_DASH 虚 线 - PS_DOT 点线 . PS_DASHDOT 点画线 -.-.-.-.-.-.-.-.-. PS_DASHDOTDOT 双点画线 -.-.-.-.-.-.- PS_NULL 不可见线 PS_INSIDEFRAME 内框线 _ (3)CreatePenIndirect函数也是用于创建画笔对象,它的作用与CreatePen函数完全一样,只是画笔的3个属性不是直接出现在函数参数中,而是通过一个LOGPEN结构间接地给出。BOOL CreatePenIndirect(LPLOGPEN lpLogPen);此函数用由LOGPEN结构指针指定的相关参数创建画笔。LOGPEN结构如下:Typedef struct tagLOGPEN UINT lopnStyle /画笔风格 POINT lopnWidth; /POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor /画笔颜色LOGPEN注 意:1、当修饰画笔的宽度大于1个像素时,画笔的风格只能取PS_NULL、PS_SOLID或PS_INSIDEFRAME,定义为其它风格不会起作用。2、画笔的创建工作也可在画笔的构造函数中进行,它具有下列原型:CPen(int nPenStyle,int nWidth,COLORREF crColor);例55 用颜色为蓝色,宽度为8个像素的实心画笔,画线和画椭圆。(1)创建一个单文档的应用程序,名为:画笔(2)利用ClassWizard将WM_PAINT消息映射到视图类(View)中,并加代码:void CMyView:OnPaint() CDC *pDC=GetDC();/获得显示设备环境DC的指针pDCCPen newPen;/定义图笔对象/生成一支颜色为蓝色,宽度为8个像素的实心画笔newPen.CreatePen(PS_SOLID,8,RGB(0,0,255); /将创建的画笔选入内存DC,同时暂停挤出并保存原画笔CPen *poldpen=pDC-SelectObject(&newPen); pDC-MoveTo(10,10);/调用MoveTo函数,定位于点(10,10)pDC-LineTo(100,100);/调用LineTo函数,画线至点(100,100)pDC-Ellipse(120,120,160,160);/调用画椭圆函数Ellipse/恢复内存DC中原有的画笔pDC-SelectObject(poldpen); ReleaseDC(pDC);/释放显示DC (3)编译运行,结果见图5.3.2所示。注 意:默认的画笔为黑色、一个像素的宽度、实心。默认的画刷为白色。例如:例5.4中的OnPaint()函数中没有创建画笔,则用默认的画笔绘图。 5.3.2 颜色画笔运行结果532 画刷CBrush类 CBrush 类封装了一个Window GDI画刷,并且提供了用于操作CBrush对象的若干方法。画刷可设置画刷的色彩和区域填充的绘图方法。在使用画笔、画刷之前,首先必须构造画笔、画刷对象,有2种构造方法。(1)构造和初始化对象都在带参数的构造函数中一步完成,如:CBrush newBrush(RGB(0,0,255);/蓝色画刷(2)构造和初始化分2步完成,构造由不带参数的构造函数完成,而初始化由初始化函数完成,如:CBrush newBrush;newBrush.CreateSolidBrush(RGB(0,0,255);(3)CBrush类根据画刷属性提供了相应的创建函数,例如创建填充画刷和填充样式画刷函数为:CreateSolidBrush和CreateHatchBrush,它们的原型如下:BOOL CreateSolidBrush(COLORREF crColor);/创建填充色画刷BOOL CREATEhATCHbRUSH(int nIndex,COLORREF crColor);/创建填充样式画刷参 数:nIndex 用于指定画刷的内部填充样式crColor表示画刷的填充色 与画笔类似,画刷也有一个LOGBRUSH逻辑结构用于画刷属性的定义,并通过CBrush的成员函数CreateBrushIndirect来创建,其原型如下:BOOL CreateBrushIndirect(const LOGBRUSH *lpLogBrush);参 数:LOGBRUSH结构如:Typedef struct tagLOGBRUSH UINT lbStyle; /风格 COLORREF lbColor; /填充色 LONG lbHatch; /填充样式LOGBRUSH;(4)画刷的创建工作也可在其构造函数中进行,它具有下列原型:CBrush(COLORREF crColor);CBrush(int nIndex,COLORREF crColor);CBrush(CBitmap *pBitmap);(5)画刷也可用位图来指定其填充图案,但该位图应该是8*8像素,若畏途太大,Windows则只使用其左上角的8*8的像素。(6)画刷仅对一些绘图函数有效,如:Ellipse、FillRect函数等。例56 用颜色为红色、宽度为6个像素的实心画笔画矩形,并用绿色画刷填充矩形内部。(1)创建一个单文档的应用程序,名为:画刷(2)利用ClassWizard将WM_PAINT消息映射到视图类(View)中,并加代码:void CMyView:OnPaint() CDC *pDC=GetDC();/获得显示设备环境DC的指针pDCCPen newPen; /定义画笔对象 /生成一支颜色为红色,宽度为6个像素的实心画笔newPen.CreatePen(PS_SOLID,6,RGB(255,0,0); CBrush newBrush; /定义画刷对象 newBrush.CreateSolidBrush(RGB(0,255,0);/绿色画刷/将创建的画笔选入内存DC,同时暂时挤出并保存原画笔CPen *poldpen=pDC-SelectObject(&newPen); /将创建的画刷选入内存DC,同时暂时挤出并保存原画刷 CBrush *poldbrush=pDC-SelectObject(&newBrush); pDC-MoveTo(10,10);/调用MoveTo函数,定点到点(10,10)pDC-LineTo(100,100);/调用LineTo函数,画线到点(100,100)/调用画矩形函数RectanglepDC-Rectangle(120,120,200,200);/恢复内存DC中原有的画笔pDC-SelectObject(poldpen); /恢复内存DC中原有的画刷pDC-SelectObject(poldbrush); /释放显示DCReleaseDC(pDC); 图5.3.3 红色画笔、绿色画刷(3)编译运行,结果如图5.3.3所示。 画刷的属性通常包括填充色、填充图案和填充样式3种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8*8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识,如表5.4所示。54 坐标映射在某个设备环境中绘制一个高为100个像素,宽也为100个像素的方块,语句如下:pDC-Rectangle(CRect(0,0,100,100); / Rectangle绘制矩形,长方形表5.4 画刷的填充样式 标识 填充样式HS_BDIAGONAL 向下点斜线HS_CROSS 方格HS_DIAGCROSS 向下点斜线与斜线复合HS_FDIAGONAL 向上点斜线HS_HORIZONTAL 横条HS_VERTICAL 竖条由于默认的映射模式是MM_TEXT,其逻辑坐标(在各种映射模式下的坐标)和设备坐标(显示设备或打印设备坐标系下的坐标)相等。因此这个方块在1024*768的显示器上看起来要比在640*480的显示器上显得小一些,而且若将它打印在600dpi精度的激光打印机上,这个方块就会显得更小了。为了能保证打印的结果不受设备的影响,Windows定义了一些映射模式,如表5.5所示,这些映射决定了设备坐标和逻辑坐标之间的关系。表5.5 映 射 模 式映射模式 含义 MM_TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正MM_HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正MM_LOENGLISH 每个逻辑单位为0.01英寸,x向右为正,y向上为正MM_HIMETRIC 每个逻辑单位为0.01mm,x向右为正,y向上为正MM_LOMETRIC 每个逻辑单位为0.1mm,x向右为正,y向上为正MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72英寸),x向右为正,y向上为正MM_ANISOTRPIC x,y 可变比例MM_ISOTROPIC x,y 等比例 这样,我们就可以通过调用CDC:SetMapMode(int nMapMode)来设置相应的映射模式。例如:若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20*20mm的方块。而MM_ISOTROPIC映射模式下:纵横比总是1:1,也就是说,无论比例因子如何变化,圆总是圆的。但,MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC:SetWindowExt(设置窗口大小)和CDC:SetViewportExt(设置视口大小)函数来设置所需要的比例因子。“窗口”和“视口”的概念往往不易理解。所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下: x比例因子=视口x大小/窗口x大小 y比例因子=视口y大小/窗口y大小例57:将一个椭圆绘制在视窗中央,且当视图的大小发生改变时,椭圆的形状也会随之改变。(通过设置窗口和视口大小来改变显示的比例)1)建一个单文档应用程序,名为:椭圆的绘制2)在View类的OnDraw函数里加如下代码:void CMyView:OnDraw(CDC* pDC)/CMyDoc* pDoc = GetDocument();/ASSERT_VALID(pDoc);CRect rectClient; /定义矩形对象GetClientRect(rectClient); /获得当前窗口的客户区大小 /设置MM_ANISOTROPIC映射模式,x,y可变比例,见表5.5所示pDC-SetMapMode(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);/椭圆的4个坐标点/ TODO: add draw code for native data here3)编译运行,当你改变窗口大小,椭圆也随之改变,见图5.4.1所示。说 明:SetMapMode该函数设置指定设备环境的映射方式,映射方式定义了将逻辑单位转换为设备单位的度量单位,并定义了设备的X、Y轴的方向。函数原型:int SetMapMode(HDC hdc, int fnMapMode);参 数:hdc:指向设备环境的句柄。 fnMapMode:指定新的映射方式,此参数可以是上面表5.5列出的任何一个值。55 CPoint、CSize和CRect 图5.4.1 绘制椭圆在图形绘制操作中,常常需要使用MFC中的CPoint(点)、CSize(大小)和CRect(矩形)等简单数据类。它们是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示: typedef struct tagPOINT LONG x; /点的x坐标 LONG y; /点的y坐标POINT;Typedef struct tagSIZE int cx; /水平大小 (表示矩形的宽度) int cy; /垂直大小 (表示矩形的高度)SIZE;typedef struct tagRECT LONG left; /矩形左上角点的x坐标 LONG top; /矩形左上角点的y坐标LONG right; /矩形右下角点的x坐标LONG bottom; /矩形右下角点的y坐标RECT;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);CSize(SIZE initSize);参 数:initCX和initCY用于分别设置CSize的cx和cy成员。initSize用于指定一个SIZE结构或CSize对象来初始化CSize的成员。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);参 数:l,t,r,b分别用于指定CRect的left,top,right和bottom成员的值。srcRect、lpSrcRect分别用一个RECT结构或指针来初始化CRect的成员。Point用于指定矩形的左上角位置。Size用于指定矩形的长度和宽度。topLeft和bottomRight分别用于指定CRect的左上角和右下角的位置。2、CRect类的常用操作 由于一个CRect类对象包含用于定义矩形左上角和右下角点的成员变量,因此在传递LPRECT、LPCRECT或RECT结构作为参数的任何地方,都可以使用CRect对象来代替。 当构造一个CRect 时,要使它符合规范。也就是说,使其left小于right,top小于bottom;例如,若左上角为(20,20),而右下角为(10,10),那么定义的这个矩形就不符合规范。一个不符合规范的矩形,CRect的许多成员函数都不会有正确的结果。因此,常常使用CRect:NormalizeRect函数使一个不符合规范的矩形合乎规范。CRect类的操作函数有很多,这里只介绍矩形的扩大、缩小以及2个矩形的“并”和“交”操作,更多的常用的成员函数如表5.6所示:表5.6 CRect类常用的成员函数成员函数 功能说明int Width()const; 返回矩形的宽度int Height()const; 返回矩形的高度 CSize Size()const; 返回矩形左下角的点坐标CPoint &BottomRight 返回矩形右下角的点坐标CPoint CenterPoing()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,y1),右下角点为(x2,y2)void SetRectEmpty(); 将矩形的所有坐标设置为0void NormalizeRect(); 使矩形符合规范如:左上角为(10,10),右下角为(20,20)是规范的。而左上角为(20,20),右下角为(10,10)是不规范的。void OffsetRect(int x,int y); 移动矩形,水平和垂直移动量分别由x、y或point、size的2个成员来指定 void OffsetRect(POINT point);void OffsetRect(SIZE size);成员函数InflateRect和DeflateRect用于扩大和缩小一个矩形。由于他们的操作是相互的,也就是说,若指定InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此以下只给出InflateRect函数的原型:void InflateRect(int x,int y);void InflateRect(SIZE size);void InflateRect(LPCRECT lpRect);void InflateRect(int l,int t,int r,int b);说 明:1、x 用于指定扩大CRect左、右边的数值2、y 用于指定扩大CRect上、下边的数值3、size中的 cx 成员指定扩大左、右边的数值,cy成员指定扩大上、下边的数值4、lpRect的各个成员用于指定扩大每一边的数值5、l,t,r,b分别用于指定扩大CRect左、上、右、下边的数值由于InflateRect是通过将CRect的边向远离其中心的方向移动来扩大的,因此对于前2个重载函数来说,CRect的总宽度被增加了2倍的x或cx,总高度被增加了2倍的y或cy。成员函数IntersectRect和UnionRect分别用于将2个矩形进行相交和合并,当结果为空时返回FALSE,否则返回TRUE。他们的原型如下:BOOL IntersectRect(LPCRECT lpRect1,LPCRECT lpRect2);BOOL UnionRect(LPCRECT lpRect1,LPCRECT lpRect2);参 数:lpRect和lpRect2用于指定操作的2个矩形,例如: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,75,150,95);rectInter.UnionRect(rectOne,rectTwo);/结果为(0,0,350,200)ASSERT(rectInter=CRect(0,0,350,200);例58 改变窗口大小时,窗口会以三种不同的颜色显示窗口背景。1)建一个单文档SDI应用程序,名为:显示背景颜色2)在视图的头文件View.h的public下定义矩形窗口对象:CRect r;3)在视图的执行文件View.cpp前面加颜色预定义:.#endif#define RED RGB(255,0,0) /红色#define GREEN RGB(0,255,0) /绿色#define BLUE RGB(0,0,255) /兰色#define BLACK RGB(0,0,0) /黑色值/ CMyViewIMPLEMENT_DYNCREATE(CMyView, CView)BEGIN_MESSAGE_MAP(CMyView, CView).4)在OnDraw()函数添加如下代码: void CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);GetClientRect(r); /获取窗口大小if(r.right750&r.right750&r.bottomFillSolidRect(r,RED); /充填窗口背景红色elseif(r.right500&r.right500&r.bottomFillSolidRect(r,GREEN); /充填窗口背景绿色elseif(r.right500|r.bottomFillSolidRect(r,BLUE); /充填窗口背景蓝色)elsepDC-FillSolidRect(r,BLACK);/充填窗口背景黑色5)运行后出现的窗口是红色,最小是蓝色,中间是绿色。56 颜色和颜色对话框 一个彩色像素的显示需要颜色空间支持,MFC中的CDC类使用的是RGB颜色空间,即选用红(R)、绿(G)、蓝(B)3种基色分量,通过对这3种基色不同比例的混合,可以得到不同彩色效果。在MFC中使用COLORREF数据类型来表示一个32位的RGB颜色,它可以用16进制表示: OxOObbggrr。其中:rr,gg,bb分别表示红、绿、蓝各种颜色分量的16进制值,最大为Oxff。在具体操作RGB颜色时,还可使用下列宏操作:GetBValue 获得32位RGB颜色值中的蓝色分量GetGValue 获得32位RGB颜色值中的绿色分量GetRValue 获得32位RGB颜色值中的红色分量RGB 将指定的R,G,B分量值转换成一个32位的RGB颜色值MFC的CColorDialog类为应用程序提供了“颜色选择通用”对话框,如图5.6.1所示。CColorDialog类具有下列的构造函数:CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd *pParentWnd=NULL);参 数:clrInit 用于指定选择的默认颜色值,若此值没有指定,则为RGB(0,0,0) (黑色)pParentWnd 用于指定对话框的父窗口指针dwFlags 用于表示定制对话框外观和功能的系列标志参数,它可以是下列值之一或“|”组合:CC_ANYCOLOR 在基本颜色单元中列出所有可得到的颜色CC_FULLOOEN 显示所有的颜色对话框界面。 图5.6.1“颜色选择通用”对话框(调色板)若此标志没有被设定,则用户单击“规定自定义颜色”按钮才能显示出定制颜色界面CC_PREVENTFULLOPEN禁用“规定自定义颜色”按钮CC_S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年销售团队季度目标制定指南
- 物业公共设施维护管理办法
- 法律文书申请书写作模板合集
- 高处作业吊篮安装拆卸工岗位操作规程考核试卷及答案
- 小学二年级下册数学口算训练题选
- 物料索道操作工基础考核试卷及答案
- 塑料焊工基础考核试卷及答案
- 矿车修理工协同作业考核试卷及答案
- 海岸带隧道工程影响评价分析
- 显示器件流程变革分析报告
- 数字化设计与制造技术专业教学标准(高等职业教育专科)2025修订
- 2025至2030年中国中试基地行业市场全景调查及发展趋向研判报告
- 承兑汇票转让协议书
- 业主直接参与物业管理区域的物业管理
- 《运动医学与康复》课件
- 2025年自建房施工合同书 (包工不包料 C款)
- 军事心理战试题及答案
- 2025年北京市第一次普通高中学业水平合格性考试历史试题(含答案)
- 二年级上册数学《观察物体》教学设计
- 检验科消防安全知识培训
- 心肾综合征诊疗实践指南解读
评论
0/150
提交评论