第9章 文字和图形处理技术_第1页
第9章 文字和图形处理技术_第2页
第9章 文字和图形处理技术_第3页
第9章 文字和图形处理技术_第4页
第9章 文字和图形处理技术_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

9

章文字和图形处理技术【学习目标】

与其他许多编程工具相比,VisualC++在图形、图像的处理方面更胜一筹。在编写Windows风格的程序过程中,载入位图或者创建位图都是程序员经常使用的方法,只有熟练掌握了位图的使用方法,才能编写出标准且美观的应用程序。本章中将介绍与VisualC++相关的图形、图像处理知识,对绘图所需要的类进行充分讲解,对于各种文本和位图的操作进行细致地介绍,并通过具体的实例来对绘图函数的用法进行详细的说明。通过学习本章,读者可以达到以下学习目的:

l

了解GDI对象和设备上下文

l

掌握各种样式文本的输出

l

掌握各种图形的绘制

l

掌握对图形进行颜色填充

l

掌握图像的绘制

l

掌握图像在窗口中的一些操作课件制作人:宋坤【学习导航】

文本和图形图像处理技术在应用程序的许多方面被广泛使用。例如,设计应用程序界面、设计第三方控件、设计多媒体应用程序等。本章从文本输出、图形绘制和图像显示3个方面介绍了其在VisualC++中的实现。本章在书中的学习位置如图9-1所示。课件制作人:宋坤【知识框架】

本章学习内容知识框架如图9-2所示。课件制作人:宋坤本章目录9.1GDI概述9.2设备上下文介绍9.3GDI对象

9.4文本输出9.5绘制图形9.6绘制图像9.7课后习题√√√√√√√课件制作人:宋坤9.1GDI概述

以往许多MSDOS程序采用直接向视频存储区或打印机端口输送数据,这种做法不利之处是需要各种显示卡(低分辨率彩色图形显示卡、加强图形显示卡以及图像图形阵)或打印机驱动程序,支持所有这些设备意味着要用大量的编程来包含这些驱动程序(为每一个设备编写不同的代码)。为了减轻开发程序的难度,Windows提供了一个抽象的接口,图形设备接口GraphicsDeviceInterface(GDI)。另外,Windows还提供了各种显示卡及打印机的驱动程序,这样在写程序时就可以不必关心显示卡和打印机的类型,简化了程序开发的难度。其实,GDI是微软公司提供的一组绘图函数,通常称之为GDI函数。使用这些函数可以绘制各种图形。本章将介绍有关GDI的相关知识。

课件制作人:宋坤9.2设备上下文介绍

设备上下文的英文全称是DeviceContext,简称为DC。设备上下文是用来绘制图形的逻辑设备,编程人员可以在该设备上绘制直线、曲线和立方体等各式各样的几何图案及在设备上输出文字。在开发应用程序时往往要在输出设备上输出程序的运行结果。输出设备通常指的是显示器和打印机,但程序员需要了解显示器和打印机的特性才能将结果显示在输出设备上,而了解显示器和打印机特性这个过程会花去程序员的大部分时间,为减少开发应用程序的开发时间及开发难度,就提出设备上下文这个概念。通过使用设备上下文,编程人员可以不必关心输出设备的具体特性,直接绘制最终的结果,而余下的工作都交给系统来完成。在Windows应用程序中,每个窗口都关联有设备上下文,用户只要获得了窗口的设备上下文,就可以在窗口中绘制各种文本、图形图像等信息了。例如:下面的语句从对话框中获得了一个设备上下文句柄,并在设备上下文中输出文本,方法如下。(1)新建一个对话框应用程序。(2)在对话框类的OnPoint方法中添加如下代码:voidCDrawDlgDlg::OnPaint(){HDChDC;hDC=GetDC()->m_hDC;chardata[]="明日科技有限公司!";

TextOut(hDC,60,30,data,strlen(data));//代码省略}在向设备上下文中输出文本时,文本将显示在对话框中,如图9-1所示。课件制作人:宋坤9.2设备上下文介绍

Windows操作系统提供了一组WindowsAPI函数用于在设备上下文中绘制信息,通常被称为GDI函数。在上面的例子中使用的TextOut函数便是其中之一。在MFC中,为了方便用户绘图,提供了一个设备上下文类——CDC,该类中封装的多个方法用于在屏幕中绘制信息,这些方法多数是与GDI函数一一对应的。在后面的章节中将逐步介绍这些方法在实际中的应用。

课件制作人:宋坤9.3GDI对象

为了方便用户在设备上下文中绘制信息,Windows提供了6个GDI对象,分别为画笔、画刷、字体、位图、调色板和区域。MFC对这6个对象分别进行了封装,形成了6个对应的类,分别为“CPen”、“CBrush”、“CFont”、“CBitmap”、“CPalette”和“CRgn”。下面分别对这6个类进行介绍。

CPenCPen类封装了Windows的画笔对象。画笔对象主要用于绘制线条,通过画笔对象,可以设置绘制线条的宽度、颜色、风格等信息。CPen类的主要方法如下。1.CreatePen方法CreatePen方法用于动态创建一个画笔对象。语法:BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);BOOLCreatePen(intnPenStyle,intnWidth,constLOGBRUSH*pLogBrush,intnStyleCount=0,constDWORD*lpStyle=NULL);CreatePen方法参数说明如表9-1所示。参数名称参数说明nPenStyle表示画笔样式,可选值如表9-2所示nWidth表示画笔的宽度crColor表示画笔的颜色pLogBrush表示LOGBRUSH结构指针nStyleCount表示lpStyle参数的长度。如果nPenStyle不为PS_USERSTYLE,该参数必须为0lpStyle表示用户定义的画笔风格。如果nPenStyle不为PS_USERSTYLE,该参数必须为NULL课件制作人:宋坤9.3GDI对象

