图形文本和位图PPT教案_第1页
图形文本和位图PPT教案_第2页
图形文本和位图PPT教案_第3页
图形文本和位图PPT教案_第4页
图形文本和位图PPT教案_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、图形图形(txng)文本和位图文本和位图第一页,共83页。坐标(显示设备或打印设备坐标系下的坐标)相等。因此这个方块在1024 x 768的显示器上看起来要比在640 x 480的显示器上显得小一些,而且若将它打印在600dpi精度的激光打印机上,这个方块就会显得更小了。如表7.1所示。表表7.1 映射映射(yngsh)模式模式第1页/共83页第二页,共83页。第2页/共83页第三页,共83页。图7.1 改变(gibin)显示比例第3页/共83页第四页,共83页。第4页/共83页第五页,共83页。其中,其中,initCX和和initCY用来分别设置用来分别设置CSize的的cx和和cy成员。成

2、员。initSize用来指定一个用来指定一个SIZE结构结构(jigu)或或CSize对象来初始化对象来初始化CSize的成员。的成员。CRect类带参数的常用构造函数原型如下:类带参数的常用构造函数原型如下: CRect( int l, int t, int r, int b ); CRect( const RECT& srcRect ); CRect( LPCRECT lpSrcRect ); CRect( POINT point, SIZE size ); CRect( POINT topLeft, POINT bottomRight );第5页/共83页第六页,共83页。以及两

3、个矩形的以及两个矩形的“并并”和和“交交”操作,更多的常用操作操作,更多的常用操作如表如表7.2所示。所示。表表7.2 CRect类常用类常用(chn yn)的成员函数的成员函数第6页/共83页第七页,共83页。void InflateRect( int l, int t, int r, int b );其中,其中,x用来指定扩大用来指定扩大CRect左、右边的数左、右边的数值。值。y用来指定扩大用来指定扩大CRect上、下边的上、下边的数值。数值。size中的中的cx成员指定扩大左、右边成员指定扩大左、右边的数值,的数值,cy指定扩大上、下边的数值。指定扩大上、下边的数值。lpRect的各个

