《第五章 图形和文本输出优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第五章 图形和文本输出优秀PPT.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章 图形和文本输出第一页,本课件共有48页图形设备接口GDI(graphics device interface)矢量图形创建线和填充图形光栅图形位图文本输出以逻辑坐标为单位计算文本输出位置第二页,本课件共有48页绘图工具GDI对象GdiObjectCGdiObject是一个抽是一个抽象类,该类不能直接定象类,该类不能直接定义对象。必须使用它的义对象。必须使用它的派生类派生类第三页,本课件共有48页设备上下文DCdevice contextGDI创建用来代表设备连接的数据结构主要功能:允许应用程序使用一个输出设备提供窗口应用程序,设备驱动,和输出设备之间的连接保存当前信息,例如在一个窗口内
2、绘图使用的颜色,画笔的宽度、画刷的类型等等保存窗口剪取区域(clipping region),限制程序输出到输出设备中窗口覆盖的区域第四页,本课件共有48页设备上下文类CDCCObjectCDCCClientDCCMetaFileDCCPanitDCCWindowDC第五页,本课件共有48页OnDraw函数void CMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data here pDC-TextOut(1,1,”helloworld!”);第
3、六页,本课件共有48页WM_PAINT消息产生WM_PAINT消息的场合通常有 窗口移动后及最大化,最小化后的刷新。被覆盖区域的刷新,如下拉菜单覆盖的区域。无效区域产生后的刷新,如执行滚动条操作,将一区域移动至不可见。第七页,本课件共有48页WM_PAINT消息人为地生成一个绘制消息,重绘窗口 的方法:Invalidate(true);CRect rect(1,1,300,300);InvalidateRect(&Rect,true);第八页,本课件共有48页获取设备上下文 的方法接受一个参数为指向CDC对象的指针 void CMyView:OnDraw(CDC*pDC);构造CClientD
4、C对象 CClientDC dc(this);第九页,本课件共有48页接受一个参数为指向CDC对象的指针void CMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data here /在坐标为10,10的位置上画一点,颜色黑色 pDC-pDC-SetPixel(CPoint(10,10),RGB(0,0,0);SetPixel(CPoint(10,10),RGB(0,0,0);参数为指参数为指向向CDC对对象的指针象的指针第十页,本课件共有48页
5、构造构造CClientDC对对象象构造CClientDC对象 Void CMyView:OnLButtonDown(UNIT nFlags,CPoint point)/TODO:add draw code for native data here CClientDC dc(this);CClientDC dc(this);/this 指针将CMyView赋值给创建的dc对象 dc.SetPixel(point,RGB(255,0,0)dc.SetPixel(point,RGB(255,0,0);CView:OnLButtonDown(nFlags,point);CView:OnLButtonD
6、own(nFlags,point);第十一页,本课件共有48页任务1编写一个单文档MFC(EXE)程序,在视图类增加成员变量,追踪鼠标的左键双击位置的坐标,并输出详见例5-1 第十二页,本课件共有48页处理文本 设置文本颜色 设置文本显示属性 设置字体 格式化文本 文本输出函数 第十三页,本课件共有48页设置文本颜色COLORREFSetTextColor(COLORREFcrColor);COLORREFSetBkColor(COLORREFcrColor);第十四页,本课件共有48页颜色的表示第十五页,本课件共有48页/基本三元色基本三元色COLORREF crRed=RGB(255,0,
7、0);COLORREF crRed=RGB(255,0,0);COLORREF crGreen=RGB(0,255,0);COLORREF crGreen=RGB(0,255,0);COLORREF crBlue=RGB(0,0,255)COLORREF crBlue=RGB(0,0,255)/16-color/16-color设备支持颜色设备支持颜色const COLORREF g_crBlack=RGB(0,0,0);const COLORREF g_crBlack=RGB(0,0,0);const COLORREF g_crYellow=RGB(255,255,0);const COLO
8、RREF g_crYellow=RGB(255,255,0);const COLORREF g_crDkYellow=RGB(128,128,0);const COLORREF g_crDkYellow=RGB(128,128,0);const COLORREF g_crRed=RGB(255,0,0);const COLORREF g_crRed=RGB(255,0,0);const COLORREF g_ crDkRed=RGB(128,0,0);const COLORREF g_ crDkRed=RGB(128,0,0);const COLORREF g_crMagenta=RGB(25
9、5,0,255);const COLORREF g_crMagenta=RGB(255,0,255);const COLORREF g_ crDkMagenta=RGB(128,0,128);const COLORREF g_ crDkMagenta=RGB(128,0,128);const COLORREF g_crBlue=RGB(0,0,255);const COLORREF g_crBlue=RGB(0,0,255);constCOLORREFg_crDkBlue=RGB(0,0,128);第十六页,本课件共有48页void CMyView:OnDraw(CDC*pDC)void CM
10、yView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);ASSERT_VALID(pDoc);pDC-SetTextColor(RGB(255,0,0);pDC-SetTextColor(RGB(255,0,0);pDC-SetBkColor(RGB(0,0,0);pDC-SetBkColor(RGB(0,0,0);CString str;CString str;str.Format(str.Format(鼠标左键双击的位置是鼠标左键双击的位置是%d,%d,%d,%d
11、,m_LPoint.x,m_LPoint.y);m_LPoint.x,m_LPoint.y);pDC-TextOut(0,0,str);pDC-TextOut(0,0,str);第十七页,本课件共有48页设置文本显示属性 函数函数说明说明SetBkModeSetBkModeGetBkModeGetBkMode设置和获取背景模式设置和获取背景模式SetTextAlignSetTextAlignGetTextAlignGetTextAlign设置和获取对齐方式设置和获取对齐方式SetTextJusttification SetTextJusttification SetTextCharaterEx
12、traSetTextCharaterExtra调整文本调整文本第十八页,本课件共有48页设置字体 定义CFont对象调用CreateFont函数创建字体将创建的字体对象选入DC,并保存前一个被选入DC的字体对象第十九页,本课件共有48页void CMyView:OnDraw(CDC*pDC)void CMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);ASSERT_VALID(pDoc);CFont NewFont;CFont NewFont;NewFont.
13、CreateFont(65,65,0,0,FW_DONTCARE,NewFont.CreateFont(65,65,0,0,FW_DONTCARE,true,false,false,DEFAULT_CHARSET,true,false,false,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,DEFAULT_PITCH|FF
14、_DONTCARE,黑体黑体););CFont*pOldFont;CFont*pOldFont;pOldFont=pDC-SelectObject(&NewFont);pOldFont=pDC-SelectObject(&NewFont);pDC-TextOut(10,10,pDC-TextOut(10,10,字体效果字体效果););第二十页,本课件共有48页格式化文本 文本测量函数 GetTextExtent获取字符串高度和宽度GetTextMetrics 获取Textmetric类型数据,包含具体的字体测量信息第二十一页,本课件共有48页第二十二页,本课件共有48页文本输出函数 函数函数说
15、明说明TextOut在屏幕的固定位置用当前设定的颜色、字体、对齐方式输出文本TabbedTextOut与TextOut的功能相似,唯一差别是可以为支持制表符而定义一组制表站位置DrawText在一个区域中显示并格式化文本ExtTextOut与TextOut的功能相似,但可以使用该函数删去超出矩形的正文,用正文背景填充矩形,调整字符间隔。第二十三页,本课件共有48页任务2阅读单文档MFC(EXE)程序EXAM5_2中处理文本显示的OnDraw函数。请分析每一行的文本串作了哪些文本属性设置、格式设置和字体设置。详见例5-2 第二十四页,本课件共有48页文本属性文本属性格式化格式化字体字体文本串文本
16、串1 1红色红色默认字体默认字体文本串文本串2 2绿色绿色求下一行位置求下一行位置高高度度3030,宽宽度度1010,粗体,黑体字,粗体,黑体字文本串文本串3 3蓝色蓝色求求同同行行字字符符串串尾部位置尾部位置文本串文本串4 4灰色灰色求下一行位置求下一行位置高高度度3030,斜斜体体,下划线,大号字下划线,大号字分析结果:第二十五页,本课件共有48页任务1文本处理详见实验1第二十六页,本课件共有48页处理绘图 简单的图形输出 库存对象 设置绘图坐标系 创建和使用自定义画笔和画刷 第二十七页,本课件共有48页点点 pDC-SetPixel(CPoint(200,200),RGB(255,0,0
17、);pDC-SetPixel(CPoint(200,200),RGB(255,0,0);/在在200,200的位置画一个红点的位置画一个红点第二十八页,本课件共有48页线线 pDC-MoveTo(0,0);pDC-MoveTo(0,0);/在视图的左上角一个在视图的左上角一个X XpDC-LineTo(100,100);pDC-LineTo(100,100);pDC-MoveTo(0,100);pDC-MoveTo(0,100);pDC-LineTo(100,0);第二十九页,本课件共有48页矩形矩形 CRect rect(0,0,100,100);CRect rect(0,0,100,100
18、);/画一个长画一个长100100、宽、宽100100的矩形的矩形pDC-Rectangle(&rect);第三十页,本课件共有48页圆和椭圆圆和椭圆 CRect rect(0,0,100,100);/CRect rect(0,0,100,100);/在矩形内画圆在矩形内画圆pDC-Ellipse(&rect);pDC-Ellipse(&rect);CRect rect(0,0,50,100);/CRect rect(0,0,50,100);/在矩形内画椭圆在矩形内画椭圆pDC-Ellipse(&rect);第三十一页,本课件共有48页多边形多边形 CPoint poly4;/CPoint p
19、oly4;/画一个平行四边形画一个平行四边形poly0=CPoint(0,0);poly0=CPoint(0,0);poly1=CPoint(50,50);poly1=CPoint(50,50);poly2=CPoint(50,100);poly2=CPoint(50,100);poly3=CPoint(0,50);poly3=CPoint(0,50);pDC-Polygon(poly,4);第三十二页,本课件共有48页其它图形其它图形 CDC:Pie CDC:Pie 画饼图画饼图CDC:Chord CDC:Chord 画弦画弦CDC:FillRect CDC:FillRect 用用指指定定颜
20、颜色色填填充充矩矩形形且且不不画画边边线线CDC:Draw3DRect CDC:Draw3DRect 用于绘制名种用于绘制名种3D3D边框边框CDC:RoundRect画圆角矩形画圆角矩形第三十三页,本课件共有48页库存对象 库存对象是由操作系统维护的用于绘制屏幕的常用对象包括库存画笔,画刷,字体等使用SelectStockObject可以方便直接选择库存对象,修改系统默认值第三十四页,本课件共有48页程序清单512void CExam5View:OnDraw(CDC*pDC)void CExam5View:OnDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument()
21、;CExam5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);ASSERT_VALID(pDoc);/TODO:add draw code for native data here/TODO:add draw code for native data here CRect rect;CRect rect;rect.SetRect(CPoint(0,0),CPoint(200,200);rect.SetRect(CPoint(0,0),CPoint(200,200);pDC-SelectStockObject(WHITE_PEN);/pDC-SelectSto
22、ckObject(WHITE_PEN);/选用白色画笔选用白色画笔pDC-SelectStockObject(GRAY_BRUSH);/pDC-SelectStockObject(GRAY_BRUSH);/选用灰色画刷选用灰色画刷pDC-Rectangle(rect);pDC-Rectangle(rect);pDC-MoveTo(0,0);pDC-MoveTo(0,0);pDC-LineTo(200,200);pDC-LineTo(200,200);pDC-MoveTo(0,200);pDC-MoveTo(0,200);pDC-LineTo(200,0);pDC-LineTo(200,0);第
23、三十五页,本课件共有48页设置绘图坐标系 如果要把一幅大小为400mm800mm的图画在500像素200 像素的windows窗口中,我们把前者称为逻辑坐标,后者称为设备坐标。逻辑坐标逻辑坐标设备坐标设备坐标400mm800mm500像素像素200像素像素像素、厘米、毫米、英寸像素、厘米、毫米、英寸原点原点第三十六页,本课件共有48页映像模式 MMTEXT 默认的映像模式,原点在左上角,向右x增加,向下y增加 固定比例的映射模式 向右x增加,向下y减少 可变比例的映射模式 允许改变比例因子和原点。在用户改变窗口大小时,绘制的内容会随之改变。如果改变一个轴的比例,则所绘的图像也会在其它轴上相应的
24、改变。第三十七页,本课件共有48页修改映射模式CClientDC dc;CClientDC dc;int OldMode=dc.SetMapMode(MM_LOMETRIC);int OldMode=dc.SetMapMode(MM_LOMETRIC);第三十八页,本课件共有48页移动逻辑坐标系的原点 CRect rectCRect rect;GetClientRect(rect);GetClientRect(rect);pDC-SetViewportOrg(rect.width()/2,rect.height()/2);第三十九页,本课件共有48页使用逻辑坐标和设备坐标的场合 MFC的CDC
25、绘图函数都使用逻辑坐标为参数CWnd的成员函数一般使用设备坐标为参数返回鼠标位置作为屏幕位置测试时,一般使用设备坐标第四十页,本课件共有48页设备坐标系统分类工作区工作区(viewport)坐标系统坐标系统 窗口窗口(Windows)坐标系统坐标系统 屏幕屏幕(Screen)坐标系统坐标系统 MFC使用ClientToScreen和ScreenToClient两个函数,用于完成工作区坐标和屏幕坐标之间的转换工作。CDC也提供了成员函数LPToDP和DPToLP完成两种坐标之间的转换。第四十一页,本课件共有48页创建自定义画笔CPen pen;CPen pen;pen.Create(PS_SOL
26、D,2,RGB(255,0,0);第四十二页,本课件共有48页创建自定义画刷CBrush bs;CBrush bs;bs.CreateSolidBrush(RGB(255,0,0);bs.CreateSolidBrush(RGB(255,0,0);/创建一个红色的实心画刷创建一个红色的实心画刷bs.CreateHatchBrushbs.CreateHatchBrush(HS_CROSS,RGB(255,0,0);(HS_CROSS,RGB(255,0,0);/创建一个十字线阴影的红色画刷创建一个十字线阴影的红色画刷 第四十三页,本课件共有48页创建位图画刷CreatePatternBrushC
27、BitMap bmp;CBitMap bmp;bmp.LoadBitMap(IDB_MYBITMAP)bmp.LoadBitMap(IDB_MYBITMAP)CBrush bsCBrush bsbs.CreatePatternBrush(&bmp);第四十四页,本课件共有48页示例1示例中演示了使用和创建画笔和画刷。首先通过使用创建的蓝色,宽度为5的画笔画一个图形的边界,然后用当前的刷子填充这个图形来创建一个填充图形。共有三个填充图形:第一个是用深蓝色实心画刷填充的带圆角的矩形,第二个是用亮灰画刷填充的饼图,第三个是用阴影风格的画刷填充的椭圆。详见程序清单5-13 第四十五页,本课件共有48页示例2设置映像模式详见例5-3第四十六页,本课件共有48页示例3画笔和画刷的使用详见例5-4第四十七页,本课件共有48页任务2图形处理详见实验2第四十八页,本课件共有48页