下面利用CreatePen方法创建了一个画笔对象,并且利用该画笔绘制了一个矩形。例如:绘制矩形的程序设计步骤如下。(1)新建一个对话框应用程序。(2)在对话框类的OnPoint方法中添加如下代码:参数值参数值描述PS_SOLID用于绘制实线PS_DASH用于绘制虚线PS_DOT用于绘制点线PS_DASHDOT用于绘制虚线和点线交替的直线PS_DASHDOTDOT用于绘制一虚线和两点交替的直线PS_NULL不可见画线PS_INSIDEFRAME实线画笔,用来压缩图表使之适合有界矩形PS_GEOMETRIC创建一支几何画笔PS_COSMETIC创建一支装饰画笔PS_ALTERNATE创建一支交替设置像素的画笔PS_USERSTYLE创建一支使用用户提供的风格数组的画笔PS_ENDCAP_ROUND尾帽是圆的PS_ENDCAP_SQUARE尾帽是方的PS_ENDCAP_FLAT尾帽是平面的PS_JOIN_BEVEL连接是斜截式的PS_JOIN_MITER在SetMiterLimit()函数设置的当前设置下,连接是斜接式,否则斜截式PS_JOIN_ROUND连接是圆的课件制作人:宋坤9.3GDI对象

voidCDrawDlg1Dlg::OnPaint(){HDChDC;hDC=GetDC()->m_hDC;CPenpen;//创建一个红色的宽度为2的画笔

pen.CreatePen(PS_SOLID,2,RGB(255,0,0));//选中画笔

SelectObject(hDC,pen);CRectrc(80,30,200,80);//利用画笔绘制矩形

Rectangle(hDC,80,30,200,80);//代码省略}运行后效果如图9-2所示。课件制作人:宋坤9.3GDI对象

2.CreatePenIndirect方法CreatePenIndirect方法根据LOGPEN结构信息直接创建画笔。语法:BOOLCreatePenIndirect(LPLOGPENlpLogPen);lpLogPen:表示LOGPEN结构指针,该结构描述了画笔的宽度、风格和颜色信息。 CBrush画刷用来填充诸如多边形、椭圆和路径等图形内部的位图形式的像素。例如,在绘制一个矩形时,需要在矩形内部填充颜色或位图等,这需要使用画刷对象。CBrush的主要方法如下。1.CreateSolidBrush方法CreateSolidBrush方法用指定的颜色创建画刷。语法:BOOLCreateSolidBrush(COLORREFcrColor);crColor:表示画刷的颜色。下面利用CreateSolidBrush方法创建一个蓝色的画刷,并将其填充在矩形中。例如:填充矩形的程序设计步骤如下。(1)新建一个对话框应用程序。(2)在对话框类的OnPoint方法中添加如下代码:voidCDrawDlg2Dlg::OnPaint(){

CDC*pDC=GetDC();

//获取对话框的设备上下文指针

CBrushbrush; //定义画刷对象

brush.CreateSolidBrush(RGB(0,0,255)); //创建蓝色的画刷

pDC->SelectObject(&brush); //选中画笔

CRectrc(80,30,200,80);

pDC->FillRect(rc,&brush); //利用画笔绘制矩形

pDC->DeleteDC();

//代码省略}课件制作人:宋坤9.3GDI对象效果如图9-3所示。

2.CreateHatchBrush方法CreateHatchBrush方法用于创建阴影画刷。语法:BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);

nIndex:表示画刷的阴影风格,可选值如表9-3所示。参数值参数值描述HS_BDIAGONAL

45的向下影线,从左到右HS_CROSS水平和垂直方向以网格线做出阴影HS_DIAGCROSS45的网格线阴影HS_FDIAGONAL45的向上阴影线,从左到右HS_HORIZONTAL水平的阴影线HS_VERTICAL垂直的阴影线课件制作人:宋坤9.3GDI对象3.CreateBrushIndirect方法CreateBrushIndirect方法使用LOGBRUSH结构信息直接创建画刷。语法:BOOLCreateBrushIndirect(constLOGBRUSH*lpLogBrush);lpLogBrush:表示LOGBRUSH结构指针,LOGBRUSH结构描述了画刷的风格、颜色和虚线等信息。4.CreatePatternBrush方法CreatePatternBrush方法用于创建一个位图画刷。利用位图画刷,用户可以将位图填充到一个区域中。语法:BOOLCreatePatternBrush(CBitmap*pBitmap);pBitmap:表示一个位图对象指针。下面利用CreatePatternBrush方法创建一个位图画刷,并将其填充到对话框的客户区域中。例如:使用画刷的程序设计步骤如下。(1)新建一个对话框应用程序。(2)在对话框类的OnPoint方法中添加如下代码:voidCDrawDlg3Dlg::OnPaint(){CDC*pDC=GetDC();//获取对话框的设备上下文指针

CBrushbrush; //定义画刷对象

CBitmapbmp; //定义一个位图

bmp.LoadBitmap(IDB_BITBRUSH);brush.CreatePatternBrush(&bmp);pDC->SelectObject(&brush); //选中画笔

CRectrc;GetClientRect(rc); //获取窗口的客户区域

pDC->FillRect(rc,&brush); //利用画笔绘制矩形

pDC->DeleteDC();//代码省略}

课件制作人:宋坤9.3GDI对象效果如图9-4所示。

5.CreateDIBPatternBrush方法CreateDIBPatternBrush方法利用设备无关位图的调色板创建画刷。语法:BOOLCreateDIBPatternBrush(HGLOBALhPackedDIB,UINTnUsage);BOOLCreateDIBPatternBrush(constvoid*lpPackedDIB,UINTnUsage);hPackedDIB:包含一个全局内存对象,用于标识设备无关位图信息。lpPackedDIB:表示设备无关位图信息,通常为BITMAPINFO结构指针。nUsage:表示BITMAPINFO结构中的bmiColors成员是否表示RGB值。可选值如表9-4所示。

参数值参数值描述DIB_PAL_COLORS颜色表由16位的索引数组构成DIB_RGB_COLORS颜色表中包含字母方式的颜色值DIB_PAL_INDICES只在第2个版本的方法中可用,表示没有颜色表课件制作人:宋坤9.3GDI对象6.CreateSysColorBrush方法CreateSysColorBrush方法创建系统预定义的颜色画刷。语法:BOOLCreateSysColorBrush(intnIndex);nIndex:表示画刷的阴影风格,可选值如表9-3所示。

CFont字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些字体还依赖于某种设备。MFC提供了CFont类用于封装字体对象,该类的主要方法如下。1.CreateFontIndirect方法CreateFontIndirect方法利用LOGFONT结构信息直接创建字体对象。语法:BOOLCreateFontIndirect(constLOGFONT*lpLogFont);lpLogFont:表示LOGFONT结构指针,LOGFONT结构中描述了字体的高度、宽度、字符集、下划线、字体名称等信息,定义如下:typedefstructtagLOGFONT{LONGlfHeight;//字体高度

LONGlfWidth;//字体宽度

LONGlfEscapement;//水平角度

LONGlfOrientation;//字体方向

LONGlfWeight;//字体线条宽度

BYTElfItalic;//斜体

BYTElfUnderline;//是否有下划线

BYTElfStrikeOut;//加粗

BYTElfCharSet;//字体使用的字符集

BYTElfOutPrecision;//字体输出的精度

BYTElfClipPrecision;//字体的剪辑进度

BYTElfQuality;//字体的质量

BYTElfPitchAndFamily;//字符间距和字体属性

TCHARlfFaceName[LF_FACESIZE];//字体的命名}LOGFONT;课件制作人:宋坤9.3GDI对象2.CreateFont方法CreateFont方法用于创建一个字体。语法:BOOLCreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbItalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRlpszFacename);其参数与LOGFONT结构的成员是对应的,具体含义请参考CreateFontIndirect方法。3.CreatePointFont方法CreatePointFont方法根据字体大小和字体名称创建字体。语法:BOOLCreatePointFont(intnPointSize,LPCTSTRlpszFaceName,CDC*pDC=NULL);nPointSize:表示字体大小,单位是十分之一像素。例如,如果该参数为150,则表示15个像素大小。lpszFaceName:表示字体名称。pDC:表示一个CDC对象指针,用于转换nPointSize到逻辑单位。如果为NULL,将以屏幕的设备上下文作为转换的依据。4.CreatePointFontIndirect方法CreatePointFontIndirect方法与CreateFontIndirect方法相同,利用LOGFONT结构信息直接创建字体对象。只是LOGFONT结构中的lfHeight成员以像素的十分之一为单位,而CreateFontIndirect方法中LOGFONT结构的lfHeight成员以设备单位表示。语法:BOOLCreatePointFontIndirect(constLOGFONT*lpLogFont,CDC*pDC=NULL);lpLogFont:表示LOGFONT结构指针,LOGFONT结构中描述了字体的高度、宽度、字符集、下划线、字体名称等信息。pDC:表示一个CDC对象指针,用于转换LOGFONT结构的lfHeight成员到逻辑单位。如果为NULL,将以屏幕的设备上下文作为转换的依据。

课件制作人:宋坤9.3GDI对象

CBitmap位图是一种位矩阵,每一个显示像素都对应于其中的一个或多个位。程序中可以利用位图来表示图像,也可以利用它来创建画刷。MFC中提供了CBitmap类封装来Windows中的位图对象,CBitmap类的主要方法如下。1.LoadBitmap方法LoadBitmap方法用于加载一个位图资源到位图对象上。语法:BOOLLoadBitmap(UINTnIDResource);BOOLLoadBitmap(LPCTSTRlpszResourceName);nIDResource:表示位图资源ID。当用户通过工作区的资源视图窗口中导入一幅位图时,会自动生成一个资源ID。LoadBitmap方法能够利用资源ID将位图资源关联到当前的位图对象上。lpszResourceName:表示位图资源名称。在程序中可以使用MAKEINTRESOURCE宏将资源ID转换为资源名称。2.LoadOEMBitmap方法LoadOEMBitmap方法用于加载预定义的Windows位图。语法:BOOLLoadOEMBitmap(UINTnIDBitmap);nIDBitmap:表示预定义的位图号码。3.LoadMappedBitmap方法LoadMappedBitmap方法用于加载位图资源,并且映射位图颜色到当前的系统颜色中。语法:BOOLLoadMappedBitmap(UINTnIDBitmap,UINTnFlags=0,LPCOLORMAPlpColorMap=NULL,intnMapSize=0);LoadMappedBitmap方法参数说明如表9-5所示。

课件制作人:宋坤9.3GDI对象4.CreateBitmap方法CreateBitmap方法用于创建一个位图资源。语法:BOOLCreateBitmap(intnWidth,intnHeight,UINTnPlanes,UINTnBitcount,constvoid*lpBits);CreateBitmap方法参数说明如表9-6所示。

参数名称参数描述nIDBitmap表示位图资源IDnFlags表示位图标记,可以为0lpColorMap表示COLORMAP结构指针nMapSize表示参数lpColorMap的大小参数名称参数描述nWidth表示位图的宽度nHeight表示位图的高度nPlanes表示位图中调色板的数量nBitcount表示颜色用到的位数lpBits表示位图数据课件制作人:宋坤9.3GDI对象5.CreateBitmapIndirect方法CreateBitmapIndirect方法利用BITMAP结构信息直接创建位图。语法:BOOLCreateBitmapIndirect(LPBITMAPlpBitmap);lpBitmap:表示BITMAP结构指针,该结构描述了位图的相关信息,定义如下:typedefstructtagBITMAP{intbmType;//标识位图的类型,如果为逻辑位图,必须为0

intbmWidth;//以像素为单位标识位图的宽度,该值必须大于0

intbmHeight;//以像素为单位标识位图的高度,该值必须大于0

intbmWidthBytes;//标识每一行使用的字节数

BYTEbmPlanes;//标识位图中调色板的数量

BYTEbmBitsPixel;//每个像素占用的位数

LPVOIDbmBits;//位图数据}BITMAP;6.CreateCompatibleBitmap方法CreateCompatibleBitmap方法用于创建一个与指定设备上下文兼容的位图。语法:BOOLCreateCompatibleBitmap(CDC*pDC,intnWidth,intnHeight);pDC:表示设备上下文指针。nWidth:表示位图宽度。nHeight:表示位图高度。7.CreateDiscardableBitmap方法CreateDiscardableBitmap方法用于创建一个与指定设备上下文兼容的可废弃的位图。所谓可废弃位图是指在内存紧张的情况下,Windows可以从内存中清除位图资源。语法:BOOLCreateDiscardableBitmap(CDC*pDC,intnWidth,intnHeight);pDC:表示设备上下文指针。nWidth:表示位图宽度。nHeight:表示位图高度。

课件制作人:宋坤9.3GDI对象8.GetBitmap方法GetBitmap方法用于获取位图信息,将其填充到BITMAP结构中。语法:intGetBitmap(BITMAP*pBitMap);pBitMap:表示BITMAP结构指针,用于存储方法返回的位图信息。

CPalette调色板在一个应用程序和一个颜色输出设备之间提供了一个接口,通过这个接口应用程序可以拥有自己的颜色索引,可以提高程序的运行速率及提高应用程序的颜色处理能力。在MFC中,CPalette类封装了Windows调色板对象,其主要方法如下。1.CreatePalette方法CreatePalette方法用于创建一个调色板资源,并将其关联到调色板对象上。语法:BOOLCreatePalette(LPLOGPALETTElpLogPalette);lpLogPalette:表示LOGPALETTE结构指针,该结构描述了逻辑调色板信息,定义如下:typedefstructtagLOGPALETTE{WORDpalVersion;//表示系统的版本号,应该为0x300WORDpalNumEntries;//表示调色板中的表项数,对于灰度图,该值为256

PALETTEENTRYpalPalEntry[1];//表示调色板中的颜色表项}LOGPALETTE;2.CreateHalftonePalette方法CreateHalftonePalette方法用于创建一个半色调调色板。语法:BOOLCreateHalftonePalette(CDC*pDC);pDC:表示设备上下文指针。3.AnimatePalette方法AnimatePalette方法用于替换指定逻辑调色板的入口点。语法:voidAnimatePalette(UINTnStartIndex,UINTnNumEntries,LPPALETTEENTRYlpPaletteColors);nStartIndex:表示要替换的第1个调色板的入口点。nNumEntries:表示被替换的入口点数量。lpPaletteColors:表示指向数组结构第1个元素的指针,用来替换当前的入口点。课件制作人:宋坤9.3GDI对象4.GetNearestPaletteIndex方法GetNearestPaletteIndex方法用于返回与指定颜色接近的调色板入口点索引。语法:UINTGetNearestPaletteIndex(COLORREFcrColor)const;crColor:表示颜色值。5.ResizePalette方法ResizePalette方法用于改变逻辑调色板的大小。语法:BOOLResizePalette(UINTnNumEntries);nNumEntries:表示调色板入口点的数量。如果该参数小于原来的调色板入口点大小,则调整后剩余的入口点不改变;如果该参数大于原来的调色板入口点大小,则额外的入口点被设置为黑色。6.GetEntryCount方法GetEntryCount方法用于返回调色板中入口点的数量。语法:intGetEntryCount();7.GetPaletteEntries方法GetPaletteEntries方法用于返回调色板中的一组入口点。语法:UINTGetPaletteEntries(UINTnStartIndex,UINTnNumEntries,LPPALETTEENTRYlpPaletteColors)const;nStartIndex:表示方法返回的入口点的起始位置。nNumEntries:表示返回的入口点数量。lpPaletteColors:用于接收方法返回的入口点信息。8.SetPaletteEntries方法SetPaletteEntries方法用于设置调色板中入口点的RGB颜色值。语法:UINTSetPaletteEntries(UINTnStartIndex,UINTnNumEntries,LPPALETTEENTRYlpPaletteColors);nStartIndex:表示方设置的入口点的起始位置。nNumEntries:表示设置的入口点数量。lpPaletteColors:用于设置的入口点信息。课件制作人:宋坤9.3GDI对象

CRgnWindows中的区域对象由多边形,椭圆或二者组合形成的一种范围,可以利用它来进行区域的填充、裁剪以及鼠标点的测试。MFC中提供了CRgn类封装区域对象,该类的主要方法如下。1.CreateRectRgn方法CreateRectRgn方法用于创建一个矩形区域。语法:BOOLCreateRectRgn(intx1,inty1,intx2,inty2);CreateRectRgn方法参数说明如表9-7所示。

参数名称参数描述x1表示矩形区域的左上角x轴坐标y1表示矩形区域的左上角y轴坐标x2表示矩形区域的右下角x轴坐标y2表示矩形区域的右下角y轴坐标2.CreateRectRgnIndirect方法CreateRectRgnIndirect方法根据RECT结构信息创建矩形区域。语法:BOOLCreateRectRgnIndirect(LPCRECTlpRect);lpRect:表示RECT结构指针,其定义如下:typedefstructtagRECT{intleft;//矩形区域的左上角x轴坐标

inttop;//矩形区域的左上角y轴坐标

intright;//矩形区域的右下角x轴坐标

intbottom;//矩形区域的右下角y轴坐标}RECT;3.CreateEllipticRgn方法CreateEllipticRgn方法用于根据外接矩形创建一个椭圆形区域。语法:BOOLCreateEllipticRgn(intx1,inty1,intx2,inty2);CreateRectRgn方法参数说明如表9-8所示。课件制作人:宋坤9.3GDI对象4.CreatePolygonRgn方法CreatePolygonRgn方法用于创建一个多边形区域。语法:BOOLCreatePolygonRgn(LPPOINTlpPoints,intnCount,intnMode);lpPoints:表示多边形的顶点。nCount:表示多边形的顶点数量。nMode:表示区域的填充模式。5.CreatePolyPolygonRgn方法CreatePolyPolygonRgn方法用于创建一组封闭的多边形组成的区域。语法:BOOLCreatePolyPolygonRgn(LPPOINTlpPoints,LPINTlpPolyCounts,intnCount,intnPolyFillMode);CreatePolyPolygonRgn方法参数说明如表9-9所示。

参数名称参数描述x1表示矩形区域的左上角x轴坐标y1表示矩形区域的左上角y轴坐标x2表示矩形区域的右下角x轴坐标y2表示矩形区域的右下角y轴坐标参数名称参数描述lpPoints表示多边形的顶点数组lpPolyCounts表示整数数组,第1个元素表示第1个多边形的顶点数,第2个元素表示第2个多边形的顶点数,依此类推nCount表示所有多边形的顶点数nPolyFillMode表示多边项的填充模式课件制作人:宋坤9.3GDI对象6.CombineRgn方法CombineRgn方法用于组合区域。语法:intCombineRgn(CRgn*pRgn1,CRgn*pRgn2,intnCombineMode);pRgn1:表示一个区域对象指针。pRgn2:表示一个区域对象指针。nCombineMode:表示组合模式,可选值如表9-10所示。

参数值参数值描述RGN_AND表示返回两个区域的重叠部分RGN_COPY表示返回第1个区域的拷贝RGN_DIFF表示返回第1个区域中不包含第2个区域的部分RGN_OR表示返回两个区域的所有部分RGN_XOR表示返回两个区域中去除重叠部分的其他所有部分7.PtInRegion方法PtInRegion方法用于判断某个坐标点是否在指定的区域中。语法:BOOLPtInRegion(intx,inty)const;BOOLPtInRegion(POINTpoint)const;x:表示坐标点的x轴坐标。y:表示坐标点的y轴坐标。point:表示一个坐标点。

课件制作人:宋坤9.4文本输出文本输出是计算机图形、图像处理技术的最基本的功能,在Windows系统中,可以使用设备上下文对象来进行文本输出。在MFC中,提供了CDC类对Windows的设备上下文进行了封装,本节将介绍如何使用CDC类进行文本输出。

使用TextOut方法在指定位置输出文本使用ExtTextOut方法在指定区域输出文本

使用TabbedTextOut方法根据制表位输出文本

使用DrawText方法格式化输出文本

设置文本背景颜色

√√√√√课件制作人:宋坤使用TextOut方法在指定位置输出文本文本的背景是指文本输出的矩形区域内除文本以外的其他部分。文本的背景颜色就是用来填充区域的颜色。调用CDC类成员函数SetBkColor可以设置文本的背景颜色。调用GetBkColor可以获取当前文本的背景颜色。语法:VirtualCOLORREFSetBkColor(COLORREFcrColor);COLORREFGetBkColor()const;crColor:用于设置输出文本的颜色,可以通过RGB函数指定。要使设置的背景颜色起作用,必须将文本的背景模式设置为OPAGUE。要实现上面功能,只需修改视图类中的OnDraw方法,方法如下。

(1)创建一个单文档\视图的应用程序。(2)在视图类的OnDraw方法中添加如下代码:voidCSetBkColorView::OnDraw(CDC*pDC){CSetBkColorDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);nbkmode=pDC->SetBkMode(OPAQUE);//设置背景模式为OPAQUEpDC->SetBkColor(RGB(0,255,0));//将背景设置为绿色

pDC->TextOut(30,60,"背景颜色改变"); }课件制作人:宋坤使用TextOut方法在指定位置输出文本(3)从输出可以清楚的看到文本的背景颜色已经被修改成绿色,如图9-9、图9-10所示。

课件制作人:宋坤使用ExtTextOut方法在指定区域输出文本

CDC类提供了ExtTextOut方法用于在指定的区域中输出文本。语法:virtualBOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,LPCTSTRlpszString,UINTnCount,LPINTlpDxWidths);BOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,constCString&str,LPINTlpDxWidths);ExtTextOut方法参数说明如表9-12所示。

参数名称参数描述x表示字符串中第1个字符单元的x轴坐标y表示字符串中第1个字符单元的y轴坐标nOptions表示矩形区域的类型,如果为ETO_CLIPPED,表示文本被剪辑,以适应矩形区域;如果为ETO_OPAQUE,表示用当前的背景颜色填充矩形区域lpRect表示输出文本的矩形区域lpszString是一个字符串的指针,表示输出的文本nCount表示字符串中字符的数量lpDxWidths是一个整型数组,其中的第i个元素表示第i个字符单元和第i+1个字符单元的原点间的距离,实际上也就是用于指定字符间距。如果为NULL,系统将使用默认的间距str表示输出的字符串课件制作人:宋坤使用ExtTextOut方法在指定区域输出文本

下面以一个具体实例介绍如何使用ExtTextOut方法在指定区域输出文本。程序设计具体步骤如下。(1)创建一个单文档\视图结构的应用程序。(2)在CMainFrame类的OnCreate方法中设置窗口的图标。SetIcon(LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_EXTTEXTYPE)),TRUE);(3)在视图类的OnDraw方法中输出文本。voidCExtTextOutView::OnDraw(CDC*pDC){CExtTextOutDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//定义一个区域对象

CRectrc(90,60,155,80);pDC->ExtTextOut(rc.left,rc.top,ETO_CLIPPED,rc,"明日科技有限公司",NULL);rc.SetRect(90,90,155,110);pDC->ExtTextOut(rc.left,rc.top,0,rc,"明日科技有限公司",NULL);}(4)运行程序,效果如图9-6所示。

课件制作人:宋坤使用TabbedTextOut方法根据制表位输出文本

CDC类提供了TabbedTextOut方法用于在制定位置显示文本,并用指定的制表间距扩展制表符。语法:virtualCSizeTabbedTextOut(intx,inty,LPCTSTRlpszString,intnCount,intnTabPositions,LPINTlpnTabStopPositions,intnTabOrigin);CSizeTabbedTextOut(intx,inty,constCString&str,intnTabPositions,LPINTlpnTabStopPositions,intnTabOrigin);TabbedTextOut方法参数说明如表9-13所示。

参数名称参数描述x表示文本输出的起始点x轴坐标y表示文本输出的起始点y轴坐标lpszString表示字符串指针,标识输出的文本nCount表示输出文本的长度nTabOrigin表示定位点的起始坐标nTabPositions表示输出文本中定位字符串的个数

lpnTabStopPosition用来存放每一个定位字符所表示的定位点

str表示输出的文本,为CString类型

课件制作人:宋坤使用TabbedTextOut方法根据制表位输出文本

下面通过修改视图类中的OnDraw方法来使用TabbedTextOut函数,程序步骤如下。(1)创建一个单文档\视图的应用程序。(2)在视图类的OnDraw方法中添加如下代码:voidCTabbedTextOutView::OnDraw(CDC*pDC){CTabbedTextOutDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CStringstr="明

有限

公司"; //一共用了5次TAB制表符

intarray[5]={100,250,400,550,700};pDC->TabbedTextOut(10,20,str,-1,5,array,10);pDC->TextOut(10,40,str);}其中str字符串中用了5个TAB制表符,array数组表示的是每个制表符所需扩充的大小,通过同时使用TabbedTextOut和TextOut进行文本输出,可以发现使用TextOut方法TAB制表符只显示为一个黑色长条,而TabbedTextOut方法则按照array数组中的数据对各个制表符进行了不同的扩充。(3)程序运行结果如图9-7所示。课件制作人:宋坤使用DrawText方法格式化输出文本

CDC类提供了DrawText方法用于在指定的区域中输出文本。语法:virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);DrawText方法参数说明如表9-14所示。

