图形、文本和打印.ppt
《图形、文本和打印.ppt》由会员分享,可在线阅读,更多相关《图形、文本和打印.ppt(90页珍藏版)》请在三一办公上搜索。
1、第7章图形、文本和打印,图形、文本和打印,Window为操作系统和硬件提供了图形用户接口GUI(Graphics Users Interface)。所有的信息,甚至文本,在Windows下都可以作为图形画到屏幕上。Window的GDI(设备图形接口)提供了绘图的基本工具,如画点、线、多边形、位图以及文本输出。主要负责系统与用户或绘图程序之间的信息交换,并在输出设备上显示图形或文字。MFC提供了设备环境类CDC和图形对象类CGdiObject来完成绘图操作。,7.1 设备环境和简单数据类,1,设备环境,设备环境是由Windows保存的一个数据结构,包含应用程序向设备输出时所需要的信息,如当前背景
2、色或区域图案、区域的无效部分等。Windows通过设备环境确定任何输出设备的GDI输出的位置和图形的属性。当用户绘图时,需要访问设备描述表DC(Device Context),它的主要作用是提供程序与物理设备或者伪设备之间的联系,另外还处理绘图属性设置,如文本颜色设置。,7.1.1 设备环境类,设备环境类CDC是GDI封装在MFC中的最大的一个类,它表示总的DC,是所有DC类的基类。CDC类定义环境对象,并提供在显示器、打印机或窗口客户区上绘制图形的方法,它封装了使用设备环境的GDI函数。CDC类的成员函数有近200个,可分为位图函数、剪裁函数、绘图属性函数、初始化函数和字体函数等。,7.1.
3、1 设备环境类,设备环境类CDC提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。(1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。,7.1.1 设备环境类,(2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,
4、0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。WindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数。(3)CMetaFileDC封装了在一个Windows图元文件中绘图的方法。图元文件是一系列与设备无关的图片的集合,由于它对图象的保存比像素更精确,因而往往在要求较高的场合下使用。目前的Windows已使用增强格式(enhanced-format)的32位图元文件来进行操作。,7.1.2 坐标映射,要指定绘图位置,需使用坐标系。Windows提供了
5、两类坐标系:设备坐标系和逻辑坐标系。逻辑坐标就是内存中虚拟的坐标,可以理解为看不见的,而设备坐标就是跟具体的设备相联系的坐标系统,如:显示器和打印机设备坐标系下的坐标,大小与分辨率有关。为了能保证打印的结果不受设备的影响,Windows定义了一些映射模式,不同的映射模式决定了设备坐标和逻辑坐标之间的转换关系,也就是两种坐标系统在相互转换时,逻辑单位和设备单位之间的某种比例关系。说明:Windows中,只有对需要设备环境句柄作参数的GDI函数,映射方式才会起作用。,映 射 模 式,视口和窗口,窗口:可以理解成一种逻辑坐标下的窗口视口:可以理解成实际看到的那个窗口,即设备坐标下的窗口,通常与客户区
6、相同,窗口和视口是与映射模式相关联的,映射方式就是用于从“窗口”(逻辑坐标)到“视口”(设备坐标)的映射。在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC:SetWindowExt()和CDC:SetViewportExt()来设置所需要的比例因子。根据“窗口”和“视口”的大小可以确定x和y的比例因子,它们的关系如下:x比例因子=视口x大小/窗口x大小y比例因子=视口y大小/窗口y大小,7.1.3.CPoint、CSize和CRect,CPoint、CSize和CRect类是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各
7、自结构的数据成员。typedef struct tagPOINTLONG x;/点的x坐标LONG y;/点的y坐标 POINT;CPoint类带参数的常用构造函数原型如下:CPoint(int initX,int initY);CPoint(POINT initPt);,7.1.3.CPoint、CSize和CRect,typedef struct tagSIZEint cx;/水平大小int cy;/垂直大小SIZE;CSize类带参数的常用构造函数原型如下:CSize(int initCX,int initCY);CSize(SIZE initSize);,7.1.3.CPoint、CS
8、ize和CRect,typedef struct tagRECTLONG left;/左上角点的x坐标LONG top;/左上角点的y坐标LONG right;/右下角点的x坐标LONG bottom;/右下角点的y坐标RECT;CRect类带参数的常用构造函数原型如下:CRect(int l,int t,int r,int b);CRect(const RECT,CRect的常用操作(1),CRect的常用操作(2),CRect的常用操作(3),7.1.4.颜色和颜色对话框,一个彩色象素的显示需要颜色空间的支持,常用的颜色空间有RGB和YUV两种。RGB颜色空间选用红(R)、绿(G)、蓝(B
9、)三种基色分量,通过对这三种基色不同比例的混合,可以得到不同的彩色效果。而YUV颜色空间是将一个彩色像素表示成一个亮度分量(Y)和两个色度分量(U、V)。在MFC中,CDC使用的是RGB颜色空间,其中,COLORREF是用来表示RGB颜色的一个32位的数据类型。它可以用下列的十六进制表示一个RGB值:0 x00bbggrr,其中bb、gg、rr分别表示蓝、绿、红3个颜色分量的十六进制值。,7.1.4.颜色和颜色对话框,在具体操作RGB颜色时,可使用下列的宏操作:GetBValue、GetGValue、GetRValue来获得其中各个颜色分量值。如:int nRed=GetBValue(colo
10、r);RGB来将指定的三个分量值转换成一个32位的RGB颜色值。如:COLORREF color=RGB(nRed,nGreen,nBlue);,7.1.4.颜色和颜色对话框,MFC的CColorDialog类为应用程序提供了颜色选择通用对话框,构造函数如下:CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd*pParentWnd=NULL);其中,clrInit指定选择的默认颜色值,默认为RGB(0,0,0)黑色。pParentWnd指定对话框的父窗口指针。dwFlags指定对话框外观和功能(见教材P209)。当对话框单击OK退出时,可调
11、用下列成员函数获得相应的颜色。COLORREF GetColor()const;void SetCurrentColor(COLORREF clr);static COLORREF*GetSavedCustomColors(),7.1.5.图形设备接口,Windows为设备环境提供了各种各样的绘图工具,例如用于画线的“画笔”、填充区域的“画刷”以及用于绘制文本的“字体”。MFC封装了这些工具,并提供相应的类来作为应用程序的图形设备接口GDI(这些类有一个共同的抽象基类CGdiObject)。,7.1.5.图形设备接口,在选择GDI对象进行绘图时,可遵循下列步骤:在堆栈中定义一个GDI对象(如C
12、Pen对象),然后用相应的函数(如CreatePen)创建此GDI对象,有些对象可用带参的构造函数一步创建完成。将构造的GDI对象选入当前设备环境中,同时将原来的GDI对象保存起来。绘图结束后,恢复当前设备环境中原来的GDI对象。程序结束后,框架会自动删除程序创建的GDI对象。,7.1.5.图形设备接口,void C*View:OnDraw(CDC*pDC)CPen penBlack;/创建对象penBlack.CreatePen(PS_SOLID,2,RGB(0,0,0);CPen*pOldPen=pDC-SelectObject(,7.1.5.图形设备接口,除了自定义的GDI对象外,还可使
13、用CDC的成员函数SelectStockObject将Windows预定义的库存GDI对象选入当前设备环境中,并返回原先被选中的对象指针,同时使原先被选中的对象从设备环境中分离出来。可被选中的库存GDI对象类型:BLACK_BRUSH GRAY_BRUSHLTGRAY_BRUSH DKGRAY_BRUSH HOLLOW_BRUSH NULL_BRUSH WHITE_BRUSH BLACK_PENWHITE_PEN NULL_PENSYSTEM_FONT DEVICE_DEFAULT_FONT,7.2 简单图形绘制,2,7.2.1.画 笔,画笔是Windows应用程序中用来绘制各种直线和曲线的一
14、种图形工具,它可分为修饰画笔和几何画笔两种类型。几何画笔通常在逻辑单元中绘图并受当前绘图模式的影响。修饰画笔通常在设备单元中绘图而忽略当前绘图模式。在这两种类型中,几何画笔的定义最复杂,它不但有修饰画笔的属性,而且还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。而修饰画笔只有简单的几种属性,通常用在简单的直线和曲线等场合。,7.2.1.画 笔,一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线(PS_SOLID)、虚线(P
15、S_DASH)、点线(PS_DOT)、点划线(PS_DASHDOT)、双点划线(PS_DASHDOTDOT)、不可见线(PS_NULL)和内框线(PS_INSIDEFRAME)等七种风格。,1.创建画笔,CPen类封装图形设备接口GDI画笔对象的功能。创建画笔可以采用以下几种方法:(1)使用无参构造函数声明对象,之后调用成员函数CreatePen()创建具体的画笔。BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);其中nPenStyle表示画笔的样式。nWidth表示画笔的线宽。crColor表示画笔的RGB颜色。例如:CPen
16、 Pen;Pen.CreatePen(PS_SOLID,1,RGB(255,0,0);/调用成员函数,创建线宽为1的红色实线画笔,1.创建画笔,(2)使用构造函数创建画笔CPen(int nPenStyle,int nWidth,COLORREF cfColor)例如:CPen Pen(PS_SOLID,1,RGB(255,0,0);/调用构造函数,创建线宽为1的红色实线画笔(3)使用重载的构造函数创建几何画笔CPen(int nPenStyle,int nWidth,const LOGBRUSH*pLogBrush,int nStyleCount=0,const DWORD*lpstyle=
17、NULL);,2.库存画笔,库存画笔又叫堆画笔。Windows定义了三种库存画笔,用户可以直接使用这些画笔,而不用创建对象。三种库存画笔分别是:BLANK_PEN:黑色画笔;WHILE_PEN:白色画笔;NULL_PEN:空画笔。可以使用CreatestockObject()函数进行创建。CPen Pen;Pen.CreatestockObject(WHILE_PEN);可以以库存画笔为参数来调用SelectStockObject()函数,此函数选定放入当前设备环境的新对象,并返回一个指向被替换对象的指针,CPen*pOldPen=pDC-SelectStockObject(BLANK_PEN
18、);,3.画笔的使用方法,(1)创建画笔;(2)使用新的画笔,保存原来的画笔以便恢复;CPen*pOldPen;pOldPen=pDC-selectObject(保存并恢复原来画笔的原因是每个图形设备接口对象要占用一个HDC句柄,而可用的句柄数量有限,如果用完后未及时释放,积累下去将导致严重的运行错误。,7.2.2 画 刷,画刷是用来填充图形的工具。画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8 x 8位图,而填充样式往往是CDC内部定义的一些特性,它们都是以HS_为前缀的标识,如图所示:,7.2
19、.2 画 刷,MFC把GDI画刷封装在CRush类中。画刷的使用方法同画笔。画刷分为纯色画刷、阴影画刷、堆画刷和图案画刷。CBrush类为不同的画刷类型提供了不同的构造函数。Windows定义的堆画刷共有7种,分别是:BLACK_BRUSH:黑色画刷;DKGRAY_BRUSH:深灰色画刷;GRAY_BRUSH:灰色画刷;HOLLOW_BRUSH:空画刷;LTGRAY_BRUSH:浅灰色画刷;NULL_BRUSH:空画刷;WHITE_BRUSH:白色画刷;,7.2.2 画 刷,对堆画刷,调用SelectStockObject()函数进行选择画刷,例如:CBrush*pOldBrush=pDC-S
20、electStockObject(WHITE_BRUSH);/选择白色堆画刷,创建CBrush对象的四个构造函数为:,(1)CBrush();/使用前必须初始化画刷(2)CBrush(COLORREF cfColor);/构造带有指定颜色的纯色画刷如:CBrush Brush(RGB(255,0,0);/创建红色画刷(3)CBrush(int nIndex,COLORREF cfColor);/构造带有指定填充样式和颜色的填充画刷(4)CBrush(CBitmap*pBitmap);/构造使用位图图案的画刷 CBitmap对象最大可使用88像素,若位图过大,则只有左上角的部分可以用作画刷图案。
21、,7.2.3 绘 图 示 例,MFC为用户的图形绘制提供了许多函数,这其中包括画点、线、矩形、多边形、圆弧、椭圆、扇形以及Bzier曲线等。例:一个简单图形的绘制示例,表示一个班级某门课程的成绩分布,它是一个直方图,反映90五个分数段的人数,它需要绘制五个矩形,相邻矩形的填充样式还要有所区别,并且还需要显示各分数段的人数。,Ex_Draw运行结果,7.3 字体与文字处理,3,字体,字体定义显示文本的符号和字符,通过处理字体可以显示某种特殊效果的文字,描述输出文字的字体可用CFont对象。CFont对象的使用方法与画笔和画刷类似,定义字体对象,创建字体并保存原来的字体,在文字输出工作结束后恢复原
22、来的字体。,7.3.1 字体和字体对话框,1.字体的属性,字体的主要属性有字样、风格和尺寸。字样是字符书写和显示时表现的特定模式,如宋体、楷体等多种字样。字体风格主要表现为字体的粗细和是否倾斜等特点。字体是用来指定字体所占区域的大小,通常用字符高度来描述。2.字体的创建(1)为了方便用户创建字体,系统定义一种逻辑字体,根据定义的逻辑字体,可调用CFont类的CreateFontIndirect函数来创建字体。(P217),typedef struct tagLOGFONT LONG lfHeight;/字体的逻辑高度 LONG lfWidth;/字符的平均逻辑宽度 LONG lfEscapem
23、ent;/倾角 LONG lfOrientation;/书写方向 LONG lfWeight;/字体的粗细程度 BYTE lfItalic;/斜体标志 BYTE lfUnderline;/下划线标志 BYTE lfStrikeOut;/删除线标志 BYTE lfCharSet;/字符集,汉字必须为GB2312_CHARSET TCHAR lfFaceNameLF_FACESIZE/字样名称/LOGFONT;,2字体的创建(2),当需要某一特定的字体时,还可以使用MFC的CFont类的CreateFont()成员函数来创建字体,若该函数调用成功,则返回非0值,否则返回0。其函数原型如下:BOOL
24、 CFont:CreateFont(int nHeight,/字符逻辑高度int nWidth,/字符逻辑宽度int nEscapement,/出口矢量与X轴的角度int nOrientation,/字符基线与X轴的角度int nWeight,/字体磅值BYTE bItalic,/非0则为斜体,BYTE bUnderline,/非0则加下划线BYTE cStrickOut,/非0则加删除线BYTE nCharSet,/此字体的字符集BYTE nClipPrecision,/裁剪精度BYTE nQualty,/输出质量BYTE nPitAndFamity,/调距和字体族LPCSTR lpszFa
25、cename;/字体的字符名);CreateFont()成员函数并不能产生新的Windows GDI字体,它只是从GDI字库中选择一种最近似的可用字体。,2字体的创建(2),7.3.1 字体和字体对话框,3.使用字体对话框,CFontDialog类提供了字体及其文本颜色选择的通用对话框。,它的构造函数如下:,CFontDialog(LPLOGFONT lplfInitial=NULL,DWORD dwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);,7.3.2 常用文本输出函数,文本的最终输出不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形 文本 打印
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6452964.html