420 likes | 659 Views
第 8 章 图形处理. 本章主要介绍以下内容: ( 1 )绘图。 ( 2 )位图。 ( 3 )光标。 ( 4 )图标。 ( 5 )图形设备。. 8.1 绘图. 8.1.1 绘图设置 8.1.2 绘图工具. 8.1.1 绘图设置. 1. 绘图模式 2. 设置绘图模式的程序. 8.1.1 绘图设置. 1. 绘图模式 绘图模式指定如何将画笔颜色和被填充对象的内部颜色与显示设备上的颜色相结合。默认绘图模式为 R2_COPYPEN , Windows 简单地将画笔颜色复制到显示设备上。
E N D
第8章 图形处理 • 本章主要介绍以下内容: • (1)绘图。 • (2)位图。 • (3)光标。 • (4)图标。 • (5)图形设备。 民政学院软件学院 蒋国清
8.1 绘图 • 8.1.1 绘图设置 • 8.1.2 绘图工具 民政学院软件学院 蒋国清
8.1.1 绘图设置 • 1. 绘图模式 • 2. 设置绘图模式的程序 民政学院软件学院 蒋国清
8.1.1 绘图设置 • 1. 绘图模式 • 绘图模式指定如何将画笔颜色和被填充对象的内部颜色与显示设备上的颜色相结合。默认绘图模式为R2_COPYPEN,Windows简单地将画笔颜色复制到显示设备上。 • 要改变绘图模式,需要调用CDC类的SetROP2()函数。SetROP2()的函数原型为: • int SetROP2( int nDrawMode ); • 函数成功则返回调用前的绘图模式。 民政学院软件学院 蒋国清
8.1.1 绘图设置 • 2. 设置绘图模式的程序 • 本程序用16种绘图模式在白色背景下画直线,以便对比不同的绘图模式。程序建立的步骤如下: • (1)利用AppWizard建立一个名字为ROP的单文档程序。 • (2)修改CROPView类的OnDraw()函数 。 民政学院软件学院 蒋国清
8.1.1 绘图设置 • (3)编译运行应用程序,运行效果如下图所示。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • Visual C++中的绘图工具包括 : • 画笔(CPen) 画刷(CBrush) • 字体(CFont) 位图(CBitmap) • 调色板(CPalette) 区域(CRgn) • 本小节只介绍其中的画笔(CPen)、画刷(CBrush)、字体(CFont)和区域(CRgn)。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 1. 画笔 • 画笔是Windows用来绘制各种直线和曲线的一种图形工具,它可以分为修饰画笔和几何画笔两种类型。在VC++中,用MFC的CPen类封装了画笔以及与其相关的操作函数。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 1)画笔的分类 • (1)修饰画笔。 • 应用程序调用CreatePen()、CreatePenIndirect()和ExtCreatePen()函数来建立一种修饰画笔。 • (2)几何画笔。 • 应用程序通过调用ExtCreatePen()函数建立几何画笔。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 2)画笔的创建 • (1)用带参数的构造函数创建画笔。 • (2)用CreatePen()创建画笔。 • (3)用CreatePenIndirect()创建画笔。 • (4)用Fromhandle()创建画笔对象。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 3)CPen类的属性函数 • 总共有7中属性来定义画笔的类型和特点,这些属性是宽度、风格、颜色、模式、阴影、端点风格和结合方式。修饰画笔和几何画笔有宽度、风格和颜色属性,而只有几何画笔才有模式、阴影、端点风格和几何方式属性。模式和阴影通常是画刷的属性,但也可以用于几何画笔。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 3)CPen类的属性函数 • CPen类有3个属性相关函数,分别是operator HPEN()、GetLogPen()和GetExtLogPen()。 • operator HPEN()函数没有参数,调用后返回CPen对象Windows GDI画笔句柄。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 4)使用画笔实例 • 本实例用LOGPEN创建常见风格的画笔,便于对比。实例的创建步骤如下: • (1)利用AppWizard建立一个名字为pen的单文档程序。 • (2)修改CPenView类的OnDraw()函数。 • (3)编译运行应用程序,效果如图7-2所示。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 4)使用画笔实例 • 图7-2 画笔的使用 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 2. 画刷 • 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制。画刷比画笔的内容更加丰富。在VC++中,用MFC的CBrush类封装了画刷以及与其相关的操作函数。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 2. 画刷 画刷分两类: • 逻辑的 • 物理的。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 逻辑画刷是应用程序用来画图的理想位图。 • 1)逻辑画刷的类型 • 逻辑画刷分为4种类型: • 实画刷 库存画刷 • 阴影画刷 模式画刷。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 2)CBrush类的成员函数 • CBrush类封装了Windows GDI的画刷对象,并提供了对画刷的相关操作的函数。(1)CBrush()。 • (2)CreateSolidBrush()。 • (3)CreateHatchBrush()。 • (4)CreateBrushIndirect()。 • (5)CreatePatternBrush()。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 3)画刷使用实例 • 本实例创建了实画刷、图案画刷和不同风格的阴影画刷,实例的创建步骤如下:(1)利用AppWizard建立一个名字为brush的单文档应用程序。 • (2)修改CBrushView类的OnDraw()函数。 • (3)编译运行应用程序,效果如图7-3所示。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 3)画刷使用实例 • 图7-3 画刷的使用 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 3. 字体 • 内容介绍: • 1)使用库存字体 • 2)创建用户字体 • 3)获取字符属性 • 4)使用字体实例 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 1)使用库存字体 • Windows支持6种库存字体 • 使用库存字体需要调用函数SelectStockObject()。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 2)创建用户字体 • 创建字体用得最多的是CFont类的成员函数: • 1.CreateFont() • 2.CreateFontIndirect()。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 3)获取字符属性 • 要获取当前字体的完整描述,要用到CDC类的成员函数GetTextMetrics(),其原型为: • BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const; • 函数成功返回非0,否则返回0值。其中,参数lpMetrics是指向TEXTMETRIC结构的指针。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 4)使用字体实例 • 本实例输出多行高度不等的文字,行的间距根据字体的高度决定。实例的创建步骤如下: • (1)利用AppWizard建立一个名字为Font的单文档程序。 • (2)修改CFontView类的OnDraw()函数,代码如课本程序代码8.4所示。 • (3)编译运行应用程序,效果如图7-4所示。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 4)使用字体实例 • 图7-4 使用字体 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 4. 区域 • 一个区域是指一个矩形、多边形、椭圆形,或者两个及两个以上的图形的组合图形,它可以被填充、涂色、反转、套框,用来执行击中测试(测试光标的位置)。在VC++中,用MFC的CRgn类封装了区域以及与其相关的操作函数。 民政学院软件学院 蒋国清
8.1.2 绘图工具 • 1)类CRgn的成员函数 类CRgn封装了GDI的区域对象,并提供了创建与操作区域的相关函数。 • 2)区域的建立 建立区域需要用到CRgn类的相关函数, • 3)区域的操作 对区域的操作包括区域的组合、比较、涂色、把区域内部反向、套框、检索限定矩形和击中测试等。 民政学院软件学院 蒋国清
8.2 位图 • 位图可认为是一个数组,记录了每一个像素点的颜色。位图分为依赖于设备的位图DDB(Device-Dependent Bitmap)和与设备无关的位图(Device-Independent Bitmap)两种类型。 • 本节主要介绍DDB位图的相关操作。 民政学院软件学院 蒋国清
8.2.1 位图的装载和建立 • 学习要点: • 1. 装载预定义位图 • 2. 从资源中装载位图 • 3. 用函数创建位图 民政学院软件学院 蒋国清
8.2.1 位图的装载和建立 • 1. 装载预定义位图 • 装载预定义位图的函数是LoadOEMBitmap(),其原型如下: • BOOL LoadOEMBitmap( UINT nIDBitmap ); • 其中,参数nIDBitmap标识系统预定义的位图ID号 民政学院软件学院 蒋国清
8.2.1 位图的装载和建立 • 2. 从资源中装载位图 • 把位图资源导入到VC++环境,或者自己用VC++的位图编辑器创建了位图后,就可以用函数LoadBitmap()把位图资源装载到应用程序中使用。 民政学院软件学院 蒋国清
8.2.1 位图的装载和建立 • 3. 用函数创建位图 用MFC函数创建位图的基本过程位: • (1)创建与当前设备描述表兼容的空白位图。 • (2)创建与位图兼容的内存设备描述表对象。 • (3)将位图选入内存设备描述表对象。 • (4)在内存设备描述表对象绘图。 民政学院软件学院 蒋国清
8.2.2 位操作 • CDC类提供了3个成员函数用于位操作,可以用这3个函数在设备描述表对象中传送数据或从一个设备描述表对象传送数据到另一个设备描述表对象。 • 分别是: • PatBlt() • BitBlt() • StetchBlt()。 民政学院软件学院 蒋国清
8.2.2 位操作 • 1. PatBlt() • PatBlt()函数的原型为: • BOOL PatBlt( int x, int y, int nWidth, int nHeight, DWORD dwRop ); • 该函数在指定的设备上产生一种位模式,该位模式是设备上已有的模式与所选定的画刷的组合。参数x和y用于确定矩形区域的左上角坐标,nWidth和nHeight是区域的宽度和高度,参数dwRop指定光栅操作码,此操作码决定了怎样组合该位模式。 民政学院软件学院 蒋国清
8.2.2 位操作 • 2. BitBlt() • BitBlt()函数从一个特定的设备将位图复制到显示设备上,其原型为: • BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); • 函数将设pSrcDC备上的源位图从左上角坐标xSrc 、ySrc开始的区域,复制到左上角坐标为x、y,尺寸为nWidth、nHeight的区域中。dwRop是光栅操作码 。 民政学院软件学院 蒋国清
8.2.2 位操作 • 3. StretchBlt() • StretchBlt()函数能够执行所有用BitBlt()可以执行的操作。此外,还可以用该函数来改变图形数据快的大小,例如扩展或缩小数据块(在水平方向、垂直方向或同时两个方向)。StretchBlt()函数的原型为: • 1BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop ); • 该函数可以同时指定源数据块和目标数据块的大小。 民政学院软件学院 蒋国清
8.2.3 显示位图的例子 • 本例子首先导入一幅位图到VC++6.0编程环境中,然后在程序中装载位图,最后调用BitBlt()函数显示位图。例子的创建步骤如下: • (1)利用AppWizard建立一个名字为bitmap的单文档程序。 • (2)修改CBitmapView类的OnDraw()函数,代码如课本程序代码8.5所示。 • (3)编译运行应用程序,效果如图7-5所示。 民政学院软件学院 蒋国清
8.2.3 显示位图的例子 图7-5 显示位图 民政学院软件学院 蒋国清
8.3 光标 • 光标是指鼠标运动位置的特殊图形,也称鼠标指针,它浮动于窗口内容之上。在通常情况下,光标的外形是一个箭头,当把光标移动到窗口边缘时,光标就变为双箭头形状,表示此时按下鼠标,就可以拖动窗口边框,从而改变窗口尺寸;当系统正忙于运行,不能立即对用户输入做出响应时,光标可能变为漏斗形状。由此可见,光标的外形能够反映一定的信息。 民政学院软件学院 蒋国清
8.3 光标 • 8.3.1 创建光标 • 8.3.2 编辑光标 • 8.3.3 使用光标 民政学院软件学院 蒋国清
8.3.1 创建光标 • 创建光标有两种方法: • 1. 从菜单新建光标 • 2. 从资源面板新建光标 民政学院软件学院 蒋国清