参数名称参数描述lpszString是一个字符串的指针,表示输出的文本nCount表示字符串中字符的数量lpRect表示输出文本的矩形区域nFormat表示输出文本的格式str表示输出的字符串下面以一个具体实例介绍如何使用DrawText方法在指定区域输出文本。程序设计具体步骤如下:(1)创建一个单文档\视图结构的应用程序。(2)在CMainFrame类的OnCreate方法中设置窗口的图标。SetIcon(LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_EXTTEXTYPE)),TRUE);(3)在视图类的OnDraw方法中输出文本。

课件制作人:宋坤使用DrawText方法格式化输出文本

voidCDrawTextView::OnDraw(CDC*pDC){CDrawTextDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//定义一个区域对象

CRectrc(50,90,250,110);pDC->DrawText("明日科技有限公司",16,rc,DT_RIGHT);rc.SetRect(50,120,250,200);CStringstr="明日科技有限公司";

pDC->DrawText(str,rc,DT_LEFT);}(4)运行程序,效果如图9-8所示。课件制作人:宋坤设置文本背景颜色

文本的背景是指文本输出的矩形区域内除文本以外的其他部分。文本的背景颜色就是用来填充区域的颜色。调用CDC类成员函数SetBkColor可以设置文本的背景颜色。调用GetBkColor可以获取当前文本的背景颜色。语法:VirtualCOLORREFSetBkColor(COLORREFcrColor);COLORREFGetBkColor()const;crColor:用于设置输出文本的颜色,可以通过RGB函数指定。要使设置的背景颜色起作用,必须将文本的背景模式设置为OPAGUE。要实现上面功能,只需修改视图类中的OnDraw方法,方法如下。

