第6章图像编程与文字处理.ppt

上传人:本田雅阁 文档编号:3431664 上传时间:2019-08-24 格式:PPT 页数:29 大小:430.04KB
返回 下载 相关 举报
第6章图像编程与文字处理.ppt_第1页
第1页 / 共29页
第6章图像编程与文字处理.ppt_第2页
第2页 / 共29页
第6章图像编程与文字处理.ppt_第3页
第3页 / 共29页
第6章图像编程与文字处理.ppt_第4页
第4页 / 共29页
第6章图像编程与文字处理.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《第6章图像编程与文字处理.ppt》由会员分享,可在线阅读,更多相关《第6章图像编程与文字处理.ppt(29页珍藏版)》请在三一文库上搜索。

1、第6章 图像编程与文字处理 精雕细琢,美化应用程序,教学内容 6.1 图形设备接口 6.2 常用绘图函数 6.3 绘图工具 6.4 字体与文字处理 6.5 位图 6.6 综合实例建立宾馆管理系统的启动界面 6.7 小结 思考与练习,6.1 图形设备接口,6.1.1 设备环境类 在Windows程序中,应用程序的输出并不直接面向物理的设备,如显示屏或打印机,而是针对一个称之为设备环境(Device Context)的逻辑设备进行操作,设备环境与实际设备之间的信息传送由Windows直接管理。 在MFC应用程序中,所有的绘制调用均通过相应的设备环境对象实现,设备环境对象封装了相应的Windows

2、API功能,由一个32位的HDC类型句柄标识。在MFC类库中,用CDC类封装设备文本对象。,6.1 图形设备接口,6.1.1 设备环境类 1、设备环境类(CDC) CDC类直接继承自CObject类,它是设备上下文对象的基类。CDC基类定义了设备描述表对象,并且提供在显示器、打印机或Windows用户区上绘图的方法,它封装了使用设备环境的GDI函数。 所有的绘图操作都是直接或间接运用了CDC的成员函数,这些函数有的进行设备描述表操作,有的是用来画图的,还有的函数是用来获取或设置绘图属性,为映像和视图服务的。 2、派生类CPaintDC CPaintDC是从CDC派生出来的设备描述表类,它常常在

3、窗口的OnPaint函数中使用。查看MFC的源代码(StudioVC98MFCSRCviewcore.cpp)中的OnPaint函数的实现可以知道,OnPaint函数首先构造一个CPaintDC对象,再调用OnPrepareDC()函数将其准备好,最后以这个准备好的CPaintDC对象指针为参数,来调用OnDraw函数进行各种图形处理。,6.1 图形设备接口,6.1.1 设备环境类 3、派生类CClientDC(管理客户区) CClientDC类只能在客户区绘图。所谓客户区是指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等以外的部分,它是用户可以操作的区域。例如打开Word文档将是将某个

4、.doc文件显示在其客户区域中。在使用CClientDC进行绘图时,一般要调用GetClientRect函数来获取客户区域的大小。 4、派生类CWindowDC(管理框架窗口) CWindowDC类直接从CDC派生,它使调用和释放整个窗口(包括客户区和非客户区)的设备环境过程自动化。CWindowDC对象在构造时调用Windows API函数GetWindowDC, 在析构时调用相应的API函数ReleaseDC,这意味着CWindowtDC对象可访问CWnd所指向的整个屏幕区域。,6.1 图形设备接口,6.1.2 使用GDI对象 在选择GDI对象进行绘图时,往往遵循着下列的步骤: (1) 在

5、堆栈中定义一个GDI对象(如CPen、CBrush对象),然后用相应的函数(如CreatePen、CreateSolidBrush)创建此GDI对象。 (2) 将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来。 (3) 绘图结束后,恢复当前设备环境中原来的GDI对象。 (4) 由于GDI对象是在堆栈中创建中,当程序结束后,框架会自动删除程序创建的GDI对象。,6.1 图形设备接口,6.1.3 坐标映射 Windows的GDI(graphics device interface)支持两种坐标系,即逻辑坐标系和物理坐标系,分别连接应用程序和图形物理设备。物理坐标是指物理设

6、备的坐标系,它的单位是真正的长度单位,有英寸(in)和毫米(mm)两种,它的原点在屏幕的左上角,X轴向右递增,Y轴向下递增。逻辑坐标指的是在窗口下的坐标,逻辑坐标的单位是逻辑像素。 在Windows系统中,总共有三种物理坐标(又叫设备坐标),分别是屏幕坐标、用户区坐标、全窗口坐标。 1客户区坐标系统:客户区坐标系统是最常见的坐标系统,以窗口客户区左上角为原点(0,0),主要用于窗口客户区绘图输出以及处理窗口的一些消息。鼠标消息WM_LBUTTONDOWN、WM_MOUSEMOVE传给框架的消息参数以及CDC一些用于绘图的成员都是使用客户区坐标。 2屏幕坐标系统:屏幕坐标系统是另一类常用的坐标系