4、成员用来指定扩大每一边的的各个成员用来指定扩大每一边的数值。数值。l、t、r和和b分别用来指定扩大分别用来指定扩大CRect左、上、右和下边的数值。左、上、右和下边的数值。第7页/共83页第八页,共83页。两个矩形。例如:两个矩形。例如:CRect rectOne(125, 0, 150, 200);CRect rectTwo( 0, 75, 350, 95);CRect rectInter;rectInter.IntersectRect(rectOne, rectTwo);/ 结果为结果为(125, 75, 150, 95)ASSERT(rectInter = CRect(125, 75,

5、150, 95);rectInter.UnionRect (rectOne, rectTwo);/ 结果为结果为(0, 0, 350, 200)ASSERT(rectInter = CRect(0, 0, 350, 200);第8页/共83页第九页,共83页。图7.2 颜色(yns)对话框第9页/共83页第十页,共83页。第10页/共83页第十一页,共83页。表表7.3 MFC的的GDI类类第11页/共83页第十二页,共83页。第12页/共83页第十三页,共83页。void CEx_SDIView:OnDraw( CDC*pDC )CPen newPen( PS_SOLID, 2, RGB(0

6、,0,0) ) )pDC-SelectObject( &newPen );pDC-MoveTo(.); pDC-LineTo(.);/ 其他绘图函数其他绘图函数 pDC-SelectStockObject( BLACK_PEN );/ newPen被分离出来被分离出来第13页/共83页第十四页,共83页。BLACK_PEN NULL_PEN 空画笔WHITE_PEN 白色画笔DEVICE_DEFAULT_FONT 设备默认字体SYSTEM_FONT 系统字体第14页/共83页第十五页,共83页。(jindn)的几种属性,通常用在简单(jindn)的直线和曲线等场合。第15页/共83页第

7、十六页,共83页。表表7.4 修饰修饰(xish)画笔的风格画笔的风格第16页/共83页第十七页,共83页。创建画笔对象,它的作用(zuyng)与CreatePen函数是完全一样的,只是画笔的三个属性不是直接出现在函数参数中,而是通过一个LOGPEN结构间接地给出。BOOL CreatePenIndirect( LPLOGPEN lpLogPen );此函数用由LOGPEN结构指针指定的相关参数创建画笔,LOGPEN结构如下:typedef struct tagLOGPEN /*lgpn */ UINT lopnStyle;/ 画笔风格,同上 POINT lopnWidth; / POINT结

8、构的y不起作用(zuyng),而用x表示画笔宽度 COLORREF lopnColor;/ 画笔颜色 LOGPEN;第17页/共83页第十八页,共83页。识,如图7.3所示:HS_BDIAGONALHS_CROSSHS_DIAGCROSSHS_FDIAGONAL HS_HORIZONTAL HS_VERTICAL图7.3 画刷的填充样式第18页/共83页第十九页,共83页。式,而crColor表示画刷的填充色。与画笔相类似,也有一个LOGBRUSH 逻辑结构(jigu)用于画刷属性的定义,并通过 CBrush的成员函数CreateBrushIndirect来创建,其原型如下:BOOL Crea

9、teBrushIndirect( const LOGBRUSH* lpLogBrush );其中,LOGBRUSH 逻辑结构(jigu)如下定义:typedef struct tagLOGBRUSH / lb UINT lbStyle; / 风格 COLORREF lbColor; / 填充色 LONG lbHatch; / 填充样式 LOGBRUSH; 第19页/共83页第二十页,共83页。数数SetPixelV要比要比SetPixel快得快得多。多。COLORREF SetPixel( int x, int y, COLORREF crColor );COLORREF SetPixel(

10、POINT point, COLORREF crColor );BOOL SetPixelV(int x, int y, COLORREF crColor);BOOL SetPixelV( POINT point, COLORREF crColor );实际显示像素的颜色未必等同实际显示像素的颜色未必等同于于crColor所指定的颜色值,所指定的颜色值,因为有时受设备限因为有时受设备限制,不能显示制,不能显示crColor所指定所指定的颜色值,而只能取其近似值。的颜色值,而只能取其近似值。与上述函数相对应的与上述函数相对应的GetPixel函数是用来获取指定点的颜色。函数是用来获取指定点的颜色

11、。COLORREF GetPixel( int x, int y ) const;COLORREF GetPixel( POINT point ) const;第20页/共83页第二十一页,共83页。LineTo函数正是经当前位置所在点为直线起始点,另指定直线终点,画出一段直线的。其原型如下:BOOL LineTo( int x, int y );BOOL LineTo( POINT point );第21页/共83页第二十二页,共83页。BOOL Polyline( LPPOINT lpPoints, int nCount );BOOL PolylineTo( const POINT*lpP

12、oints, int nCount );这两个函数用来画一系列连续的折线。参这两个函数用来画一系列连续的折线。参数数(cnsh)lpPoints是是POINT或或CPoint的的顶点数顶点数组;组;nCount表示数组中顶点的个数,它至表示数组中顶点的个数,它至少为少为2。BOOL PolyPolyline( const POINT*lpPoints, const DWORD* lpPolyPoints, int nCount );此函数可用来绘制多条折线。其中此函数可用来绘制多条折线。其中lpPoints同前定义,同前定义,lpPolyPoints表示各表示各条折线条折线所需的顶点数,所需的

13、顶点数,nCount表示折线的数目。表示折线的数目。第22页/共83页第二十三页,共83页。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表示绘制圆角的椭圆大小,表示绘制圆角的椭圆大小,如图如图7.4所示。所示。图7.4 圆角矩形(jxng)图7.5

14、 多边形填充模式第23页/共83页第二十四页,共83页。第24页/共83页第二十五页,共83页。异。例如,要画一个三角形,使用异。例如,要画一个三角形,使用Polyline函数,顶点数组中就得给出四个顶点函数,顶点数组中就得给出四个顶点(尽管始点和终点重复出现尽管始点和终点重复出现),而用,而用Polygon函数则只需给出三个顶点。函数则只需给出三个顶点。与与PolyPolyline可画多条折线一样,使用可画多条折线一样,使用PolyPolygon函数,一次可画出多个多边函数,一次可画出多个多边形,这两个函数的参数形式和含义也一样。形,这两个函数的参数形式和含义也一样。BOOL PolyPol

15、ygon( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount );第25页/共83页第二十六页,共83页。POINT ptStart, POINT ptEnd );这里,这里,x1,y1,x2,y2或或lpRect用用来指定外接矩形的位置和大小,来指定外接矩形的位置和大小,而椭圆中心与点而椭圆中心与点(x3,y3)或或ptStart所构成的射线所构成的射线与椭圆的交点就成为椭圆弧线与椭圆的交点就成为椭圆弧线的起始点,椭圆中心的起始点,椭圆中心与点与点(x4,y4)或或ptEnd所构成的所构成的射线与椭圆的交点就成为椭圆射线与椭圆的交点就成为椭圆弧

