




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图形和文本输出,图形设备接口和设备环境GDI对象CGdiObject画笔和画刷的使用处理文本位图上机指导,抽象接口,负责管理用户绘图操作时功能的转换,用于实现图形操作与设备间的无关性,避免了用户对硬件直接进行操作。具体:用户通过调用GDI函数与设备打交道,GDI通过不同设备提供的驱动程序将绘图语句转换为对应的绘图指令。,图形设备接口GDI(GraphicsDeviceInterface),应用程序可以使用GDI创建3种类型的图形输出:矢量图形、光栅图形和文本。1.矢量图形:是指画线和填充图形,包括点、直线、曲线、多边形、扇形和矩形等。2.光栅图形:是指光栅图形函数对以位图形式存储的数据进行操作,包括各种位图和图标的输出。在屏幕上表现为对若干行和列的像素操作,在打印机上则是若干行和列的点阵输出。光栅图形是直接从内存到显存的复制操作,所以速度快,但是对内存大小要求高。3.文本:与字符方式下不同,Windows文本是图形方式输出。输出文本时对输出位置的计算不是以行为单位,以逻辑坐标为单位进行计算。用户可以设置文本的各种效果,如加粗、斜体、设置颜色等。,设备环境DC(DeviceContext),也称设备描述表或设备上下文。它是由GDI创建、用来代表设备连接的数据结构。主要功能有如下:(1)允许应用程序使用一个输出设备。(2)提供Windows应用程序、设备驱动和输出设备之间的连接。(3)保存当前信息,例如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜色和背景等影响图形输出的绘图模式。(4)保存窗口剪切区域(ClippingRegion),限制程序输出到输出设备中窗口覆盖的区域。,设备环境,应用程序,设备描述表及其属性,通过设备描述表的句柄来间接地存取,应用程序每一次图形操作均参照设备描述表中的属性执行,1.设备环境类CDC及其功能MFC封装了DC,提供CDC类及它的子类以访问GDI。MFC提供的设备环境类包括CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC等,其中CDC类是MFC设备环境类的基类,其他MFC设备环境类都是CDC类的派生类,如图3.2所示。,2.设备环境类CDC的一些常用函数CDC提供了基本的绘图操作函数,如画点、画线、画圆、画矩形、画多边形等。表3-2列出了一些常用函数及其功能。,设备环境类,Windows用COLORREF类型的数据存放颜色,它实际上是一个32位整数。COLORREF类型数据的低位字节存放红色强度值,第2个字节存放绿色强度值,第3个字节存放蓝色强度值,高位字节为0,每一种颜色取值范围为0255。,颜色的设置,绘图前,必须准备好设备环境DC。在程序中不能直接存取,只能通过系统提供的一系列函数或使用设备环境的句柄HDC来间接地获取或设置设备环境结构中的各项属性(显示器高度和宽度、支持的颜色数及分辨率等)。,1.传统的SDK获取设备环境的方法(1)在WM_PAINT消息处理函数中使用API函数BeginPaint()获取设备环境,在消息处理函数返回前调用API函数EndPaint()释放设备环境。(2)不在WM_PAINT消息处理函数中,调用API函数GetDC()获取设备环境,调用API函数ReleaseDC()释放设备环境。,WM_PAINT-图形刷新消息,获取设备环境,BeginPaint函数:hdc=BeginPaint(hwnd,ReleaseDC函数voidReleaseDC(HWNDhwnd);,2.MFC应用程序获取设备环境的方法MFC提供了不同类型的设备环境类CDC(CDC、CPaintDC、CClientDC、CWindowDC等),每一个类都封装了设备环境句柄,并且它们的构造函数可自动调用上述获取设备环境的Win32API函数,析构函数可自动调用释放设备环境的Win32API函数。在一个MFC应用程序中获得DC的方法主要有两种:接受一个参数为指向CDC对象的指针;声明一个MFC设备环境类的对象,并使用this指针为该对象赋值。,GDI对象是Windows图形设备接口的抽象绘图工具。除了画笔和画刷,其他GDI对象还包括字体、位图和调色板。MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类,如CPen、CBrush、CFont、CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类。,GDI对象CGdiObject,1.CPen类:封装GDI画笔。用于绘制对象的边框以及直线和曲线。默认的画笔用于绘制与一个像素等宽的黑色实线。2.CBrush类:封装GDI画刷。画刷是用来填充一个封闭图形对象(如矩形、圆形)的内部区域的,默认画刷是白色。3.CFont类:封装GDI字体对象。主要用于设置文本输出的效果,包括文字的大小、加粗、斜体、下划线等。4.CBitmap类:封装GDI位图。提供成员函数装载和位图操作,位图可以用于填充区域。5.CPalette类:封装GDI调色板。包含系统可用的色彩信息,是应用程序和彩色输出设备环境(如显示器)的接口。6.CRgn类:封装GDI区域。区域是窗口内的一块多边形或椭圆形区域。CRgn配合CDC类中与裁剪(clipping)有关的成员函数使用。,1使用库存(stock)对象无论以CDC类对象指针形式还是以CDC子类对象形式获得设备环境,系统都默认指定了一组绘图属性。,画笔和画刷的使用,使用SelectStockObject()函数可以直接选择库存对象。如果选择成功,函数SelectStockObject()将返回以前的CGdiObject对象的指针,可直接选用的库存对象见表。,a.创建画笔:(1)CPenPenNew(PS_DASH,1,RGB(255,0,0);(2)CPenPen;pen.CreatePen(PS_DASH,1,RGB(255,0,0);其中,参数依次是笔的样式、线的宽度、线的颜色。,2创建和使用自定义画笔,hP=CreatePen(intnPenStyle,intnWidth,COLORREFrgbColor);,HPENhP;,DeleteObject(hP);,SelectObject(hdc,hP);,b.选择创建的画笔例如:CPen*PenOld;/用于保存原来的画笔PenOld=pDC-SelectObject(,c.还原画笔例如:/恢复设备环境DC中原来的画笔pDC-SelectObject(PenOld);/删除创建的画笔PenNew.DeleteObject();,创建画刷、选择创建的画刷和还原画刷等步骤。类型不同的画刷使用不同的CBrush成员函数实现。,(1)创建指定颜色的实心画刷函数为:BoolCreateSolidBrush(COLORREFcrColor);例如:CBrushbrush;brush.CreateSolidBrush(RGB(255,0,0);/红,HBRUSHCreatePatternBrush(HBITMAPhbmp);,HBRUSHCreateSolidBrush(COLORREFcrColor);,HBRUSHCreateHatchBrush(intfnStyle,COLORREFclrref);,3创建和使用自定义画刷,(2)创建阴影画刷函数:BoolCreateHatchBrush(intnIndex,COLORREFcrColor);参数nIndex用于指定阴影样式例如CBrushbrush;/水平和垂直交叉阴影线的红色画刷brush.CreateHatchBrush(HS_CROSS,RGB(255,0,0);,(3)创建位图画刷函数BoolCreatePatternBrush(CBitmap*pBitmap);/8*8例如:CBitMapmybmp;mybmp.LoadBitMap(IDB_MYBMP);CBrushbrush;brush.CreatePatternBrush(,CDC中常用绘图函数,CDC绘图与Win32绘图的区别,设置画笔当前位置的函数MoveToEx,BOOLMoveToEx(HDChdc,intX,Y,/X、Y分别为新位置的逻辑坐标LPPOINTlpPoint/存放原画笔位置的POINT结构地址),从当前位置向指定坐标点画直线的函数LineTo,BOOLLineTo(HDChdc,intX,intY)/X和Y为线段的终点坐标,从当前位置开始,依次用线段连接lpPoints中指定的各点BOOLPolyline(HDChdc,LPPOINTlpPoints,/指向包含各点坐标的POINT结构数组intnCount/nCount为POINT数组中点的个数),绘制椭圆弧线的函数Arc,BOOLArc(HDChdc,intX1,intY1,/边框矩形左上角的逻辑坐标intX2,intY2,/边框矩形右下角的逻辑坐标intX3,intY3,/椭圆弧起始点坐标intX4,intY4/椭圆弧终止点坐标),绘制饼图,并用当前画刷进行填充BOOLPie(HDChdc,intX1,intY1,/边框矩形左上角的逻辑坐标intX2,intY2,/边框矩形右下角的逻辑坐标intX3,intY3,/椭圆弧起始经线的确定点坐标intX4,intY4/椭圆弧终止经线的确定点坐标),绘制矩形,并用当前画刷进行填充BOOLRectangle(HDChdc,intX1,intY1,intX2,intY2),绘制圆角矩形,并用当前画刷填充BOOLRoundRect(HDChdc,intX1,intY1,intX2,intY2,intnHeight,intnWidth),绘制椭圆,并用当前画刷填充BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2),绘制多边形,并用当前画刷填充BOOLPolygon(HDChdc,LPPOINTlpPoints,intnCount),包含各点坐标的POINT数组的地址,多边形点的个数,文本的处理过程包括文本的属性设置、字体设置、文本格式化、调用文本输出函数输出文本等具体的步骤。,1设置文本显示属性可以通过调用CDC类成员函数重新设置字体颜色、背景颜色和文本对齐方式等文本显示属性。(默认值),处理文本,a.设置背景模式:intSetBkMode(intnBkMode);其中,nBkMode指定背景模式,OPAQUE(不透明)或TRANSPARENT(透明)。注:只有在使用CDC成员函数SetBkMode()设置背景模式后,设置的背景颜色才能在输出时有效。,b.设置文本对齐方式文本对齐方式描述了文本坐标(x,y)和文本框之间的关系。默认的对齐方式是TA_LEFT|TA_TOP,操作函数为:UINTSetTextAlign(UINTnFlags);例如:CDC*pDC;pDC-SetTextAlign(TA_RIGHT|TA_BOTTOM);,Windows支持光栅字体、矢量字体和TrueType等3种类型的字体。CFont类提供的创建函数中常用的有以下几个:,BOOLCreatePointFont(intnPointSize,LPCTSTRlpszFaceName,CDC*pDC=NULL);参数分别为字体大小(1/10磅为单位)、使用的字体名称、一个设备环境对象。,BOOLCreateFontIndirect(constLOGFONT*lpLogFont);参数lpLogFont为指向LOGFONT结构的指针,用于说明一种字体的所有属性。,2设置字体,BOOLCreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbItalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRlpszFacename);,CFont*def_font=dc.SelectObject(,3格式化文本Windows系统不参与窗口客户区的管理,这就意味着在客户区内输出文本时,必须由应用程序管理换行、后继字符的位置等输出格式。文本的显示是以像素为单位,因此在绘制任何文本之前,需要精确地知道文本的详细属性,如高度、宽度等,用来计算文本坐标。CDC类提供了几个文本测量成员函数:,a.GetTextExtent()函数可以获得所选字体中指定字符串的宽度和高度:CSizeGetTextExtent(LPCTSTRlpszString,intnCount);其中,参数分别为字符串的指针、所包括的字符数。返回值CSize中,cx是字符串宽度,cy是字符串高度。,b.GetTextMetrics()函数可以获得当前字体TEXTMETRIC结构的数据:BOOLGetTextMetric(constTEXTMETRIC*lpTextMetric);参数lpTextMetric为指向结构TEXTMETRIC的指针。TEXTMETRIC结构用来描述字体信息。,MFCCDC类中常用的文本输出函数有以下几种:a.TextOut()该函数使用当前设定的字体、颜色、对齐方式在指定位置上输出文本。函数原型为:vitualBOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount);或:BOOLTextOut(intx,inty,constCstring其中,参数(x,y)指定输出文本串的开始位置;参数lpszString和str为输出的文本串;参数nCount指定文本串的长度。,4常用文本输出函数,b.DrawText()该函数在给定的矩形区域内输出文本,并可调整文本在矩形区域内的对齐方式以及对文本行进行换行处理等。函数原型为:VirtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);或:intDrawText(constCString其中,参数lpszString和str为要输出的文本串,可以使用换行符“n”;参数nCount指定文本串长度;参数lpRect指定用于显示文本串的矩形区域;参数nFormat指定如何格式化文本串。,c.ExtTextOut()该函数的功能与TextOut()相似,但可以根据指定的矩形区域裁剪文本串,并调整字符间距。函数原型为:VirtualBOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,LPCTSTRlpszString,UINTnCount,LPINTlpDxWidths);或:BOOLExtTextOut(intx,inty,UINTnOptions,LPCRECTlpRect,constCStringd.TabbedTextOut()该函数的功能与TextOut()相似,但可按指定的制表间距扩展制表符。,位图是一个由位构成的图像,它是由一系列0和1排列而成的点阵结构。位图中每一个像素点由位图文件中的一位或者多位数据表示,整个位图的信息被细化为每个像素的属性值。Windows支持两种不同形式的位图:设备相关位图(DeviceDependentBitmap,DDB)和设备无关位图(DeviceIndependentBitmap,DIB)。,位图,设备相关图(DDB),DDB又称GDI位图,它依赖于具体设备,只能存在于内存中。这主要体现在以下两个方面:一方面,DDB的颜色模式必须与输出设备相一致;另一方面,在256色以下位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。因此,当在一台机器上创建的位图在另一台机器上显示时就可能会出现问题。,设备无关图(DIB),DIB是不依赖硬件的位图,因为它包含了创建DIB位图时所在设备的颜色格式、分辨率和调色板等信息。DIB位图不能直接显示,需要先转换为与设备相关的格式,再由具体的设备显示。DIB位图通常以BMP后缀名的文件形式存储在磁盘中,或者以资源的形式存在于EXE或DLL文件中。,MFC提供了大量的类和函数来处理位图的操作。a.创建DDB函数BOOLLoadBitmap(LPCTSTRlpszResourceName);BOOLLoadBitmap(UINTnlDResource);其中,参数lpszResourceName或nlDResouree分别为位图资源名称或位图资源标识。该函数从资源中装入一幅位图,若载入成功,则返回值为真,否则返回值为假。资源位图实际上是一个DIB位图,该函数在装入时把它转换成了DDB位图。,位图操作函数,BOOLCreateCompatibleBitmap(CDC*pDC,intnWidth,intnHeight);其中参数pDC指向一个设备环境,参数nWidth和nHeight以像素为单位,用来指定位图的宽度和高度。该函数创建一个与指定设备环境兼容的DDB。若创建成功,函数返回值为真,否则为假。,b.获取位图信息函数intGetBitmap(BITMAP*pBitMap);该函数用来获取与DDB有关的信息,参数pBitMap是BITMAP结构的指针。,c.输出位图函数BOOLBitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop);该函数共有8个参数,其中x、y、nWidth、nHeight定义当前设备环境的复制区域;pSrcDC为指向原设备环境对象的指针;xSrc、ySrc为原位图的左上角坐标;dwRop定义了进行复制时的光栅操作方式。该函数把源设备环境中的位图复制到目标设备环境中。,BOOLPatBlt(intx,inty,intnWidth,intnHeight,DWORDdwRop);其中,参数DwRop确定画刷类型。该函数是用当前画刷填充一个矩形。并不是所有的设备环境都支持该函数,使用该函数之前需要对设备环境使用GetDeviceCaps进行判断,以便确定是否支持该函数调用。,BOOLStretchBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,DWORDdwRop);其中,除了参数nSrcWidth和nSrcHeight表示目标图像新的宽度与高度之外,其他参数x、y、nWidth和nHeight等的含义与BitBlt函数中的同名参数相同。该函数提供了将图形拉伸压缩的复制方式。,(1)声明一个CBitmap类的对象,使用LoadB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 维修工考试试题及答案
- 外科麻醉 试题及答案
- 2025年广东省江门市江海区八年级英语第二学期期中监测模拟试题含答案
- 天车工试题及答案
- 9.1.2-3 分层随机抽样、获取数据的途径-2025年高一数学新教材同步课堂精讲练导学案(人教A版必修第二册)含答案
- 2025年医疗机构质量与安全协议
- 2025年度员工离职福利策划与审核协议书
- 2025年品质审核协议
- 2025年合法住宅转租协议范本
- 2025年结束劳动协议
- 2025年全国保密教育线上培训考试试题库【完整版】附带答案详解
- 江西省南昌市2025届高三下学期二模生物试题 含解析
- 幼儿园小班科学领域《云朵和雨点》课件
- 2025届苏锡常镇四市高考生物二模试卷含解析
- DB23T 3945-2025 黑龙江省超低能耗居住建筑节能施工技术规程
- 2025-2030鞋靴行业市场发展分析及投融资与风险研究报告
- 福建农信招聘笔试真题2024
- 合成氨完整版本
- 配资协议合同
- 电气二次部分试题及答案
- 制冷设备施工方案
评论
0/150
提交评论