《图形和文本》PPT课件.ppt
《《图形和文本》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《图形和文本》PPT课件.ppt(43页珍藏版)》请在三一办公上搜索。
1、第8章 图形和文本,8.1设备环境和简单数据类 8.2图形设备接口 8.3图形绘制 8.4字体与文字处理,8.1设备环境和简单数据类,设备环境和简单数据类 设备环境类CDC提供了绘制和打印的全部函数。为了能让用户使用一些特殊的设备环境,CDC还派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC类。(1)CPaintDC比较特殊,它的构造函数和析构函数都是针对OnPaint进行的,但用户一旦获得相关的CDC指针,就可以将它当成任何设备环境(包括屏幕、打印机)指针来使用。CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用End
2、Paint。(2)CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏)中进行绘图,点(0,0)通常指的是客户区的左上角。而CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。CWindowDC和CClientDC构造函数分别调用GetWindowDC和GetDC,但它们的析构函数都是调用ReleaseDC函数。(3)CMetaFileDC封装了在一个Windows图元文件中绘图的方法。图元文件是一系列与设备无关的图片的集合,由于它对图象的保存比像素更精确,因而往往在要求较高的场合下使用,例如AutoCAD的图像保存等。目前的Windows已
3、使用增强格式(enhanced-format)的32位图元文件来进行操作。,8.1设备环境和简单数据类,坐标映射 为了能保证打印的结果不受设备的影响,定义了一些映射模式,这些映射模式决定了设备坐标和逻辑坐标之间的关系,如表。这样,我们就可以通过调用CDC:SetMapMode(int nMapMode)来设置相应的映射模式。在MM_ISOTROPIC映射模式下,纵横比总是1:1;但在MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,调用CDC:SetWindowExt(设置窗口大
4、小)和CDC:SetViewportExt(设置视口大小)函数来设置所需要的比例因子。所谓“窗口”,可以理解成是一种逻辑坐标下的窗口,“视口”是实际看到的那个窗口。根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:x比例因子=视口x大小/窗口x大小y比例因子=视口y大小/窗口y大小,8.1设备环境和简单数据类,(1)创建一个默认的单文档应用程序Ex_Draw。(2)在CEx_DrawView:OnDraw函数中添加下列代码:void CEx_DrawView:OnDraw(CDC*pDC)CEx_DrawDoc*pDoc=GetDocument();ASSERT_VALI
5、D(pDoc);CRect rectClient;GetClientRect(rectClient);/获得当前窗口的客户区大小pDC-SetMapMode(MM_ANISOTROPIC);/设置MM_ANISOTROPIC映射模式pDC-SetWindowExt(1000,1000);/设置窗口范围pDC-SetViewportExt(rectClient.right,-rectClient.bottom);/设置视口范围pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);pDC-Ellipse(CRect(-500,-500
6、,500,500);(3)编译运行,如图。,8.1设备环境和简单数据类,8.1.3 CPoint、CSize和CRect CPoint、CSize和CRect类的构造函数 CPoint类带参数的常用构造函数原型如下:CPoint(int initX,int initY);CPoint(POINT initPt);CSize类带参数的常用构造函数原型如下:CSize(int initCX,int initCY);CSize(SIZE initSize);CRect类带参数的常用构造函数原型如下:CRect(int l,int t,int r,int b);CRect(const RECT l、t
7、、r、b指定CRect的left、top、right和bottom成员的值。srcRect 和lpSrcRect用一个RECT结构或指针来初始化CRect的成员。point指定矩形的左上角位置。size指定矩形的长度和宽度。topLeft和bottomRight指定CRect的左上角和右下角的位置。,8.1设备环境和简单数据类,CRect类的常用操作 传递LPRECT、LPCRECT或RECT结构作为参数的任何地方,都可以用CRect对象来代替。构造一个CRect时,要使它符合规范。即使其left小于right,top小于bottom。一个不符合规范的矩形,CRect的许多成员函数都不会有正确
8、的结果。常常用CRect:NormalizeRect函数使一个不符合规范的矩形合乎规范。成员函数InflateRect和DeflateRect用来扩大和缩小一个矩形。由于它们的操作是相互的,也就是说,若指定InflateRect函数的参数为负值,那么操作的结果是缩小矩形,因此下面只给出InflateRect函数的原型:void InflateRect(int x,int y);void InflateRect(SIZE size);void InflateRect(LPCRECT lpRect);void InflateRect(int l,int t,int r,int b);x指定扩大CR
9、ect左、右边的数值。y指定扩大CRect上、下边的数值。size中的cx成员指定扩大左、右边的数值,cy指定扩大上、下边的数值。lpRect的各个成员指定扩大每一边的数值。l、t、r和b指定扩大CRect左、上、右和下边的数值。对于前两个重载函数来说,CRect的总宽度被增加了两倍的x或cx,总高度被增加了两倍的y或cy。成员函数IntersectRect和UnionRect用来将两个矩形进行相交和合并。原型如下:BOOL IntersectRect(LPCRECT lpRect1,LPCRECT lpRect2);BOOL UnionRect(LPCRECT lpRect1,LPCRECT
10、 lpRe,8.1设备环境和简单数据类,8.1设备环境和简单数据类,颜色和颜色对话框 一个彩色象素常用的颜色空间有RGB和YUV两种。CDC使用的是RGB颜色空间。COLORREF是用来表示RGB颜色的一个32位的数据类型,它可以用十六进制表示一个RGB值:0 x00bbggrr rr、gg、bb表示红、绿、蓝三个颜色分量的16进制值。使用下列的宏操作:GetBValue 获得32位RGB颜色值中的蓝色分量GetGValue 获得32位RGB颜色值中的绿色分量GetRValue 获得32位RGB颜色值中的红色分量RGB 将指定的R、G、B分量值转换成一个32位的RGB颜色值。MFC的CColo
11、rDialog类为应用程序提供了颜色选择通用对话框。构造函数:CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd*pParentWnd=NULL);dwFlags表示定制对话框外观和功能的系列标志参数。可以是下列之一或”|”组合:CC_ANYCOLOR 在基本颜色单元中列出所有可得到的颜色CC_FULLOPEN 显示所有的颜色对话框界面CC_PREVENTFULLOPEN 禁用“规定自定义颜色”按钮CC_SHOWHELP 在对话框中显示“帮助”按钮CC_SOLIDCOLOR 在基本颜色单元中只列出所得到的纯色 单击对话框“确定”退出(即Do
12、Modal返回 IDOK)时,可调用下列成员获得相应的颜色。COLORREF GetColor()const;/返回用户选择的颜色。void SetCurrentColor(COLORREF clr);/强制使用clr作为当前选择的颜色static COLORREF*GetSavedCustomColors();/返回用户自己定义颜色,8.2图形设备接口,Windows为设备环境提供了各种各样的绘图工具,例如用于画线的“画笔”、填充区域的“画刷”以及用于绘制文本的“字体”。MFC封装了这些工具,并提供相应的类来作为应用程序的图形设备接口GDI,这些类有一个共同的抽象基类CGdiObject,如
13、表。,8.2图形设备接口,GDI对象一般使用方法 选择GDI对象进行绘图时,往往遵循着下列的步骤:(1)在堆栈中定义一个GDI对象,用相应的函数创建此GDI对象。要注意:有些GDI派生类的构造函数允许用户提供足够的信息,从而一步即可完成对象的创建任务。(2)将构造的GDI对象选入当前设备环境中,但不要忘记将原来的GDI对象保存起来。(3)绘图结束后,恢复当前设备环境中原来的GDI对象。(4)GDI对象是在堆栈中创建中,程序结束后,框架会自动删除程序创建的GDI对象。具体操作可像下面的代码过程:void CMyView:OnDraw(CDC*pDC)CPen penBlack;/定义一个画笔变量
14、penBlack.CreatePen(PS_SOLID,2,RGB(0,0,0);/创建画笔/将此画笔选入当前设备环境并保存原来的画笔CPen*pOldPen=pDC-SelectObject(/恢复设备环境中原来的画笔,8.2图形设备接口,画笔 画笔是绘制各种直线和曲线的一种图形工具,可分为修饰画笔和几何画笔两种类型。几何画笔不但有修饰画笔的属性,还跟画刷的样式、阴影线类型有关,通常用在对绘图有较高要求的场合。修饰画笔通常用在简单的直线和曲线等场合。一个修饰画笔通常具有宽度、风格和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确
15、定了所画的线条颜色。画笔的风格确定了所绘图形的线型,它通常有实线、虚线、点线、点划线、双点划线、不可见线和内框线等七种风格。如表。,8.2图形设备接口,创建一个修饰画笔,可以使用CPen类的CreatePen函数,其原型如下:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);参数nPenStyle、nWidth、crColor指定画笔的风格、宽度和颜色。此外,还有一个CreatePenIndirect函数也是用来创建画笔对象,它的作用与CreatePen函数是完全一样的,只是画笔的三个属性不是直接出现在函数参数中,而是通过一个L
16、OGPEN结构间接地给出。BOOL CreatePenIndirect(LPLOGPEN lpLogPen);此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下:typedef struct tagLOGPEN/*lgpn*/UINT lopnStyle;/画笔风格 POINT lopnWidth;/POINT结构的y不起作用,而用x表示画笔宽度 COLORREF lopnColor;/画笔颜色 LOGPEN;注意:l修饰画笔的宽度大于1个像素时,画笔的风格只能取PS_NULL、PS_SOLID或 PS_INSIDEFRAME,定义为其他风格不会起作用。l画笔的创建工作
17、也可在画笔的构造函数中进行,它具有下列原型:CPen(int nPenStyle,int nWidth,COLORREF crColor);,8.2图形设备接口,画刷 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制,它比画笔的内容更加丰富。画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色是使用COLORREF颜色类型,画刷的填充图案通常是用户定义的8 x 8位图,填充样式往往是CDC内部定义的一些特性,是以HS_为前缀的标识,如图:,8.2图形设备接口,CBrush类根据画刷属性提供了相应的创建函数,原型如下:BOOL CreateSolidBrush
18、(COLORREF crColor);/创建填充色画刷BOOL CreateHatchBrush(int nIndex,COLORREF crColor);/创建填充样式画刷 与画笔相类似,也有一个LOGBRUSH 逻辑结构用于画刷属性的定义,并通过 CBrush的成员函数CreateBrushIndirect来创建,原型如下:BOOL CreateBrushIndirect(const LOGBRUSH*lpLogBrush);LOGBRUSH 逻辑结构如下定义:typedef struct tagLOGBRUSH/lb UINT lbStyle;/风格 COLORREF lbColor;/
19、填充色 LONG lbHatch;/填充样式 LOGBRUSH;注意:l画刷的创建工作也可在其构造函数中进行,它具有下列原型:CBrush(COLORREF crColor);CBrush(int nIndex,COLORREF crColor);CBrush(CBitmap*pBitmap);l画刷也可用位图来指定其填充图案,但该位图应该是88像素,若位图太大,Windows则只使用其左上角的8 8的像素。l 画刷仅对绘图函数Chord、Ellipse、FillRect、FrameRect、InvertRect、Pie、Polygon、PolyPolygon、Rectangle、RoundR
20、ect有效。,8.2图形设备接口,位图 CBitmap类 LoadBitmap是位图的初始化函数,其函数原型如下:BOOL LoadBitmap(LPCTSTR lpszResourceName);BOOL LoadBitmap(UINT nIDResource);函数从应用程序中调入一个位图资源。若用户直接创建一个位图对象,可使用CBitmap类中的CreateBitmap、CreateBitmapIndirect以及CreateCompatibleBitmap函数,其原型如下。BOOL CreateBitmap(int nWidth,int nHeight,UINT nPlanes,UIN
21、T nBitcount,const void*lpBits);该函数用指定的宽度、和位模式创建一个位图对象。参数nPlanes表示位图的颜色位面的数目,nBitcount表示每个像素的颜色位个数,lpBits表示包含位值的短整型数组;若此数组为NULL,则位图对象还未初始化。BOOL CreateBitmapIndirect(LPBITMAP lpBitmap);该函数直接用BITMAP结构来创建一个位图对象。BOOL CreateCompatibleBitmap(CDC*pDC,int nWidth,int nHeight);该函数为某设备环境创建一个指定的宽度和高度的位图对象。,8.2图形
22、设备接口,GDI位图的显示 对于GDI位图的显示则必须遵循下列步骤:(1)CreateBitmap、CreateCompatibleBitmap及 CreateBitmapIndirect函数创建一个适当的位图对象。(2)调用CDC:CreateCompatibleDC函数创建一个内存设备环境,以便位图在内存中保存下来,并与指定设备(窗口设备)环境相兼容;(3)调用CDC:SelectObject函数将位图对象选入内存设备环境中;(4)调用CDC:BitBlt或CDC:StretchBlt函数将位图复制到实际设备环境中。(5)使用之后,恢复原来的内存设备环境。,8.2图形设备接口,(1)创建一
23、个默认的单文档应用程序Ex_BMP。(2)按快捷键Ctrl+R,弹出“插入资源”对话框,选择Bitmap资源类型。(3)单击导入,将文件类型选择为“所有文件(*.*)”,从外部文件中选定一个位图文件,单击Import。保留默认的位图资源标识IDB_BITMAP1。(4)在CEx_BMPView:OnDraw函数中添加下列代码:void CEx_BMPView:OnDraw(CDC*pDC)CEx_BMPDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CBitmap m_bmp;m_bmp.LoadBitmap(IDB_BITMAP1);/调入位图资源BITM
24、AP bm;/定义一个BITMAP结构变量,以便获取位图参数m_bmp.GetObject(sizeof(BITMAP),/恢复原来的内存设备环境,8.2图形设备接口,(5)编译运行,如图。通过上述代码过程可以看出:位图的最终显示是通过调用CDC:BitBlt函数来完成的。除此之外,也可以使用CDC:StretchBlt函数。这两个函数的区别在于:StretchBlt函数可以对位图进行缩小或放大,而BitBlt则不能,但BitBlt的显示更新速度较快。它们的原型如下:BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xS
25、rc,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);,8.3图形绘制,画点、线 点 画点是通过调用CDC:SetPixel或CDC:SetPixelV函数来实现的。COLORREF SetPixel(int x,int y,COLORREF crColor);COLORREF SetPixel(POINT point,COLORREF crColor);B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形和文本 图形 和文 PPT 课件

链接地址:https://www.31ppt.com/p-5484570.html