16、线的终点。椭圆上弧线的终点。椭圆上弧线始点到终点的部分是要绘弧线始点到终点的部分是要绘制的椭圆弧,如图制的椭圆弧,如图7.6所示。所示。图7.6 弧线中心外接矩形弧线(x1,y1)(x2,y2)起点坐标终点坐标第26页/共83页第二十七页,共83页。int x3, int y3, int x4, int y4 );BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );图7.7 弦形中心外接矩形弦形(x1,y1)(x2,y2)起点坐标终点坐标图7.8 扇形中心外接矩形扇形(x1,y1)(x2,y2)起点坐标终点坐标第27页/共83页第二十八

17、页,共83页。P1P2P3P4图7.9 Bzier曲线第28页/共83页第二十九页,共83页。线的终点作为自己的起始端点。函数PolyBezier不使用也不更新当前位置。如果需要使用当前位置,那么就应该使用PolyBezierTo函数。 BOOL PolyBezierTo( const POINT*lpPoints, int nCount );第29页/共83页第三十页,共83页。图7.10 Ex_Draw运行(ynxng)结果第30页/共83页第三十一页,共83页。int nScoreNum = 0, 0, 0, 0, 0;/ 各成绩段的人数的初始值各成绩段的人数的初始值/ 下面是用来统计各

18、分数段的人数下面是用来统计各分数段的人数for (int i=0; inNum; i+) int nSeg = (int)(fScorei) / 10;/ 取数的取数的十十位上的值位上的值if (nSeg 6)nSeg = 5;/ 90分数段分数段nScoreNumnSeg - 5 +;/ 各分数段计数各分数段计数int nSegNum = sizeof(nScoreNum)/sizeof(int);/ 计计算有多少个分数段算有多少个分数段第31页/共83页第三十二页,共83页。第32页/共83页第三十三页,共83页。第33页/共83页第三十四页,共83页。第34页/共83页第三十五页,共83

19、页。第35页/共83页第三十六页,共83页。通常用字符高度来描述。字体尺寸可以取毫米或英寸作为单位,但为了直观起见,也常常采用一种称为“点”的单位,一点约折合为1/72英寸。第36页/共83页第三十七页,共83页。向LONG lfWeight; / 字体的粗细程度BYTE lfItalic; / 斜体标志BYTE lfUnderline; / 下划线标志BYTE lfStrikeOut; / 删除(shnch)线标志BYTE lfCharSet; / 字符集,汉字必须为GB2312_CHARSETTCHAR lfFaceNameLF_FACESIZE;/ 字样名称/ LOGFONT; 第37页

20、/共83页第三十八页,共83页。lf.lfHeight = -13;lf.lfCharSet = GB2312_CHARSET;strcpy(LPSTR)&(lf.lfFaceName), 黑体);/ 用逻辑字体结构创建字体CFontcf;cf.CreateFontIndirect(&lf); / 在设备环境中使用字体CFont* oldfont = pDC-SelectObject(&cf);pDC-TextOut(100,100,Hello);pDC-SelectObject(oldfont);/ 恢复设备环境原来的属性cf.DeleteObject();/ 删除字