(1)创建一个单文档\视图的应用程序。(2)在视图类的OnDraw方法中添加如下代码:voidCSetBkColorView::OnDraw(CDC*pDC){CSetBkColorDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);nbkmode=pDC->SetBkMode(OPAQUE);//设置背景模式为OPAQUEpDC->SetBkColor(RGB(0,255,0)); //将背景设置为绿色

pDC->TextOut(30,60,"背景颜色改变"); }课件制作人:宋坤设置文本背景颜色

(3)从输出可以清楚的看到文本的背景颜色已经被修改成绿色,如图9-9、图9-10所示。

课件制作人:宋坤9.5绘制图形

利用程序自动绘制图形可以增强图形的可视度,特别是对于一些多媒体教学之类的软件来说,使用程序自动绘制并控制图形无疑是一个新的突破。本节中通过几个应用实例,介绍绘图方面的相关知识。

利用点线绘制多边形

如何快速地绘制图形

如何填充指定的区域绘制不规则图形

√√√√课件制作人:宋坤利用点线绘制多边形

为了方便用户进行图形绘制,CDC类中特地提供了MoveTo和LineTo两个函数使用户可以利用点线进行图形的绘制。语法:CPointMoveTo(intx,inty);CPointMoveTo(POINTpoint);BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);x,y:表示所希望到达的点的坐标,point:是指向POINT结构的一个对象。一般绘制图形的时候,最开始是确定一个起始点,这时候就要使用MoveTo函数确定第1个点,然后从这个点出发依次到达其他的点,就可以绘制出想要的图形。例如我们绘制一个三角形,可以按照如下方式写出代码。(1)一个单文档\视图模式的应用程序。(2)在视图类中的OnDraw方法中添加代码如下:课件制作人:宋坤利用点线绘制多边形