7、统,以屏幕左上角为原点(0,0)。一些与窗口客户区不相关的函数均以屏幕坐标为单位,例如设置和取得光标位置的函数SetCursorPos()和GetCursorPos();由于光标可以在任何一个窗口之间移动,它不属于任何一个单一的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。另外,CreateWindow()和MoveWindow()等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。 3窗口坐标系统:窗口坐标系统以窗口左上角为坐标原点,它包含了窗口控制菜单、标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种坐标系统很少使用。,6.1 图形设备接口,6.1.4 与绘图有关的

8、类和结构 在图形绘制操作中,常常需要使用MFC中的CPoint、CSize和CRect等简单数据类由于CPoint(点)、CSize(大小)和CRect(矩形)是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示: typedef struct tagPOINT LONG x; / 点的x坐标 LONG y; / 点的y坐标 POINT; typedef struct tagSIZE LONG cx; /矩形的长度 LONG cy; /矩形的宽度 SIZE; typedef struct tagRECT LONG left; / 矩形左

9、上角点的x坐标 LONG top; / 矩形左上角点的y坐标 LONG right; / 矩形右下角点的x坐标 LONG bottom; / 矩形右下角点的y坐标 RECT;,6.2 常用绘图函数,6.2.1 画点与画线 1、画点 画点是最基本的绘图操作之一,它是通过调用CDC:SetPixel或CDC:SetPixelV 函数来实现的。这两个函数都是用来在指定的坐标上设置指定的颜色,只不过SetPixelV函数不需要返回实际像素点的RGB值;正是因为这一点,函数SetPixelV要比SetPixel快得多。 COLORREF SetPixel( int x, int y, COLORREF

10、crColor ); COLORREF SetPixel( POINT point, COLORREF crColor ); BOOL SetPixelV(int x, int y, COLORREF crColor); BOOL SetPixelV( POINT point, COLORREF crColor ); 其中参数point指定所绘制的点,crColor指定画点所用的颜色。倘若要在屏幕的(100,100)处画一个红色点,则代码为: pDC- SetPixel(CPoint(100,100),RGB(255,0,0); 实际显示像素的颜色未必等同于crColor所指定的颜色值,因为有

11、时受设备限制,不能显示crColor所指定的颜色值,而只能取其近似值。与上述函数相对应的GetPixel函数是用来获取指定点的颜色。 COLORREF GetPixel( int x, int y ) const; COLORREF GetPixel( POINT point ) const;,6.2 常用绘图函数,6.2.1 画点与画线 2、画线 画线也是特别常用的绘图操作之一。CDC的LineTo和MoveTo函数就是用来实现画线功能的两个函数,通过这两个函数的配合使用,可完成任何直线和折线的绘制操作。 CDC:MoveTo用来移动当前点到指定点,返回当前点的坐标。它有两种调用形式,其函数

12、原型如下: CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); 参数x为新位置的x坐标,y为新位置的y坐标; point为新位置的坐标. CDC:LineTo函数用来绘制一条从当前点到指定点的直线,返回是否绘制成功的标志,其原型如下: BOOL LineTo( int x, int y ); BOOL LineTo( POINT point ); 参数x为指定点的x坐标,y为指定点的y坐标; point为指定点的坐标.,6.2 常用绘图函数,6.2.1 画点与画线 3、折线 除了LineTo函数可用来画线之外,CDC中还提供了一系列用

13、于画各种折线的函数。它们主要是Polyline、PolyPolyline和PolylineTo。这三个函数中,Polyline和PolyPolyline既不使用当前位置,也不更新当前位置;而PolylineTo总是把当前位置作为起始点,并且在折线画完之后,还把折线终点所在位置设为新的当前位置。这几个函数的原型如下: BOOL Polyline( LPPOINT lpPoints, int nCount ); BOOL PolylineTo( const POINT* lpPoints, int nCount ); 这两个函数用来画一系列连续的折线,参数lpPoints是POINT或CPoint

