图形、文本和打印.ppt

上传人:小飞机 文档编号:6452964 上传时间:2023-11-01 格式:PPT 页数:90 大小:3.54MB
返回 下载 相关 举报
图形、文本和打印.ppt_第1页
第1页 / 共90页
图形、文本和打印.ppt_第2页
第2页 / 共90页
图形、文本和打印.ppt_第3页
第3页 / 共90页
图形、文本和打印.ppt_第4页
第4页 / 共90页
图形、文本和打印.ppt_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《图形、文本和打印.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 常用文本输出函数,文本的最终输出不

26、仅依赖于文本的字体,而且还跟文本的颜色、对齐方式等有很大关系。CDC类提供了4个输出文本的函数。,(1)TextOut函数是用当前字体在指定位置(x,y)处显示一个文本。virtual BOOL TextOut(int x,int y,LPCTSTR lpszString int nCount);BOOL TextOut(int x,int y,const CString,7.3.2 常用文本输出函数,(2)TabbedTextOut也是用当前字体在指定位置处显示一个文本,但它还根据指定的制表位(Tab)设置相应字符位置,函数成功时返回输出文本的大小。virtual CSize TabbedT

27、extOut(int x,int y,LPCTSTR lpszString int nCount,int nTabPositions,LPINT lpnTabStopPostions,int nTabOrigin);CSize TabbedTextOut(int x,int y,const CString,7.3.2 常用文本输出函数,(3)DrawText函数是当前字体在指定矩形中对文本进行格式化绘制。virtual int DrawText(LPCTSTR lpszString,int nCount,LPRECT lpRect,UINT nFormat);int DrawText(cons

28、t CString,7.3.2 常用文本输出示例,绘制下列图形,(10,10),(200,140),200,20,停止位为40个单位,停止位为80个单位,停止位为默认值,在C*View类的OnDraw(CDC*pDC)函数中添加绘图代码:,CRect rc(10,10,200,140);pDC-Rectangle(rc);pDC-DrawText(单行文本居中,rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);,在C*View类的OnDraw(CDC*pDC)函数中添加绘图代码:,rc.OffsetRect(200,0);/将矩形向右偏移200pDC-Rectang

29、le(rc);int nTab=40;/将Tab位的值指定为40个逻辑单位pDC-TabbedTextOut(rc.left,rc.top,绘制tTabt文本t示例,1,/使用默认的停止位,7.3.3 文本格式化属性,文本的格式属性通常包括文本颜色、对齐方式、字符间隔以及文本调整等。在绘图设备环境中,默认的文本颜色是黑色,而文本背景色为白色,在CDC类中,SetTextColor、SetBkColor和SetBkMode函数就是分别用来设置文本颜色、文本背景色和背景模式,而与之相对应的GetTextColor、GetBkcolor和GetBkMode函数则是分别获取这三项属性的。SetText

30、Align、GetTextAlign函数是设置和获取文本对齐方式(文本的对齐方式如P221表7.5所示)。,7.3.3 文本格式化属性,virtual COLORREF SetTextColor(COLORREF crColor);COLORREF GetTextColor()const;virtual COLORREF SetBkColor(COLORREF crColor);COLORREF GetBkColor()const;int SetBkMode(int nBkMode);int GetBkMode()const;UINT SetTextAlign(UINT nFlags);UIN

31、T GetTextAlign()const;,7.3.4 计算字符的几何尺寸,在打印和显示文本时,若了解字符的高度计算及字符的测量方式,能更好地控制文本输出效果。在CDC类中,GetTextMetrics(LPTEXTMETRIC lpMetrics)函数是用来获得指定映射模式下相关设备环境的字符几何尺寸及其它属性的。,7.3.4 计算字符的几何尺寸,typedef struct tagTEXTMETRIC int tmHeight;/字符的高度 int tmAscent;/高于基准线部分的值 int tmDescent;/低于基准线部分的值 int tmInternalLeading;/字符

32、内标高 int tmExternalLeading;/字符外标高 int tmAveCharWidth;/字体中字符平均宽度 int tmMaxCharWidth;/字符的最大宽度/TEXTMETRIC;,7.3.4 计算字符的几何尺寸,计算字符的几何尺寸的方法:利用TEXTMETRIC类型变量的成员。如:计算字符的总高度:int charHeight=lpMetrics-tmHeight+lpMetrics-tmExternalLeading;利用CDC类的成员函数。如:计算字符宽度:int charWidth=pDC-GetCharWidth();,7.3.4 计算字符的几何尺寸,计算字符

33、串的宽度和高度,可利用CDC类的成员函数来实现。CSize GetTextExtent(LPCTSTR lpszString,int nCount)const;CSize GetTextExtent(const CSting,7.3.5 文档内容显示及其字体改变,例:在视图类中通过文本绘图的方法来显示文档的文本内容及改变显示的字体。(1)创建一个单文档应用程序Ex_Text,在创建的第6步将视图的基类选择为CScrollView。由于视图客户区往往不能显示文档的全部内容,因此需要视图支持滚动操作。,(2)为CEx_TextDoc类添加CStringArray类型的成员变量m_strConten

34、ts,用来将读取的文档内容保存。,7.3.5 文档内容显示及其字体改变,void CEx_TextDoc:Serialize(CArchive,(3)在CEx_TextDoc:Serialize函数中添加读取文档内容的代码:,7.3.5 文档内容显示及其字体改变,(5)在CEx_TextView类构造函数中添加m_lfText的初始化代码CEx_TextView:CEx_TextView()memset(,(4)为CEx_TextView类添加LOGFONT类型的成员变量m_lfText,用来保存当前所使用的逻辑字体。,7.3.5 文档内容显示及其字体改变,void CEx_TextView:

35、OnLButtonDblClk(UINT nFlags,CPoint point)CFontDialog dlg(,(6)用MFC ClassWizard为CEx_TextView类添加WM_LBUTTONDBLCLK(双击鼠标)的消息映射函数,并增加下列代码:,7.3.5 文档内容显示及其字体改变,void CEx_TextView:OnDraw(CDC*pDC)CEx_TextDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/创建字体 CFont cf;cf.CreateFontIndirect(,(7)在CEx_TextView:OnDraw中添加下列

36、代码:,7.3.5 文档内容显示及其字体改变,int y=0;int tab=tm.tmAveCharWidth*4;/为一个TAB设置4个字符/输出并计算行的最大长度int lineMaxWidth=0;CString str;CSize lineSize(0,0);for(int i=0;im_strContents.GetSize();i+)str=pDoc-m_strContents.GetAt(i);pDC-TabbedTextOut(0,y,str,1,7.3.5 文档内容显示及其字体改变,str=str+A;/多计算一个字符宽度 lineSize=pDC-GetTabbedTex

37、tExtent(str,1,/多算一行,以滚动窗口能全部显示文档内容,7.3.5 文档内容显示及其字体改变,CSize sizeTotal;sizeTotal.cx=lineMaxWidth;sizeTotal.cy=lineHeight*nLines;SetScrollSizes(MM_TEXT,sizeTotal);/设置滚动逻辑窗口的大小,7.4 位图、图标与光标,4,位图,位图是一些和显示像素相对应的位阵列,它可以用来保存、加载和显示。图标、光标也是一种位图,但它们有各自的特点。同一个图标或光标对应于不同的显示设备时,可以包含不同的图像。光标还具有“热点”的特性。,7.4.1.使用图形

38、编辑器,图形编辑器可以创建和编辑任何位图格式的图像资源,除工具栏外,它还用于位图、图标和光标。具体的使用同Windows中的“组图”工具栏类似。1.创建一个新的图标或光标在一个应用程序中,在“插入资源”的对话框中选择Cursor(光标)或Icon(图标)资源类型时,系统为程序添加一个新的图标或光标资源的同时在开发环境右侧出现图形编辑器。由于同一个图标或光标对应于不同的显示设备时,可以包含不同的图像。因此,在创建图标或光标前必须事先指定好目标显示设备。,7.4.1.使用图形编辑器,2.选用和定制显示设备在图形编辑器窗口的控制条上,单击New Device Image按钮,系统将弹出相应的新设备列

39、表对话框,用户可以从中选取需要的显示设备。在对话框中单击“定制”按钮还可定制新的显示设备。,7.4.1.使用图形编辑器,3.设置光标热点Windows系统借助光标“热点”来确定光标实际的位置。在图形编辑器的控制条上或光标属性对话框中都可以看到当前的光标“热点”位置。默认时,光标热点是左上角(0,0),热点的位置可以重新指定,单击Hot Spot按键后,在光标图像上单击要指定的像素点即可。,设置热点按钮,7.4.2.位 图,Windows的位图有两种类型:一种是GDI位图,另一种是DIB位图。常用的是GDI位图。GDI位图是由MFC中的CBitmap类来表示的。1.CBitmap类 CBitma

40、p类封装了Windows的GDI位图操作所需的大部分函数。(1)位图的初始化函数LoadBitmap BOOL LoadBitmap(LPCTSTR lpszResourceName);BOOL LoadBitmap(UINT nIDResource);,7.4.2.位 图,(2)位图的创建函数BOOL CreateBitmap(int nWidth,int nHeight,UINT nPlanes,UINT nBitCount,const void*lpBits);BOOL CreateBitmapIndirect(LPBITMAP lpBitmap);BOOL CreateCompatib

41、leBitmap(CDC*pSrcDC,int nWidth,int nHeight);(3)位图的显示函数BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORD dwRop);BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);,7.4.2.位 图,2.GDI位图的显示步骤,(1)调用CBitma

42、p类的CreateBitmap、CreateCompatibleBitmap以及 CreateBitmapIndirect函数创建一个适当的位图对象。(2)调用CDC:CreateCompatibleDC函数创建一个内存设备环境,以便位图在内存中保存下来,并与指定设备(窗口设备)环境相兼容;(3)调用CDC:SelectObject函数将位图对象选入内存设备环境中;(4)调用CDC:BitBlt或CDC:StretchBlt函数将位图复制到实际设备环境中。(5)使用之后,恢复原来的内存设备环境。,7.4.2.位 图,3.位图的最终显示通过调用CDC:BitBlt函数或CDC:StretchBl

43、t函数来执行的。BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORD dwRop);BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC 8pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);,7.4.3 图 标,在Windows中一个应用程序可以使用两种尺寸的图标:普通图标(大图标32*32)和小图标(16*16)。1.图标的调入与清除(可使用CW

44、inApp类的成员函数)(1)图标的调入(C*App类的成员函数)HICON LoadIcon(LPCTSTR lpszResourceName)const;HICON LoadIcon(UINT nIDResource)const;(2)使用系统预定义的标准图标(C*App类的成员函数)HICON LoadStandardIcon(LPCTSTR lpszIconName)const;(3)删除一个图标(全局函数)BOOL DestroyIcon(HICON hIcon);,7.4.3 图 标,2.图标的绘制(可使用CDC类的成员函数)BOOL DrawIcon(int x,int y,HI

45、CON hIcon);BOOL DrawIcon(POINT point,HICON hIcon);3.应用程序图标的改变(1)在图形编辑器窗口内直接修改(2)使用GetClassLong和SetClassLong函数。(CWnd类的成员函数)DWORD SetClassLong(HWND hWnd,int nIndex,LONG dwNewLong);DWORD GetClassLong(HWND hWnd,int nIndex);,补充:实时更新设置,在应用程序中设置计时器。使用CWnd类的成员函数SetTimer来设置时间间隔。如:SetTimer(1,1000,NULL)第一个参数指定

46、该计时器的标识值(不能为0),第二参数指定计时器的时间间隔(单位为ms),第三个参数指定处理WM_TIMER消息的函数,一般都设为NULL。设置计时器后,还应处理计时器消息WM_TIMER,在相应的类中添加该消息映射函数,即每隔一个时间间隔执行该操作一次。,7.4.4 光 标,1.使用系统光标 Windows预定义了一些经常使用的标准光标,这些光标均可以使用函数CWinApp:LoadStandardCursor加载到程序中,其函数原型如下:HCURSOR LoadStandardCursor(LPCTSTR lpszCursorName)const;lpszCursorName用来指定一个标

47、准光标名,它可以是下列宏定义:,7.4.4 光 标,IDC_ARROW 标准箭头光标IDC_IBEAM 标准文本输入光标IDC_WAIT 漏斗型计时等待光标IDC_CROSS 十字形光标IDC_UPARROW 垂直箭头光标IDC_SIZEALL 四向箭头光标IDC_SIZENWSE 左上至右下的双向箭头光标IDC_SIZENESW 左下至右上的双向箭头光标IDC_SIZEWE 左右双向箭头光标IDC_SIZENS 上下双向箭头光标,7.4.4 光 标,2.使用光标资源 用编辑器创建或从外部调入的光标资源,可通过函数CWinApp:LoadCursor进行加载,其原型如下:HCURSOR Loa

48、dCursor(LPCTSTR lpszResourceName)const;HCURSOR LoadCursor(UINT nIDResource)const;,7.4.4 光 标,3.更改程序中的光标 更改应用程序中的光标除了可以使用GetClassLong和SetClassLong函数外,最简单的方法是用MFC ClassWizard映射WM_SETCURSOR消息,该消息是当光标移动到一个窗口内并且还没有捕捉到鼠标时产生的。CWnd为此消息的映射函数定义这样的原型:afx_msg BOOL OnSetCursor(CWnd*pWnd,UINT nHitTest,UINT message

49、);,7.4.4 光 标,4.示例,根据当前鼠标所在的位置来确定单文档应用程序光标的类型,当处在标题栏时为一个动画光标,当处在客户区时为一个自定义光标。,7.5 打印与打印预览,5,打印与打印预览机制,当程序在打印机上打印时,它使用的是CDC类的设备环境对象,并将它作为参数传给视图类的OnDraw函数。如果应用程序要把显示结果在打印机上打印出来,则此时OnDraw函数根据设备环境不同会被不同的函数调用。显示时,OnPaint函数会调用OnDraw,此时设备环境为屏幕;而打印时,OnPrint函数会调用OnDraw,此时设备环境为打印机。在打印预览状态下,OnDraw函数的参数实际上是一个指向C

50、PreviewDC对象的指针,不管是打印还是预览,OnPrint和OnDraw函数的工作方式都是相同的。,7.5.1 打印与打印预览机制,1.MFC打印过程,用MFC AppWizard创建的文档应用程序运行后,当选择“文件”菜单中的“打印”命令时,就会弹出如图的通用打印对话框。单击“打印”按钮后,应用程序就自动开始打印,打印过程中调用了很多相关函数,调用过程如P235图7.16所示。,7.5.1 打印与打印预览机制,2.打印预览过程,当选择了MFC创建的应用程序的“文件”菜单中的“打印预览”命令后,应用程序就会创建一个CPreviewDC对象,每当应用程序执行一个设置打印机设备环境属性的操作

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号