《第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 API功能,由一个
2、32位的HDC类型句柄标识。在MFC类库中,用CDC类封装设备文本对象。,6.1 图形设备接口,6.1.1 设备环境类1、设备环境类(CDC)CDC类直接继承自CObject类,它是设备上下文对象的基类。CDC基类定义了设备描述表对象,并且提供在显示器、打印机或Windows用户区上绘图的方法,它封装了使用设备环境的GDI函数。所有的绘图操作都是直接或间接运用了CDC的成员函数,这些函数有的进行设备描述表操作,有的是用来画图的,还有的函数是用来获取或设置绘图属性,为映像和视图服务的。2、派生类CPaintDCCPaintDC是从CDC派生出来的设备描述表类,它常常在窗口的OnPaint函数中使
3、用。查看MFC的源代码(StudioVC98MFCSRCviewcore.cpp)中的OnPaint函数的实现可以知道,OnPaint函数首先构造一个CPaintDC对象,再调用OnPrepareDC()函数将其准备好,最后以这个准备好的CPaintDC对象指针为参数,来调用OnDraw函数进行各种图形处理。,6.1 图形设备接口,6.1.1 设备环境类3、派生类CClientDC(管理客户区)CClientDC类只能在客户区绘图。所谓客户区是指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等以外的部分,它是用户可以操作的区域。例如打开Word文档将是将某个.doc文件显示在其客户区域中。
4、在使用CClientDC进行绘图时,一般要调用GetClientRect函数来获取客户区域的大小。4、派生类CWindowDC(管理框架窗口)CWindowDC类直接从CDC派生,它使调用和释放整个窗口(包括客户区和非客户区)的设备环境过程自动化。CWindowDC对象在构造时调用Windows API函数GetWindowDC,在析构时调用相应的API函数ReleaseDC,这意味着CWindowtDC对象可访问CWnd所指向的整个屏幕区域。,6.1 图形设备接口,6.1.2 使用GDI对象在选择GDI对象进行绘图时,往往遵循着下列的步骤:(1)在堆栈中定义一个GDI对象(如CPen、CBr
5、ush对象),然后用相应的函数(如CreatePen、CreateSolidBrush)创建此GDI对象。(2)将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来。(3)绘图结束后,恢复当前设备环境中原来的GDI对象。(4)由于GDI对象是在堆栈中创建中,当程序结束后,框架会自动删除程序创建的GDI对象。,6.1 图形设备接口,6.1.3 坐标映射Windows的GDI(graphics device interface)支持两种坐标系,即逻辑坐标系和物理坐标系,分别连接应用程序和图形物理设备。物理坐标是指物理设备的坐标系,它的单位是真正的长度单位,有英寸(in)和毫米
6、(mm)两种,它的原点在屏幕的左上角,X轴向右递增,Y轴向下递增。逻辑坐标指的是在窗口下的坐标,逻辑坐标的单位是逻辑像素。在Windows系统中,总共有三种物理坐标(又叫设备坐标),分别是屏幕坐标、用户区坐标、全窗口坐标。1客户区坐标系统:客户区坐标系统是最常见的坐标系统,以窗口客户区左上角为原点(0,0),主要用于窗口客户区绘图输出以及处理窗口的一些消息。鼠标消息WM_LBUTTONDOWN、WM_MOUSEMOVE传给框架的消息参数以及CDC一些用于绘图的成员都是使用客户区坐标。2屏幕坐标系统:屏幕坐标系统是另一类常用的坐标系统,以屏幕左上角为原点(0,0)。一些与窗口客户区不相关的函数均
7、以屏幕坐标为单位,例如设置和取得光标位置的函数SetCursorPos()和GetCursorPos();由于光标可以在任何一个窗口之间移动,它不属于任何一个单一的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。另外,CreateWindow()和MoveWindow()等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。3窗口坐标系统:窗口坐标系统以窗口左上角为坐标原点,它包含了窗口控制菜单、标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种坐标系统很少使用。,6.1 图形设备接口,6.1.4 与绘图有关的类和结构在图形绘制操作中,常常需要使用MFC中的CPoint、CS
8、ize和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;/矩形左上角点的x坐标 LONG top;/矩形左上角点的y坐标 LONG right;/矩形右下
9、角点的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 crColor);COLORREF SetPixel(POINT point,COLORREF crColor)
10、;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所指定的颜色值,因为有时受设备限制,不能显示crColor所指定的颜色值,而只能取其近似值。与上述函数相对应的GetPixel函数是用来获取指定点的颜色。COLORR
11、EF GetPixel(int x,int y)const;COLORREF GetPixel(POINT point)const;,6.2 常用绘图函数,6.2.1 画点与画线2、画线画线也是特别常用的绘图操作之一。CDC的LineTo和MoveTo函数就是用来实现画线功能的两个函数,通过这两个函数的配合使用,可完成任何直线和折线的绘制操作。CDC:MoveTo用来移动当前点到指定点,返回当前点的坐标。它有两种调用形式,其函数原型如下:CPoint MoveTo(int x,int y);CPoint MoveTo(POINT point);参数x为新位置的x坐标,y为新位置的y坐标;poi
12、nt为新位置的坐标.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中还提供了一系列用于画各种折线的函数。它们主要是Polyline、PolyPolyline和PolylineTo。这三个函数中,Polyline和PolyPolyline既不使用当前位置,也不更新当前位置;而Polyl
13、ineTo总是把当前位置作为起始点,并且在折线画完之后,还把折线终点所在位置设为新的当前位置。这几个函数的原型如下:BOOL Polyline(LPPOINT lpPoints,int nCount);BOOL PolylineTo(const POINT*lpPoints,int nCount);这两个函数用来画一系列连续的折线,参数lpPoints是POINT或CPoint的顶点数组;nCount表示数组中顶点的个数,它至少为2。BOOL PolyPolyline(const POINT*lpPoints,const DWORD*lpPolyPoints,int nCount);此函数可用
14、来绘制多条折线。其中lpPoints同前定义,lpPolyPoints表示各条折线所需的顶点数,nCount表示折线的数目。,6.2 常用绘图函数,6.2.2 矩形和圆角矩形CDC提供的Rectangle和RoundRect函数分别用于矩形和圆角矩形的绘制,它们的原型如下:BOOL Rectangle(int x1,int y1,int x2,int y2);BOOL Rectangle(LPCRECT lpRect);BOOL RoundRect(int x1,int y1,int x2,int y2,int x3,int y3);BOOL RoundRect(LPCRECT lpRect,
15、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 圆弧和椭圆通过调用CDC的Arc函数可以画一条椭圆弧线或者整个椭圆。这个椭圆的大小是由其外接矩形(本身并不可见)所决定的。Arc函数的原型如下:BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);BOOL Arc(LPC
16、RECT lpRect,POINT ptStart,POINT ptEnd);使用CDC的成员函数Ellipse,可以使用当前笔绘制一个用当前画刷填充的椭圆或圆。其函数原型如下:BOOL Ellipse(int x1,int y1,int x2,int y2);BOOL Ellipse(LPCRECT lpRect);,6.3 绘图工具,6.2.1 画笔画笔是最简单的一种绘图工具,同时也是最重要的一种绘图对象。在现实世界中,可以用不同的笔产生不同的线。这正如绘图用的彩笔、不同颜色笔产生不同颜色的线。Windows也是利用这种面向对象的描述事物的方法,把笔作为一个对象,和现实世界一样,不同的笔产
17、生不同的线。一个画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的,默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。,6.3 绘图工具,6.2.1 画笔1、画笔的创建创建一个修饰画笔,可以使用CPen类的CreatePen函数,其原型如下:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);参数nPenStyle、nWidth、crColor分别用来指定画笔的风格、宽度和颜
18、色。此外,还有一个CreatePenIndirect函数也是用来创建画笔对象,它的作用与CreatePen函数是完全一样的,只是画笔的三个属性不是直接出现在函数参数中,而是通过一个LOGPEN结构间接地给出。BOOL CreatePenIndirect(LPLOGPEN lpLogPen);此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下:typedef struct tagLOGPEN UINT lopnStyle;/画笔风格,同上 POINT lopnWidth;/POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor;/画笔颜色 L
19、OGPEN;,6.3 绘图工具,6.2.1 画笔2、使用画笔在VC+.NET,通常按照如下步骤来使用画笔:(1)声明CPen对象。(2)初始化画笔。通过调用CreatePen成员函数可以初始化笔。(3)将新建的画笔对象选进设备场景中,同时保存原画笔对象的指针:pOldPen=pDC-SelectObject((4)调用绘图函数生成图形。(5)选择设备场景的原有笔对象。3、画笔工具的操作示例,6.3 绘图工具,6.2.2 画刷1、画刷的属性画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8 8位图,而填
20、充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识.2、画刷的创建CBrush类根据画刷属性提供了相应的创建函数,例如创建填充色画刷和填充样式画刷的函数为CreateSolidBrush和CreateHatchBrush,它们的原型如下:BOOL CreateSolidBrush(COLORREF crColor);/创建填充色画刷BOOL CreateHatchBrush(int nIndex,COLORREF crColor);/创建填充样式画刷其中,nIndex用来指定画刷的内部填充样式,而crColor表示画刷的填充色。与画笔相类似,也有一个LOGBRUSH 逻辑结构用
21、于画刷属性的定义,并通过 CBrush的成员函数CreateBrushIndirect来创建,其原型如下:BOOL CreateBrushIndirect(const LOGBRUSH*lpLogBrush);,6.3 绘图工具,6.2.2 画刷3、画刷的使用在VC+.NET,通常按照如下步骤来使用画刷:(1)生成CBrush的实例。刷子以多种样式和颜色出现在CBrush:CBrush():CBrush();CBrush(COLORREF crColor);CBrush(int nIndex,COLORREF crColor);上述函数的参数crColor指定刷子颜色;nIndex参数指定刷子
22、图案,其值如表8.7所示。(2)调用相应的成员函数初始化刷子。(3)将所创建的画刷选入设备环境,同时保存原画刷对象的指针。(4)调用绘图函数生成图形。(5)恢复原先设备环境中的画刷。,6.3 绘图工具,6.2.2 画刷3、画刷的使用,6.3 绘图工具,6.2.3 绘图示例EX06B,6.4 字体与文字处理,6.4.1 字体的属性字体的属性有很多,但其主要属性有字样、风格和尺寸三个。字样是字符书写和显示时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、黑体、隶书以及幼圆等多种字样。字体风格主要表现为字体的粗细和是否倾斜等特点。字体尺寸是用来指定字符所占区域的大小,通常用字符高度来描述。
23、字体尺寸可以取毫米或英寸作为单位,但为了直观起见,也常常采用一种称为“点”的单位,一点约折合为1/72英寸。对于汉字,还常用“号”数来表示字体尺寸,初号字最大,以下依次为小初、一号、小一、二号、小二、,如此类推,字号越大,字体尺寸越小。,6.4 字体与文字处理,6.4.2 字体的创建在VC+.NET中,创建字体需要调用CFont类的成员函数CreateFontIndirect或CreatePointFont Indirect来初始化。创建字体函数CFont类的字体创建成员函数的原型为:BOOL CreateFont(int nHeight,int nWidth,int nEscapement,
24、int nOrientation,int nWeight,BYTE bItalic,BYTE bUnderline,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=NU
25、LL);BOOL CreatePointFontIndirect(const LOGFONT*lpLogFont,CDC*pDC=NULL);其中CreatePointFont提供了创建字体的一种简单方法:nPointSize为字体的大小,以0.1点(像素/墨点/磅数)为单位lpszFaceName为字体名称字符串的指针若pDC非空,则系统会将设备单位点自动转换为pDC中的映射模式所指定的逻辑单位。,6.4 字体与文字处理,6.4.3 文本输出函数文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式等有很大关系。CDC类提供了四个输出文本的成员函数:TextOut、ExtTextO
26、ut、DrawText和TabbedTextOut。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、控制文本的背景色 背景模式可用函数SetBkMo
27、de来设置,它设置当前的背景模式并返回原来的背景模式,该函数的原型为:int SetBkMode(int nBkMode);参数nkbmode指定背景模式,其值可以是OPAQUE或者TRANSPARENT,如果值为OPAQUE,则显示时背景都改变为当前背景颜色。如果值为TRANSPARENT,则不改变背景颜色,此时,任何SetBkColor函数调用都无效,缺省的背景模式为OPAQUE。3、设置文本的排列方式 在文本显示时遇到的另一个问题是文本的排列方式,它控制文本和给定点的相对位置。在一个图形中加字符说明时,常常知道一个字符串的某一个边界,如左边界不应超过某个位置,或右边界不应超过某个位置,或
28、显示的几行字符串的中心点对齐等。利用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针对的是需要
29、调色板的位图,即单色、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、编写一个简单的绘图程序,当单击工具栏上图形时,可以用选定的颜色绘出相应的图形。,
链接地址:https://www.31ppt.com/p-5909603.html