14、的顶点数组;nCount表示数组中顶点的个数,它至少为2。 BOOL PolyPolyline( const POINT* lpPoints, const DWORD* lpPolyPoints, int nCount ); 此函数可用来绘制多条折线。其中lpPoints同前定义,lpPolyPoints表示各条折线所需的顶点数,nCount表示折线的数目。,6.2 常用绘图函数,6.2.2 矩形和圆角矩形 CDC提供的Rectangle和RoundRect函数分别用于矩形和圆角矩形的绘制,它们的原型如下: BOOL Rectangle( int x1, int y1, int x2, int

15、 y2 ); BOOL Rectangle( LPCRECT lpRect ); BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 ); BOOL RoundRect( LPCRECT lpRect, POINT point ); 参数lpRect的成员left,top,right,bottom分别表示x1,y1,x2,y2,point的成员x,y分别表示x3,y3;而x1,y1表示矩形的左上角坐标,x2,y2表示矩形的右上角坐标,x3,y3表示绘制圆角的椭圆大小,,6.2 常用绘图函数,6.2.3 圆弧和椭圆 通过调

16、用CDC的Arc函数可以画一条椭圆弧线或者整个椭圆。这个椭圆的大小是由其外接矩形(本身并不可见)所决定的。Arc函数的原型如下: BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 使用CDC的成员函数Ellipse,可以使用当前笔绘制一个用当前画刷填充的椭圆或圆。其函数原型如下: BOOL Ellipse(int x1, int y1, int x2, int y2 ); BOOL

17、Ellipse( LPCRECT lpRect );,6.3 绘图工具,6.2.1 画笔 画笔是最简单的一种绘图工具,同时也是最重要的一种绘图对象。在现实世界中,可以用不同的笔产生不同的线。这正如绘图用的彩笔、不同颜色笔产生不同颜色的线。Windows也是利用这种面向对象的描述事物的方法,把笔作为一个对象,和现实世界一样,不同的笔产生不同的线。 一个画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的,默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线

18、等七种风格。,6.3 绘图工具,6.2.1 画笔 1、画笔的创建 创建一个修饰画笔,可以使用CPen类的CreatePen函数,其原型如下: BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); 参数nPenStyle、nWidth、crColor分别用来指定画笔的风格、宽度和颜色。此外,还有一个CreatePenIndirect函数也是用来创建画笔对象,它的作用与CreatePen函数是完全一样的,只是画笔的三个属性不是直接出现在函数参数中,而是通过一个LOGPEN结构间接地给出。 BOOL CreatePenIndir

19、ect( LPLOGPEN lpLogPen ); 此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下: typedef struct tagLOGPEN UINT lopnStyle; / 画笔风格,同上 POINT lopnWidth;/ POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor; / 画笔颜色 LOGPEN;,6.3 绘图工具,6.2.1 画笔 2、使用画笔 在VC+.NET,通常按照如下步骤来使用画笔: (1)声明CPen对象。 (2)初始化画笔。通过调用CreatePen成员函数可以初始化笔。 (3)将新建的画笔对象

20、选进设备场景中,同时保存原画笔对象的指针: pOldPen=pDC-SelectObject( (4)调用绘图函数生成图形。 (5)选择设备场景的原有笔对象。 3、画笔工具的操作示例,6.3 绘图工具,6.2.2 画刷 1、画刷的属性 画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8 8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识. 2、画刷的创建 CBrush类根据画刷属性提供了相应的创建函数,例如创建填充色画刷和填充样式画刷的函数为CreateSolidBrush

21、和CreateHatchBrush,它们的原型如下: BOOL CreateSolidBrush( COLORREF crColor ); / 创建填充色画刷 BOOL CreateHatchBrush( int nIndex, COLORREF crColor ); / 创建填充样式画刷 其中,nIndex用来指定画刷的内部填充样式,而crColor表示画刷的填充色。 与画笔相类似,也有一个LOGBRUSH 逻辑结构用于画刷属性的定义,并通过 CBrush的成员函数CreateBrushIndirect来创建,其原型如下: BOOL CreateBrushIndirect( const LO

22、GBRUSH* lpLogBrush );,6.3 绘图工具,6.2.2 画刷 3、画刷的使用 在VC+.NET,通常按照如下步骤来使用画刷: (1)生成CBrush的实例。刷子以多种样式和颜色出现在CBrush:CBrush(): CBrush( ); CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); 上述函数的参数crColor指定刷子颜色;nIndex参数指定刷子图案,其值如表8.7所示。 (2)调用相应的成员函数初始化刷子。 (3)将所创建的画刷选入设备环境,同时保存原画刷对象的指针。 (4)调用绘图