voidCLineToView::OnDraw(CDC*pDC){CLineToDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC->MoveTo(40,40);//确定顶点

pDC->LineTo(20,20);pDC->LineTo(60,20);pDC->LineTo(40,40);

POINTTop,Lbottom,Rbottom;//先定义顶点,左顶点和右顶点

Top.x=40;Top.y=40;Lbottom.x=20;Lbottom.y=60;Rbottom.x=60;Rbottom.y=60;pDC->MoveTo(Top);pDC->LineTo(Lbottom);pDC->LineTo(Rbottom);pDC->LineTo(Top);}课件制作人:宋坤利用点线绘制多边形

(3)运行结果如图9-11所示。

有时候我们想让图形的某个点突出显示或者就是想绘制一个点,这时就可以使用SetPixel函数进行绘制。语法:COLORREFSetPixel(intx,inty,COLORREFcrColor);COLORREFSetPixel(POINTpoint,COLORREFcrColor);用法与上面两个函数基本相同,参数中多了一个要求用RGB函数定义颜色。比如想在上面的例子中的(50,100)坐标处添加一个红色的点,可以在上述代码末尾添加一行如下代码:pDC->SetPixel(50,100,RGB(255,0,0));运行后可以看到原来图形下方多了一个红色的小点。

课件制作人:宋坤如何快速地绘制图形