21、体对象第38页/共83页第三十九页,共83页。图7.11 字体(zt)对话框第39页/共83页第四十页,共83页。第40页/共83页第四十一页,共83页。pDC-SetTextColor(dlg.GetColor();cf.CreateFontIndirect(&lf); .第41页/共83页第四十二页,共83页。来的文本效果更佳;如果要在一个矩形区域内绘制多行文本,那么采用DrawText函数,会更富于效率;如果文本和图形结合紧密,字符间隔不等,并要求有背景颜色或矩形裁剪特性,那么ExtTextOut函数将是最好的选择。如果没有什么特殊要求,那使用TextOut函数就显得简练了。下面

22、介绍TextOut、TabbedTextOut和DrawText函数。virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );BOOL TextOut( int x, int y, const CString& str );第42页/共83页第四十三页,共83页。lpnTabStopPositions, intnTabOrigin );virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat );in

23、t DrawText( const CString& str, LPRECT lpRect, UINT nFormat );第43页/共83页第四十四页,共83页。第44页/共83页第四十五页,共83页。第45页/共83页第四十六页,共83页。图7.12 Ex_DrawText运行(ynxng)结果第46页/共83页第四十七页,共83页。const;int SetBkMode( int nBkMode );int GetBkMode( ) const;其中,nBkMode用来指定(zhdng)文本背景模式,它可以是OPAQUE或TRANSPARENT (透明)。文本对齐方式的设置和获取

24、是由CDC函数SetTextAlign和GetTextAlign决定的。它们的原型如下:UINT SetTextAlign( UINT nFlags );UINT GetTextAlign( ) const;第47页/共83页第四十八页,共83页。“|”操作符。表表7.5 文本文本(wnbn)对齐标志对齐标志第48页/共83页第四十九页,共83页。 / tm int tmHeight; / 字符的高度 (ascent + descent) int tmAscent; / 高于基准线部分的值 int tmDescent;/ 低于基准线部分的值 int tmInternalLeading; / 字

25、符内标高 int tmExternalLeading; / 字符外标高 int tmAveCharWidth; / 字体中字符平均宽度 int tmMaxCharWidth; / 字符的最大宽度/ TEXTMETRIC; 第49页/共83页第五十页,共83页。CString& str, int nTabPositions, LPINT lpnTabStopPositions ) const;其中,参数lpszString和str表示要计算的字符串,nCount表示字符串的字节长度, nTabPositions表示lpnTabStopPositions数组的大小,lpnTabStopPo

26、sitions表示多个递增的制表位(逻辑坐标)的数组。函数返回当前设备环境下的一行字符串的宽度(CSize的cx)和高度(CSize的cy)。第50页/共83页第五十一页,共83页。第51页/共83页第五十二页,共83页。m_lfText.lfCharSet = GB2312_CHARSET;strcpy(m_lfText.lfFaceName, 宋体);第52页/共83页第五十三页,共83页。 dlg.GetCurrentFont(&m_lfText);Invalidate();CScrollView:OnLButtonDblClk(nFlags, point);这样,当双击鼠标左键

27、后,就会弹出字体对话框,从中可改变字体的属性,单击确定按钮后,执行CEx_TextView:OnDraw中的代码。第53页/共83页第五十四页,共83页。第54页/共83页第五十五页,共83页。第55页/共83页第五十六页,共83页。图7.13 Ex_Text运行(ynxng)结果第56页/共83页第五十七页,共83页。图”工具相似,因此它的具体绘制操作在这里不再重复。这里仅讨论下列一些常用操作。如创建新的图标和光标、选用或定制显示设备和设置光标“热点”等。第57页/共83页第五十八页,共83页。出现的图形编辑器。出现的图形编辑器。图7.14 添加(tin ji)图标后的图形编辑器新设备按钮第

