320 likes | 536 Views
Visual C++ 程序设计. 武汉职业技术学院计算机科学系. 万 彪 2004.12. 第七章 图形设备接口与绘图. 本 章 内 容. 1 、图形设备接口及其基本概念. 2 、 GDI 绘图对象及其管理. 3 、映射模式. 4 、绘制图形. 5 、绘制文本. 7.1 图形设备接口及其基本概念. 7.1.1 图形设备接口概念 7.1.2 设备环境 7.1.3 设备环境类. 7.1.1 图形设备接口. Windows 图形设备接口 (GDI ) 是为与 设备无关 的图形设计的。所谓 设备的
E N D
Visual C++程序设计 武汉职业技术学院计算机科学系 万 彪 2004.12
第七章 图形设备接口与绘图 本 章 内 容 1、图形设备接口及其基本概念 2、GDI绘图对象及其管理 3、映射模式 4、绘制图形 5、绘制文本
7.1 图形设备接口及其基本概念 7.1.1 图形设备接口概念 7.1.2 设备环境 7.1.3 设备环境类
7.1.1 图形设备接口 Windows图形设备接口(GDI)是为与设备无关的图形设计的。所谓设备的 无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户 编程时无需考虑特殊的硬件设置。 为了无缝地支持一批范围很广的图形输出设备,Windows抽象了图形绘制的 过程。即抽象为图形设备接口(GDI)形式,是一种以通常方法进行绘图的可 编程接口。 GDI层次结构图:
7.1.1 图形设备接口 GDI负责系统与用户或绘图程序之间的信息交换,并控制 在输出设备上显示图形或文字, 是Windows系统的重要组成 部分。 利用GDI和Windows设备驱动程序 Windows 开发人员只要建 立与输出设备的 关联,让系统加 载相应的设备驱 动程序即可 支持与设备无关的图形
7.1.2 设备环境 设备环境(DC)是一个用来确定任何设备的GDI输出的位置和形象的属性的集合。应用程序并不能直接存取DC,但是应用程序可以使用DC的句柄来间接地存取DC及其属性。当程序为DC要求一个句柄时,就将创建一个DC。创建的DC包含了它所有的属性和默认值,应用程序可以修改这些属性。 为了确保图形输出的设备无关性,Windows系统不允许 用户直接访问外部设备,而是提供统一的设备环境 (DC——Device Context)使应用程序与外部设备相连。 程序员可以把DC当作一个可在上面作画的抽象的画布。这种抽象对于便利地实现绘图的设备无关性很有必要。
7.1.3 设备环境类CDC CDC有三个派生类:CClientDC、CCindowDC、CCaintDC。CDC类和它的派生类只有构造函数和析构函数不同。 使用MFC编程时,GDI大部分的功能都被压缩到了一个单独的MFC类中。这个类就是CDC。CDC是设备环境的基类,它代表了一个抽象的图形画布(DC),并为实现覆盖面很广的图形操作提供了大量的成员函数。利用CDC类可以画出如直线、矩形、椭圆等基本图形,另外还有纯文本。
7.1.3 设备环境类CDC CClientDC类管理一个同窗口用户区相关联的设备环境。用户 只能在窗口的用户区绘图。 1、CClientDC 2、CWindowDC CWindowDC类管理着一个同整个窗口关联的设备环境,包括它的边框和控件。用户可以在显示器的任意位置绘图。 3、CPaintDC CPaintDC类和WM_PAINT消息相关联,当某一窗口需要绘图时,这个消息便被发送给这个窗口。这个类的对象通常在OnPaint()函数中使用。
7.1.3 设备环境类CDC内容 • GDI绘图工具:GDI绘图对象有位图(CBitmap)、画刷(CBrush)、画笔(CPen)、调色板(CPalette)、字体(CFont)等。CDC使用函数SelectObject()选择绘图工具。 • 映射方式:在窗口中绘图时,除了使用设备坐标外,大多数情况下要使用逻辑坐标,以利于绘图操作的设备无关性和图形的不同比例的显示。 • 绘图状态管理和绘图操作:绘图状态一般包括背景色、前景色、线宽、线型、填充模式、裁减区域、字体、字号等。在CDC中可以设置大部分的绘图状态。MFC中的绘图操作都封装在CDC中。
第七章 图形设备接口与绘图 本 章 内 容 1、图形设备接口及其基本概念 2、GDI绘图对象及其管理 3、映射模式 4、绘制图形 5、绘制文本
7.2.1 建立设备环境 获取设备环境是应用程序输出图形的先决条件,常用的几种方法如下: 1、直接从OnDraw函数获取 从视图类的OnDraw()成员函数显示图形,只要将设备环境指针传到函数种即可。OnDraw函数的参数pDC既是指向CDC的指针 2、申请设备环境 在需要输出时,直接申请设备环境,及直接声明一个设备环境类的对象。如:CCclientDC dc(this);//用于在用户区内绘图 另外一种常用方法,在消息处理函数OnPaint()中 例:afx_msg void CMainFrame::OnPaint(){ CPaintDC dc(this);
7.2.1 建立设备环境 3、调用GetDC函数 也可以通过使用CWnd::GetDC成员函数获得设备环境指针,其形式为: hdc=GetDC(hwnd); 由GetDC()函数获得的设备环境必须用ReleaseDC函数释放,其原型为: void ReleaseDC(HWND hwnd); 注意:在构造一个CDC对象之后,对它处理完后,及时删除它 时很重要的。Windows限制了可用设备环境的数量。一般情况下 由系统自动调用析构函数删除,但有时需自己释放,如GetDC 和ReleaseDC的使用。
7.2.2 GDI对象 Windows GDI对象类型通过MFC库类来表示。CGdiObject是GDI对象类的一个抽象的基类。Windwos GDI对象由CGdiObject派生类的对象表示。下面是一系列的GDI派生类: CPen:画笔是绘制直线和绘制边框的工具。用以可以规定一个笔的颜色和粗细,以及是绘制实线、点线,还是虚线。 CBrush:画刷定义象素的位图模式。利用它可以对区域内部填充颜色. CFont:字体是特定字样和特定大小的全部字符的集合。字体通常作为资源存储在磁盘上,并且有一些字体依赖于设备。 CRgn:区域是由多边形、椭圆或者二者的组合范围。可以使用区域来填充、裁减以及鼠标点中操作。 CPalette:调色板是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的情况下充分利用输出设备的颜色描绘能力。 CBitmap:位图是位的矩阵,每一个显示象素都对应于其中的一个或多个位,用户可以利用位图来表示图形,也可以用它来创建画刷。
7.2.2 GDI对象——CPen类 创建新画笔,形式如下: hP=CreatePen ( int nPenStyle,//确定画笔样式 int nWidth, //画笔宽度 COLORREF rgbColor//画笔颜色 ); PS_DASH: 虚线 PS_DASHDOT:点划线 PS_DASHDOTDOT:双点划线 PS_DOT: 点线 PS_INSIDEFRAME:实线 PS_NULL: 无 PS_SOLID: 实线 创建画笔后,必须调用SelectObject函数将其选入设备环境 SelectObject(hdc,hP); //hP为所创建或获取的画笔句柄 不再使用当前画笔时,需删除画笔,以免占内存 DeleteObject(hP);
7.2.2 GDI对象——CBrush类 HS_BDIAGONAL 45度从左上到右下 HS_DIAGCROSS 45度叉线 HS_FDIAGONAL 45度从左下到右上 HS_CROSS 垂直相交的阴影线 HS_HORIZONTAL 水平阴影线 HS_VERTICAL 垂直阴影线 (1)创建画刷 hBr=CreateHatchBrush (int nHctchStyle, COLORREF rgbColor ); (2) 选入设备环境 创建画刷后, 通过SelectObject(hdc,hBr);将其选入设备环境 (3) 删除画刷 不使用画刷时,可用DeleteObject(hBr);删除画刷,释放内存
7.2.3 Windows颜色映射 Windows GDI提供了一个独立于硬件的颜色接口。应用程序只需提供绝对的颜色代码,GDI会自动将该代码对应的颜色或颜色组合方式映射到视图上。 标准视频图形阵列(VGA)显示卡使用18位颜色的寄存器,因此有一个262144种颜色的调色板。然后,由于显存的限制,标准VGA卡采用4色代码,这意味着一次只能显示16种颜色。因为Windows对标题、边框、滚动条等需要固定的颜色,程序就可以只使用16种“标准”的纯色。 每一种Windows颜色由8位的“红”、“绿”和“蓝”值的组合来表示。16位标准VGA“纯”颜色如书131面表中给出。 例: CBrush brush(RGB(0,0,0); //用黑色构造一个画刷 在OnDraw中函数中把文本背景设置成红色; pDC->SetBkColor(RGB(255,0,0);
7.2.3 Windows颜色映射 Windows使用宏RGB定义绘图的颜色,其形式为: RGB(nRed, nGreen,nBlue) RGB(0,0,255) 蓝色值 RGB(0,255,0) 绿色值 红色值 RGB(255,0,0)
第七章 图形设备接口与绘图 本 章 内 容 1、图形设备接口及其基本概念 2、GDI绘图对象及其管理 3、映射模式 4、绘制图形 5、绘制文本
屏幕坐标系统 窗口坐标系统 用户区坐标系统 7.3 映射模式 窗口:对应逻辑坐标系上程序员设定的区域 视口:对应实际输出设备上程序员设定的区域 坐标映射模式就是指逻辑坐标系和设备坐标系在相互转换时,逻辑单位和设备单位之间存在的某种比例关系。 映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况 逻辑坐标系统 坐标系统 设备坐标系统
7.3 映射模式 按照窗口和视口的坐标比例进行映射 将窗口中的对称图形映射到视口时仍为对称图形 缺省的映射模式
7.3 映射模式 应用程序可获取设备环境的当前映像模式,并根据需要设置映像模式。 设置设备环境的映像模式 SetMapMode(hdc,nMapMode);nMapMode为映像模式的整型标识符 相关 函数 获取当前设备环境的映像模nMapMode=GetMapMode(hdc);
第七章 图形设备接口与绘图 本 章 内 容 1、图形设备接口及其基本概念 2、GDI绘图对象及其管理 3、映射模式 4、绘制图形 5、绘制文本
7.4 图形绘制 图元是任何一个图形系统的基础。Windows GDI支持广泛的图元。可以使用CDC对象绘制图元。每一个图元的绘制使用的都是系统当前的画笔。画笔是CDC对象的一个属性,当前画笔定义了绘制图元时使用的颜色以及线条宽度。下面列出了使用CDC对象可以绘制的主要图元。 • 使用CDC对象可以绘制的图元有: • Line(直线) • Rectangle(矩形) • Elipse(椭圆) • Polygon(多边形) • Pie(饼图) • Arc(弧)
7.4 图形绘制——直线 绘制直线要使用MoveTo()和LineTo()成员函数,这项操作必须以图形的当 前位置作为直线的起点。 MoveTo()成员函数有两个版本,参数分别是表示当前位置的一个整数对和一个POINT结构。其返回值都是当前位置的CPoint对象。 CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); LineTo()成员函数也有两个版本,参数分别是指定位置的一个整数对和一个POINT结构。若画线成功,其返回值为TRUE,否则返回值为FALSE。 BOOL LineTo(int x,int y); BOOL LineTo(POINT point);
7.4 图形绘制——矩形、椭圆 绘制矩形要使用Rectangle()成员函数 此函数两版本间唯一不同在于:一个接受指定矩形左上和右下角坐标的两个整数对为参数,而另一个所接受的参数是指向一个RECT结构的指针。 BOOL Rectangle(int x1,int y1,int x2,int y2); BOOL Rectangle(LPCTECT lpRect); 椭圆是使用Ellipse()成员函数绘制的。这个函数同Rectangle()成员函数非常想象,也有两种形式 每个Ellipse()函数中指定的矩形代表所绘制椭圆的外接矩形。 BOOL Ellipse(int x1,int y1,int x2,int y2); BOOL Ellipse(LPCTECT lpRect);
第七章 图形设备接口与绘图 本 章 内 容 1、图形设备接口及其基本概念 2、GDI绘图对象及其管理 3、映射模式 4、绘制图形 5、绘制文本
先要获得文本句柄 文本操作 设置字体、字符大小、字符颜色等有关属性 将这些属性选入设备环境 7.5 绘制文本 图形和文本并 没有明显的界限 使用定义好的与设备无关的字体集, Windows就能维护它的设备无关性,提供“所见即所得”的好处,即屏幕所见与设备输出的文本是一样的 Windows经常使用GDI进行文本输出。在一定意义上,任何内容都可以看成图形实体
7.5 绘制文本——字体 字体 字体:描述所要显示的文本的大小、类型和外形 物理字体是为特殊设备设计的,因而是设备相关的 逻辑字体定义的字符集是设备无关的,它可以精确标度,因此得到广泛应用 Win系统提供了七种基本字体,见下表: 字体 说明 ANSI_FIXED ANSI标准的固定宽度的字体 ANSI_VAR ANSI标准的可变宽度的字体 DEFAULT_GUI 当前GUI的缺省字体 OEM_FIXED 由标准原设备制造商(OEM)提供 DEVICE_DEFAULT当前图形设备的字体 SYSTEM_FIXED Windows的标准固定宽度的字体 SYSTEM Windows提供的可变宽度的字体 常作为缺省字体 Win用它作为 系统界面字体
7.5 绘制文本——选择系统字体 (2) 调函数GetStockObject获得系统字体句柄 它返回的是系统的缺省字体 font.GetStockObject( ); (1) 构造CFont类对象: CFont font; 选择系统字体的步骤 (3) 调用函数SelectObject将字体选入 设备环境 font.SelectObject(&font);
7.5 绘制文本——创建自定义字体 若需要定义系统以外的字体,可以调用函数GreateFont自行创建 HFont=CreateFont • (int nHeight, //字体高度,0采用系统缺省值,使用逻辑单位 • int nWidth, //字体宽度,取0则由系统根据高宽比取最佳值 • int nEscapement, //每行文字相对于页底的角度,单位为0.1度 • int nOrienation, //每个文字相对于页底的角度,单位为0.1度 • DWORD nWeight, //字体粗细度,范围为0~1000 • DWORD Dwltalic, //如果要求字体倾斜,则取非零 • DWORD dwUnderline, //如果要求下划线,则取非零 • DWORD dwStrikeout, //如果要求中划线,则取非零 • DWORD dwCharset, //字体所属字符集 • DWORD dwOutputPrecision, //输出精度,一般取缺省值OUT_DEFAULT_PRECIS • DWORD dwClipPrecision, //剪裁精度,常取缺省值CLIP_DEFAULT_PRECIS • DWORD dwQuality, //输出质量,一般取缺省值 • DEFAULT_QUALITY • DWORD dwPitchAndFamily, //字体间距 • LPCTSTR lpszFacename //指向字符串的指针,确定字体名 • )
7.5 绘制文本——设置字体和背景颜色 字体及背景颜色的设置在开发过程中非常重要 设置字体颜色:SetTextColor(hdc,crColor); 设置背景颜色:SetBkColor(hdc,crColor); crColor为设置的颜色
7.5 绘制文本——文本输出 常用的文本输出函数TextOut原型如下: BOOL TextOut ( int X, int Y, //X, Y为用户区中字符串的起始坐标 LPCTSTR lpstring, //lpstring为显示的字符串 int nCount //nCount为字符串中的字节数 ); TextOut以坐标X,Y为起点, 输出字节数为 nCount、 名为lpstring中的字符串