上节我们讲了通过点线来绘制图形,但是日常应用中为了绘制一个简单的长方形就要按照上面一步步的用线连接起来,这样过于繁琐,为了方便用户使用,CDC类中特意封装了许多常用的图形函数,让用户在使用的时候可以方便调用。常用的几个图形函数如下:

绘制矩形CDC类中提供成员函数Rectangle来帮助用户方便的绘制出矩形,如果想绘制一个圆角矩形可以使用RoundRect函数。语法:BOOLRectangle(intx1,inty1,intx2,inty2);BOOLRectangle(LPCRECTlpRect);

BOOLRoundRect(intx1,inty1,intx2,inty2,intx3,inty3);BOOLRoundRect(LPCRECTlpRect,POINTpoint);Rectangle与RoundRect方法参数说明如表9-15所示。参数名称参数描述x1表示矩形左上角的x轴坐标y1表示矩形左上角的y轴坐标x2表示矩形右下角的x轴坐标y2表示矩形右下角的y轴坐标lpRectCRect的一个对象,表示绘制矩形的区域x3表示绘制圆角矩形中圆角的椭圆宽度y3表示绘制圆角矩形中圆角的椭圆高度pointPOINT结构的一个对象,表示圆角的宽度和高度课件制作人:宋坤如何快速地绘制图形