28、58页/共83页第五十九页,共83页。表表7.6 创建图标或光标时可选用的显示创建图标或光标时可选用的显示(xinsh)设备设备第59页/共83页第六十页,共83页。可指定新设备的大小和颜色。可指定新设备的大小和颜色。图7.15 图像设备(shbi)选择对话框图 图7.16 显示设备的定制 第60页/共83页第六十一页,共83页。控制(kngzh)条设置热点按钮图7.17 添加光标后的图形编辑器第61页/共83页第六十二页,共83页。第62页/共83页第六十三页,共83页。图在内图在内存中保存下来,并与指定设备存中保存下来,并与指定设备(窗口设备窗口设备)环环境境(hunjng)相兼容;相兼容

29、;(3) 调用调用CDC:SelectObject函数将位图对函数将位图对象选入内存设备环境象选入内存设备环境(hunjng)中;中;(4) 调用调用CDC:BitBlt或或CDC:StretchBlt函函数将位图复制到实际设备环境数将位图复制到实际设备环境(hunjng)中。中。(5) 使用之后,恢复原来的内存设备环境使用之后,恢复原来的内存设备环境(hunjng)。第63页/共83页第六十四页,共83页。IDB_BITMAP1。第64页/共83页第六十五页,共83页。第65页/共83页第六十六页,共83页。图7.18 Ex_BMP运行结果第66页/共83页第六十七页,共83页。名和标名和标

30、识。函数返回的是一个图标句柄。识。函数返回的是一个图标句柄。第67页/共83页第六十八页,共83页。IDI_HAND 手形图标(用于严重警告)IDI_QUESTION 问号图标(用于提示消息)IDI_EXCLAMATION 警告消息图标(惊叹号)IDI_ASTERISK 消息图标全局函数DestroyIcon可以用来删除一个图标,并释放为图标分配的内存,其原型如下:BOOL DestroyIcon( HICON hIcon );其中,hIcon用来指定要删除的图标句柄。第68页/共83页第六十九页,共83页。第69页/共83页第七十页,共83页。int nIndex, LONG dwNewLo

31、ng);DWORD GetClassLong( HWND hWnd, int nIndex);其中,其中,hWnd用来指定窗口类句柄,用来指定窗口类句柄,dwNewLong 用来指定新的用来指定新的32位值。位值。nIndex用来指定与用来指定与WNDCLASSEX结构相关的索结构相关的索引,它可以是下列值之一:引,它可以是下列值之一:GCL_HBRBACKGROUND 窗口类的窗口类的背景画刷句柄背景画刷句柄GCL_HCURSOR 窗口类的窗口类的的光标句柄的光标句柄GCL_HICON窗口类的的图窗口类的的图标句柄标句柄GCL_MENUNAME 窗口类的的菜窗口类的的菜单资源名称单资源名称第

32、70页/共83页第七十一页,共83页。果如图果如图7.19所示。所示。图7.19 创建(chungjin)的四个图标第71页/共83页第七十二页,共83页。(HICON)GetClassLong(m_hWnd, GCL_HICON);if (hIconNew != hIconOld) DestroyIcon(hIconOld);SetClassLong(m_hWnd, GCL_HICON, (long)hIconNew);RedrawWindow();/ 重绘窗口第72页/共83页第七十三页,共83页。SetTimer(1, 500, NULL);return 0;第73页/共83页第七十四页

33、,共83页。IDI_ICON3, IDI_ICON4;static int index = 0;ChangeIcon(iconsindex);index+;if (index3) index = 0;CFrameWnd:OnTimer(nIDEvent);OnTimer函数(hnsh)的参数nIDEvent用来表示发送WM_TIMER消息的计时器的标识值。第74页/共83页第七十五页,共83页。其函数参数值用指定要停用的计时器标识值。(8) 编译并运行。可以看到任务栏上的按钮以及应用程序的标题栏上四个图标循环显示的动态效果,显示速度为每秒两帧。第75页/共83页第七十六页,共83页。第76页/共83页第七十七页,共83页。其中,其中,lpszResourceName和和nIDResource分别用来指定光分别用来指定光标资源的名称或标资源的名称或ID号。号。例如,当光标资源为例如,当光标资源为IDC_CURSOR1时,则可使用时,则可使用(shyng)下列代码:下列代码:HCURSOR hCursor;hCursor = AfxGetApp()-LoadCursor(I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论