23、函数生成图形。 (5)恢复原先设备环境中的画刷。,6.3 绘图工具,6.2.2 画刷 3、画刷的使用,6.3 绘图工具,6.2.3 绘图示例EX06B,6.4 字体与文字处理,6.4.1 字体的属性 字体的属性有很多,但其主要属性有字样、风格和尺寸三个。字样是字符书写和显示时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、黑体、隶书以及幼圆等多种字样。字体风格主要表现为字体的粗细和是否倾斜等特点。字体尺寸是用来指定字符所占区域的大小,通常用字符高度来描述。字体尺寸可以取毫米或英寸作为单位,但为了直观起见,也常常采用一种称为“点”的单位,一点约折合为1/72英寸。对于汉字,还常用“号”

24、数来表示字体尺寸,初号字最大,以下依次为小初、一号、小一、二号、小二、,如此类推,字号越大,字体尺寸越小。,6.4 字体与文字处理,6.4.2 字体的创建 在VC+.NET中,创建字体需要调用CFont类的成员函数CreateFontIndirect或CreatePointFont Indirect来初始化。 创建字体函数 CFont类的字体创建成员函数的原型为: BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderl

25、ine, BYTE cStrikeOut,BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFaceName ); BOOL CreateFontIndirect(const LOGFONT* lpLogFont ); BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL ); BOOL CreatePointFontIndirect( c

26、onst LOGFONT* lpLogFont, CDC* pDC = NULL ); 其中CreatePointFont提供了创建字体的一种简单方法: nPointSize为字体的大小,以0.1点(像素/墨点/磅数)为单位 lpszFaceName为字体名称字符串的指针 若pDC非空,则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位。,6.4 字体与文字处理,6.4.3 文本输出函数 文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式等有很大关系。CDC类提供了四个输出文本的成员函数:TextOut、ExtTextOut、DrawText和TabbedTextO

27、ut。 virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); BOOL TextOut( int x, int y, const CString,6.4 字体与文字处理,6.4.4 文本属性控制 1、设置文本的背景色 缺省时,在绘制图形或者输出文本时,背景颜色是白色。可以使用CDC的成员函数SetBkColor函数来设置新的背景颜色,函数原型为: virtual COLORREF SetBkColor(COLORREF crcolor); 2、控制文本的背景色 背景模式可用函数SetBkMode来设置,它设置

28、当前的背景模式并返回原来的背景模式,该函数的原型为: int SetBkMode(int nBkMode); 参数nkbmode指定背景模式,其值可以是OPAQUE或者TRANSPARENT,如果值为OPAQUE,则显示时背景都改变为当前背景颜色。如果值为TRANSPARENT,则不改变背景颜色,此时,任何SetBkColor函数调用都无效,缺省的背景模式为OPAQUE。 3、设置文本的排列方式 在文本显示时遇到的另一个问题是文本的排列方式,它控制文本和给定点的相对位置。在一个图形中加字符说明时,常常知道一个字符串的某一个边界,如左边界不应超过某个位置,或右边界不应超过某个位置,或显示的几行字

29、符串的中心点对齐等。利用CDC的成员函数SetTextAlign函数就能方便地实现这种控制,其原型为: UINT SetTextAlign (UINT nFlags);,6.4 字体与文字处理,6.4.5 字体示例EX06C,6.5 位图,6.5.1 位图文件的格式 DIB位图文件分为四部分: (1)位图文件头BITMAPFILEHEADER: 位图文件头BITMAPFILEHEADER是一个结构体,长度为14字节 (2)位图信息头BITMAPINFOHEADER:位图信息头BITMAPINFOHEADER也是一个结构体,长度为40字节 (3)调色板Palette 调色板Palette针对的是

30、需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有biClrUsed个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节 (4)实际的位图数据ImageDate 对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的R、G、B值: a.单色位图:用1bit就可以表示象素的颜色索引值; b.16色位图:用4bit可以表示象素的颜色索引值; c.256色位图:1个字节表示1个象素的颜色索引值; d.真彩色:3个字节表示1个象素的颜色R,G,B值。,6.5 位图,6.5.2 CBitmap的使用方法,6.6 综合实例建立宾馆管理系统的启动界面,思考与练习 1、在MFC中常用的设备环境类有哪些,它们有什么不同? 2、在绘图程序中怎样设置图形的颜色? 3、什么是字体?如何构造和定义字体? 4、CDC中文本绘制函数有哪些?它们有何不同? 5、什么是位图?如何将项目中的位图显示出来? 6、画笔的属性有哪几种?如何使用画笔? 7、编写一个记事本程序,实现文本的格式化。要求使用字体对话框来设置文本字体的格式。 8、编写一个简单的绘图程序,当单击工具栏上图形时,可以用选定的颜色绘出相应的图形。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1