版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章图形和文本输出,1 图形设备接口和设备环境,Windows 提供了一个称为图形设备接口(Graphics Device Interface,GDI)的抽象接口,它处理来自Windows应用程序的图形函数调用,并通过设备驱动程序向设备输出图形。,一、图形设备接口,矢量图形 矢量图形输出是指画线和填充图形,包括点、直线、曲线、多边形、扇形和矩形等。 光栅图形 光栅图形输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出。 文本 与DOS字符方式下输出文本不同,Windows中的文本是按图形方式输出的。,GDI支持3种类型的图形输出:,应用程序的输出不直接面向显示器或
2、打印机等物理设备,而是面向设备环境(Device Context,DC)的虚拟逻辑设备。设备环境DC是由GDI创建、用来代表设备连接的数据结构。,二、设备环境,设备环境的功能: 允许应用程序使用一个输出设备。 提供应用程序、设备驱动和输出设备之间的连接。 保存当前绘图对象以及颜色、背景等绘图模式。 保存窗口剪切区域(Clipping Region)。,1. 设备环境类 MFC封装了DC,提供CDC类及其子类以访问GDI。,2. 设备环境类的常用函数 CDC提供了基本的绘图操作函数,如画点、画线、画圆、画矩形、画多边形等。,3. 颜色的设置 在绘制图形和图像时,颜色是一个重要的因素。Window
3、s用COLORREF类型的数据存放颜色,它是一个32位整数。,COLORREF,31231570,MFC提供了RGB宏,用于设置颜色,它将其中的红、绿、蓝分量值转换为COLORREF类型的颜色数据。,COLORREF RGB( BYTE byRed,/红色分量(范围0255) BYTE byGreen, /绿色分量(范围0255) BYTE byBlue, /蓝色分量(范围0255) );,常用颜色的RGB值。,4. 获取设备环境 设备环境不像其他Windows数据结构,在程序中不能直接存取,只能通过系统提供的一系列函数或使用设备环境的句柄HDC来间接地获取。,MFC应用程序获得DC的主要方法
4、: 接受一个参数为指向CDC对象的指针; 声明一个MFC设备环境类的对象,并使用this指针为该对象赋值。,CClientDC dc(this); /定义CClientDC对象 dc.TextOut(0, 0, Hello World!); /输出显示,构造和使用设备环境示例代码。,2 GDI对象,GDI对象是Windows图形设备接口的抽象绘图工具,GDI对象包括画笔、画刷、字体、位图和调色板等。,一、GDI对象类,二、系统默认绘图属性,当用户创建一个设备环境并在其中绘图时,系统都默认指定了一组绘图属性。,绘图模式指定如何将画笔颜色和被填充对象的内部颜色与显示设备上的颜色相结合。,int C
5、DC:SetROP2( int nDrawMode /绘图模式标识 );,三、绘图模式,库存对象(StockObject)是由Windows预先创建的、用于绘制屏幕的常用对象,包括库存画笔、画刷、字体等。,四、库存GDI对象,virtual CGdiObject* CDC:SelectStockObject( int nIndex /库存对象标识 );,1. 使用库存GDI对象 使用GDI对象绘图必须将该对象选入设备环境,MFC使用CDC成员函数SelectStockObject()将库存对象选入设备环境。,BOOL CGdiObject:CreateStockObject( int nInd
6、ex /库存对象标识 );,2. 创建自定义GDI对象 用户可以定义一个GDI类对象(C+对象),并使用CGdiObject成员函数CreateStockObject()来创建自定义的GDI对象。,3. 使用自定义GDI对象 使用CDC成员函数SelectObject()将自定义GDI对象选入设备环境。,CPen* CDC:SelectObject( CPen* pPen/画笔对象指针 );,CBrush* CDC:SelectObject( CBrush* pBrush /画刷对象指针 );,virtual CFont* CDC:SelectObject( CFont* pFont /字体对
7、象指针 );,CBitmap* CDC:SelectObject( CBitmap* pBitmap /位图对象指针 );,int CDC:SelectObject( CRgn* pRgn /区域对象指针 );,CGdiObject* CDC:SelectObject( CGdiObject* pObject /GDI对象指针 );,4. 删除自定义GDI对象 在结束使用GDI对象后,要调用CGdiObject成员函数DeleteObject()删除GDI对象并释放占用的系统资源。只有删除GDI对象后,与之关联的C+对象才能创建新的GDI对象。不能删除正被选入设备环境的GDI对象。,BOOL
8、CGdiObject:DeleteObject();,CClientDC dc(this); CPen *pPenOld; pPenOld =(CPen*)dc.SelectStockObject(NULL_PEN); /选入空画笔 CBrush brushNew, *pBrushOld; brushNew.CreateStockObject(GRAY_BRUSH); /创建灰色画刷 pBrushOld=(CBrush*)dc.SelectObject( /恢复画刷,创建和使用库存对象示例代码。,3 画笔和画刷,如果要在设备环境中使用自己的画笔绘图,首先需要创建一个指定风格的画笔,然后选择所创
9、建的画笔,最后还原画笔。,BOOL CPen:CreatePen( int nPenStyle, /画笔样式标识 int nWidth, /画笔宽度 COLORREF crColor/画笔的颜色 );,一、自定义画笔,CClientDC dc(this); CPen *pPenOld, penNew(PS_DASH, 1, RGB(255, 0, 0);/创建画笔 pPenOld=(CPen*)dc.SelectObject(/恢复系统原来的画笔,创建和使用自定义画笔示例代码。,和画笔一样,使用自定义画刷也包括创建画刷、选择创建的画刷和还原画刷等步骤。,创建实心画刷,BOOL CBrush:C
10、reateSolidBrush( COLORREF crColor/画刷的颜色 );,二、自定义画刷,创建阴影画刷,BOOL CBrush:CreateHatchBrush( int nIndex, /阴影样式标识 COLORREF crColor/画刷的颜色 );,创建位图画刷,BOOL CBrush:CreatePatternBrush( CBitmap* pBitmap/位图对象指针 );,CClientDC dc(this); CBrush *pBrushOld, brushNew; brushNew.CreateHatchBrush(HS_CROSS, RGB(255, 0, 0);
11、 /创建画刷 pBrushOld=(CBrush*)dc.SelectObject(/恢复系统原来的画刷,创建和使用自定义画刷示例代码。,4 处理文本,一、设置文本显示属性,在Windows 应用程序中经常使用GDI 处理文本,文本的处理过程包括文本的属性设置、字体设置、文本格式化、文本输出等。,设置文本前景色,virtual COLORREF CDC:SetTextColor( COLORREF crColor/文本前景色 );,设置文本背景色,virtual COLORREF CDC:SetBkColor( COLORREF crColor/文本背景色 );,设置文本对齐方式,UNIT C
12、DC:SetTextAlign( UINT nFlags/文本对齐标志 );,设置文本背景模式,int CDC:SetBkMode( int nBkMode/背景模式标志 );,二、设置字体,Windows支持光栅字体、矢量字体和TrueType等3种类型的字体。,BOOL CFont:CreatePointFont( /字体高度(单位为1/10磅,1磅1/72英寸,1英寸96像素) int nPointSize, LPCTSTR lpszFaceName,/字体名称 CDC* pDC = NULL/CDC对象指针 );,BOOL CFont:CreateFontIndirect( const
13、 LOGFONT* lpLogFont/LOGFONT结构指针 );,typedef struct tagLOGFONT LONG lfHeight;/以逻辑单位表示的字体高度 LONG lfWidth;/以逻辑单位表示的字体平均宽度 LONG lfEscapement;/文本行相对页面底端的倾斜度 LONG lfOrientation;/字符基线相对页面底端的倾斜度 LONG lfWeight;/字体粗细,取 01000 之值 BYTE lfItalic;/为真时表示创建斜体字体 BYTE lfUnderline;/为真时表示创建带下划线的字体 BYTE lfStrikeOut;/为真时表示
14、创建带删除线的字体 BYTE lfCharSet;/指定字体所属字符集 BYTE lfOutPrecision; /指定字符输出精度 BYTE lfClipPrecision; /指定裁剪精度 BYTE lfQuality;/指定输出质量 BYTE lfPitchAndFamily; /指定字体间距和所属的字库族 TCHAR lfFaceNameLF_FACESIZE; /指定所用字体名 LOGFONT;,BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE
15、bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );,三、常用文本输出函数,virtual BOOL CDC:TextOut( int x,/文本起点的X逻辑坐标 int y,/文本起点的Y逻辑坐标 LPCTSTR lpszString,/字符串指针 int nCount/字符串中的字节数 );,BOOL CDC:TextOut(
16、int x, /文本起点的X逻辑坐标 int y, /文本起点的Y逻辑坐标 const CString, 在指定位置输出文本,virtual int CDC:DrawText( LPCTSTR lpszString,/字符串指针 int nCount,/字符串中的字节数 LPRECT lpRect,/RECT结构或CRect对象指针 UINT nFormat/格式化文本的方法 );,int CDC:DrawText( const CString, 在矩形区域内输出文本(支持换行符“n”),常用格式化文本的方法,可以是下列值的任意组合。,CClientDC dc(this); CFont *pF
17、ontOld, fontNew; fontNew.CreatePointFont(720, 隶书);/创建字体 pFontOld=(CFont*)dc.SelectObject(/恢复系统原来的字体,创建和使用字体示例代码。,5 位图,一、概述,位图是一个由位构成的图像,它是由一系列0和1排列而成的点阵结构。位图中每一个像素点由位图文件中的一位或者多位数据表示,整个位图的信息被细化为每个像素的属性值。 Windows支持两种不同形式的位图:设备相关位图(Device Dependent Bitmap,DDB)和设备无关位图(Device Independent Bitmap,DIB)。,二、位
18、图操作函数,BOOL CBitmap:LoadBitmap( UINT nlDResource/位图资源标识 );,BOOL CBitmap:LoadBitmap( LPCTSTR lpszResourceName/位图资源名称 );,1.创建DDB 从资源创建位图,BOOL CBitmap:CreateCompatibleBitmap( CDC* pDC,/设备环境指针 int nWidth,/位图的宽度(以像素数为单位) int nHeight/位图的高度(以像素数为单位) );, 创建与指定设备环境兼容的位图,2. 输出位图 从源设备环境拷贝位图到当前设备环境。,BOOL CDC:Bit
19、Blt( int x,/目标矩形左上角的逻辑x坐标 int y,/目标矩形左上角的逻辑y坐标 int nWidth,/目标矩形的宽度(逻辑单位) int nHeight,/目标矩形的高度(逻辑单位) CDC* pSrcDC,/源CDC对象的指针 int xSrc,/源位图左上角的逻辑X坐标 int ySrc,/源位图左上角的逻辑Y坐标 DWORD dwRop/要执行的光栅操作 );,BOOL CDC:StretchBlt( int x,/目标矩形左上角的逻辑x坐标 int y,/目标矩形左上角的逻辑y坐标 int nWidth,/目标矩形的宽度(逻辑单位) int nHeight,/目标矩形的
20、高度(逻辑单位) CDC* pSrcDC,/源CDC对象的指针 int xSrc,/源位图左上角的逻辑X坐标 int ySrc,/源位图左上角的逻辑Y坐标 int nSrcWidth,/源矩形的宽度(逻辑单位) int nSrcHeight,/源矩形的高度(逻辑单位) DWORD dwRop/要执行的光栅操作 );, 从源设备环境拷贝位图到当前设备环境(可伸缩)。,3. 获取位图信息,int CBitmap:GetBitmap( BITMAP* pBitMap/BITMAP结构指针 );,typedef struct tagBITMAP int bmType;/位图的类型 ,必须为0 int bmWidth;/位图的宽度(以像素为单位) int bmHeight;/位图的高度(以像素
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宣化科技职业学院《劳动与社会保障法》2025-2026学年期末试卷
- 2026道德与法治四年级拓展空间 消防安全法规
- 义诊健康宣教服务-1
- 2024年公司食堂工作总结
- 2021年武汉枫叶学校小升初语文模拟题及答案
- 2024年《济南的冬天》教案课件
- 2021年开放本科现代管理专题模拟题一
- 氰(CAS号:460-19-5)理化性质与危险特性一览表
- 职业病防治法健康科普
- 质量、环境、职业健康安全管理体系试卷(普工)
- 招5人!海南州2026年第一季度公开招录编外临聘人员建设笔试模拟试题及答案解析
- 呼吸抢救室工作制度
- 2026中国邮政储蓄银行黑龙江省分行春季校园招聘考试参考试题及答案解析
- 2026云南省投资控股集团有限公司集中招聘笔试参考题库及答案解析
- BCG -2026效率之后中国医药创新的价值攀登研究报告
- 配件采购流程制度
- 2026年安全生产风险预防与应对培训试卷及答案
- 2026年春江酒城嘉苑“楼上养老 楼下医疗”CCRC社区运营模式解析
- 继电保护员道德知识考核试卷含答案
- 人教版(2026)三年级下册美术第三单元第1课《皮影的生命力》课件
- 2026年国际对外汉语考试题库及答案
评论
0/150
提交评论