绘制椭圆或圆形绘制一个椭圆(圆)只需调用CDC类中的Ellipse函数即可。语法:BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);Ellipse方法参数说明如表9-16所示。参数名称参数描述x1表示椭圆(圆)外接矩形的左上角的x轴坐标y1表示椭圆(圆)外接矩形的左上角的y轴坐标x2表示椭圆(圆)外接矩形的右下角的x轴坐标y2表示椭圆(圆)外接矩形的右下角的y轴坐标lpRectCRect的一个对象,表示外接矩形的区域

绘制多边形CDC类中提供成员函数Polygon用于绘制一个多边形。语法:BOOLPolygon(LPPOINTlpPoints,intnCount);lpPoints:表示的是一个多边形顶点数据。nCount:表示的是顶点数量。

课件制作人:宋坤如何快速地绘制图形

绘制扇形CDC类的成员函数Pie用于帮助用户方便的绘制出扇形。语法:BOOLPie(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLPie(LPCRECTlpRect,POINTptStart,POINTptEnd);Pie方法参数说明如表9-17所示:参数名称参数描述x1表示扇形的边界矩形的左上角的x轴坐标y1表示扇形的边界矩形的左上角的y轴坐标x2表示扇形的边界矩形的右下角的x轴坐标y2表示扇形的边界矩形的右下角的y轴坐标x3表示扇形弧线的起点x轴坐标y3表示扇形弧线的起点y轴坐标x4表示扇形弧线的终点x轴坐标y4表示扇形弧线的终点y轴坐标lpRectCRect的一个对象,表示扇形边界矩形的区域ptStartPOINT的对象,表示扇形弧线的起点ptEndPOINT的对象,表示扇形弧线的终点课件制作人:宋坤如何快速地绘制图形

以上就是几种常用的图形函数,下面将利用介绍的所有函数演示一段程序,方便理解函数的用法。(1)创建一个单文档\视图程序。(2)在其视图类中的OnDraw方法里添加代码,程序代码如下:voidCDrawView::OnDraw(CDC*pDC){CDrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC->Rectangle(30,150,250,300); //画一个矩形

pDC->RoundRect(30,80,250,100,30,20);//画一个圆角矩形

pDC->Ellipse(30,150,250,300); //在上面的矩形中画个椭圆

CPointpt1(280,30);CPointpt2(320,100);CPointpt3(380,50);CPointpt4(380,20);CPointpt5(300,20);CPointpt6(300,10);CPointpt[6]={pt1,pt2,pt3,pt4,pt5,pt6};pDC->Polygon(pt,6); //画一个六边形

pDC->Pie(280,200,380,100,250,20,400,200);//画一个扇形}课件制作人:宋坤如何快速地绘制图形

(3)运行结果如图9-12所示。

课件制作人:宋坤如何填充指定的区域

绘制完图形有时想给某些图形添加颜色,这时我们就可以用CDC类中提供的成员函数FillRect和FillSolidRect来进行相应的填充。语法:voidFillRect(LPCRECTlpRect,CBrush*pBrush);

voidFillSolidRect(LPCRECTlpRect,COLORREFclr);voidFillSolidRect(intx,inty,intcx,intcy,COLORREFclr);FillRect和FillSolidRect方法的参数说明如表9-18所示:参数名称参数描述lpRect表示要填充的矩形区域pBrush表示的是一个画刷x表示规定矩形的左上角的x轴坐标y表示规定矩形的左上角的y轴坐标cx表示规定矩形的右下角的x轴坐标cy表示规定矩形的右下角的y轴坐标两个函数的区别就是前者是先定义一个颜色画刷,后者是直接调用RGB函数。下面举个例子来让大家更快地理解这两个函数的用法,分别使用上述函数的集中不同用法。(1)新建一个单文档\视图程序。(2)修改视图类的OnDraw方法,添加代码如下:

课件制作人:宋坤如何填充指定的区域

voidCFillRectView::OnDraw(CDC*pDC){CFillRectDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRectr1(30,30,100,80);CRectr2(30,100,100,150);CBrushbrush=(RGB(255,0,0)); //定义一个红色画刷

pDC->FillRect(r1,&brush); //将r1区域填充为红色

pDC->FillSolidRect(r2,RGB(0,0,255)); //将r2区域填充为蓝色

pDC->FillSolidRect(120,60,200,100,RGB(0,255,0)); //将指定区域填充为绿色}(3)运行结果如图9-13所示。

课件制作人:宋坤绘制不规则图形

在绘制不规则图形的时候,可以充分利用前面介绍过的LineTo和Polygon两个函数。下面将用一个例子来演示如何绘制不规则的图形。(1)新建一个单文档\视图程序。(2)修改视图类的OnDraw方法,添加代码如下:voidCBGZView::OnDraw(CDC*pDC){CBGZDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//首先利用LineTo函数绘制一个类似五角星的图形

pDC->MoveTo(100,30);pDC->LineTo(80,50);pDC->LineTo(60,50);pDC->LineTo(80,70);pDC->LineTo(40,100);pDC->LineTo(100,80);pDC->LineTo(160,100);pDC->LineTo(120,70);pDC->LineTo(140,50);pDC->LineTo(120,50);pDC->LineTo(100,30);//然后用Polygon函数绘制一个六边形

CPointpt1(40,150);CPointpt2(120,250);CPointpt3(200,150);CPointpt4(200,300);CPointpt5(120,400);CPointpt6(40,300);CPointpt[6]={pt1,pt2,pt3,pt4,pt5,pt6};pDC->Polygon(pt,6);}课件制作人:宋坤绘制不规则图形

(3)运行结果如图9-14所示。

课件制作人:宋坤9.6绘制图像

图像设计丰富了计算机界面的内容,使程序设计时增添了不少色彩,通过本节的学习,读者将掌握图像在程序中显示的方法。

设备相关和设备无关位图在视图中绘制位图在界面中实现位图变换从磁盘中加载图像到窗口中显示JPEG图像√√√√√课件制作人:宋坤设备相关和设备无关位图

在Windows中显示图像都是先将预先准备好的图像复制到显示区域中,早期的Windows版本中位图文件格式与显示设备有关,一般是存储在资源文件中,在加载的时候只需要通过资源ID号就可以将图像装入,我们把这种图像格式称为设备相关位图,简称DDB(device-dependentbitmap)文件格式;从Windows3.0以后,位图文件格式就与显示设备无关了,我们就称这种格式为设备无关位图,简称DIB(device-independentbitmap)格式。但是Windows系统中仍然保留了DDB位图,只不过在将图像以位图的格式存储时系统会推荐你使用DIB格式,目的就是所存储的图像能够在任意显示设备上显示。DDB可以用MFC中的CBitmap来表示。通过其类成员函数LoadBitmap可以装入指定DDB,但是在绘制时必须借助另一个和当前绘图DC兼容的内

温馨提示

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

评论

0/150

提交评论