第五章 图形和文本输出PPT讲稿.ppt
第五章 图形和文本输出第1页,共48页,编辑于2022年,星期三图形设备接口GDI(graphics device interface)矢量图形创建线和填充图形光栅图形位图文本输出以逻辑坐标为单位计算文本输出位置第2页,共48页,编辑于2022年,星期三绘图工具GDI对象GdiObjectCGdiObject是一个抽象类,是一个抽象类,该类不能直接定义对象。该类不能直接定义对象。必须使用它的派生类必须使用它的派生类第3页,共48页,编辑于2022年,星期三设备上下文DCdevice contextGDI创建用来代表设备连接的数据结构主要功能:允许应用程序使用一个输出设备提供窗口应用程序,设备驱动,和输出设备之间的连接保存当前信息,例如在一个窗口内绘图使用的颜色,画笔的宽度、画刷的类型等等保存窗口剪取区域(clipping region),限制程序输出到输出设备中窗口覆盖的区域第4页,共48页,编辑于2022年,星期三设备上下文类CDCCObjectCDCCClientDCCMetaFileDCCPanitDCCWindowDC第5页,共48页,编辑于2022年,星期三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!”);第6页,共48页,编辑于2022年,星期三WM_PAINT消息产生WM_PAINT消息的场合通常有 窗口移动后及最大化,最小化后的刷新。被覆盖区域的刷新,如下拉菜单覆盖的区域。无效区域产生后的刷新,如执行滚动条操作,将一区域移动至不可见。第7页,共48页,编辑于2022年,星期三WM_PAINT消息人为地生成一个绘制消息,重绘窗口 的方法:Invalidate(true);CRect rect(1,1,300,300);InvalidateRect(&Rect,true);第8页,共48页,编辑于2022年,星期三获取设备上下文 的方法接受一个参数为指向CDC对象的指针 void CMyView:OnDraw(CDC*pDC);构造CClientDC对象 CClientDC dc(this);第9页,共48页,编辑于2022年,星期三接受一个参数为指向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对象的对象的指针指针第10页,共48页,编辑于2022年,星期三构造构造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:OnLButtonDown(nFlags,point);第11页,共48页,编辑于2022年,星期三任务1编写一个单文档MFC(EXE)程序,在视图类增加成员变量,追踪鼠标的左键双击位置的坐标,并输出详见例5-1 第12页,共48页,编辑于2022年,星期三处理文本 设置文本颜色 设置文本显示属性 设置字体 格式化文本 文本输出函数 第13页,共48页,编辑于2022年,星期三设置文本颜色COLORREFSetTextColor(COLORREFcrColor);COLORREFSetBkColor(COLORREFcrColor);第14页,共48页,编辑于2022年,星期三颜色的表示第15页,共48页,编辑于2022年,星期三/基本三元色基本三元色COLORREF crRed=RGB(255,0,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 COLORREF 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(255,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);第16页,共48页,编辑于2022年,星期三void CMyView:OnDraw(CDC*pDC)void CMyView: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,m_LPoint.x,m_LPoint.y);m_LPoint.x,m_LPoint.y);pDC-TextOut(0,0,str);pDC-TextOut(0,0,str);第17页,共48页,编辑于2022年,星期三设置文本显示属性 函数函数说明说明SetBkModeSetBkModeGetBkModeGetBkMode设置和获取背景模式设置和获取背景模式SetTextAlignSetTextAlignGetTextAlignGetTextAlign设置和获取对齐方式设置和获取对齐方式SetTextJusttification SetTextJusttification SetTextCharaterExtraSetTextCharaterExtra调整文本调整文本第18页,共48页,编辑于2022年,星期三设置字体 定义CFont对象调用CreateFont函数创建字体将创建的字体对象选入DC,并保存前一个被选入DC的字体对象第19页,共48页,编辑于2022年,星期三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.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_DONTCARE,黑体黑体););CFont*pOldFont;CFont*pOldFont;pOldFont=pDC-SelectObject(&NewFont);pOldFont=pDC-SelectObject(&NewFont);pDC-TextOut(10,10,pDC-TextOut(10,10,字体效果字体效果););第20页,共48页,编辑于2022年,星期三格式化文本 文本测量函数 GetTextExtent获取字符串高度和宽度GetTextMetrics 获取Textmetric类型数据,包含具体的字体测量信息第21页,共48页,编辑于2022年,星期三第22页,共48页,编辑于2022年,星期三文本输出函数 函数函数说明说明TextOut在屏幕的固定位置用当前设定的颜色、字体、对齐方式输出文本TabbedTextOut与TextOut的功能相似,唯一差别是可以为支持制表符而定义一组制表站位置DrawText在一个区域中显示并格式化文本ExtTextOut与TextOut的功能相似,但可以使用该函数删去超出矩形的正文,用正文背景填充矩形,调整字符间隔。第23页,共48页,编辑于2022年,星期三任务2阅读单文档MFC(EXE)程序EXAM5_2中处理文本显示的OnDraw函数。请分析每一行的文本串作了哪些文本属性设置、格式设置和字体设置。详见例5-2 第24页,共48页,编辑于2022年,星期三文本属性文本属性格式化格式化字体字体文本串文本串1 1红色红色默认字体默认字体文本串文本串2 2绿色绿色求下一行位置求下一行位置高高度度3030,宽宽度度1010,粗体,黑体字,粗体,黑体字文本串文本串3 3蓝色蓝色求求同同行行字字符符串串尾部位置尾部位置文本串文本串4 4灰色灰色求下一行位置求下一行位置高高度度3030,斜斜体体,下划线,大号字下划线,大号字分析结果:第25页,共48页,编辑于2022年,星期三任务1文本处理详见实验1第26页,共48页,编辑于2022年,星期三处理绘图 简单的图形输出 库存对象 设置绘图坐标系 创建和使用自定义画笔和画刷 第27页,共48页,编辑于2022年,星期三点点 pDC-SetPixel(CPoint(200,200),RGB(255,0,0);pDC-SetPixel(CPoint(200,200),RGB(255,0,0);/在在200,200的位置画一个红点的位置画一个红点第28页,共48页,编辑于2022年,星期三线线 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);第29页,共48页,编辑于2022年,星期三矩形矩形 CRect rect(0,0,100,100);CRect rect(0,0,100,100);/画一个长画一个长100100、宽、宽100100的矩形的矩形pDC-Rectangle(&rect);第30页,共48页,编辑于2022年,星期三圆和椭圆圆和椭圆 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);第31页,共48页,编辑于2022年,星期三多边形多边形 CPoint poly4;/CPoint poly4;/画一个平行四边形画一个平行四边形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);第32页,共48页,编辑于2022年,星期三其它图形其它图形 CDC:Pie CDC:Pie 画饼图画饼图CDC:Chord CDC:Chord 画弦画弦CDC:FillRect CDC:FillRect 用用指指定定颜颜色色填填充充矩矩形形且且不不画画边边线线CDC:Draw3DRect CDC:Draw3DRect 用于绘制名种用于绘制名种3D3D边框边框CDC:RoundRect画圆角矩形画圆角矩形第33页,共48页,编辑于2022年,星期三库存对象 库存对象是由操作系统维护的用于绘制屏幕的常用对象包括库存画笔,画刷,字体等使用SelectStockObject可以方便直接选择库存对象,修改系统默认值第34页,共48页,编辑于2022年,星期三程序清单512void CExam5View:OnDraw(CDC*pDC)void CExam5View:OnDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument();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-SelectStockObject(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);第35页,共48页,编辑于2022年,星期三设置绘图坐标系 如果要把一幅大小为400mm800mm的图画在500像素200 像素的windows窗口中,我们把前者称为逻辑坐标,后者称为设备坐标。逻辑坐标逻辑坐标设备坐标设备坐标400mm800mm500像素像素200像素像素像素、厘米、毫米、英寸像素、厘米、毫米、英寸原点原点第36页,共48页,编辑于2022年,星期三映像模式 MMTEXT 默认的映像模式,原点在左上角,向右x增加,向下y增加 固定比例的映射模式 向右x增加,向下y减少 可变比例的映射模式 允许改变比例因子和原点。在用户改变窗口大小时,绘制的内容会随之改变。如果改变一个轴的比例,则所绘的图像也会在其它轴上相应的改变。第37页,共48页,编辑于2022年,星期三修改映射模式CClientDC dc;CClientDC dc;int OldMode=dc.SetMapMode(MM_LOMETRIC);int OldMode=dc.SetMapMode(MM_LOMETRIC);第38页,共48页,编辑于2022年,星期三移动逻辑坐标系的原点 CRect rectCRect rect;GetClientRect(rect);GetClientRect(rect);pDC-SetViewportOrg(rect.width()/2,rect.height()/2);第39页,共48页,编辑于2022年,星期三使用逻辑坐标和设备坐标的场合 MFC的CDC绘图函数都使用逻辑坐标为参数CWnd的成员函数一般使用设备坐标为参数返回鼠标位置作为屏幕位置测试时,一般使用设备坐标第40页,共48页,编辑于2022年,星期三设备坐标系统分类工作区工作区(viewport)坐标系统坐标系统 窗口窗口(Windows)坐标系统坐标系统 屏幕屏幕(Screen)坐标系统坐标系统 MFC使用ClientToScreen和ScreenToClient两个函数,用于完成工作区坐标和屏幕坐标之间的转换工作。CDC也提供了成员函数LPToDP和DPToLP完成两种坐标之间的转换。第41页,共48页,编辑于2022年,星期三创建自定义画笔CPen pen;CPen pen;pen.Create(PS_SOLD,2,RGB(255,0,0);第42页,共48页,编辑于2022年,星期三创建自定义画刷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);/创建一个十字线阴影的红色画刷创建一个十字线阴影的红色画刷 第43页,共48页,编辑于2022年,星期三创建位图画刷CreatePatternBrushCBitMap bmp;CBitMap bmp;bmp.LoadBitMap(IDB_MYBITMAP)bmp.LoadBitMap(IDB_MYBITMAP)CBrush bsCBrush bsbs.CreatePatternBrush(&bmp);第44页,共48页,编辑于2022年,星期三示例1示例中演示了使用和创建画笔和画刷。首先通过使用创建的蓝色,宽度为5的画笔画一个图形的边界,然后用当前的刷子填充这个图形来创建一个填充图形。共有三个填充图形:第一个是用深蓝色实心画刷填充的带圆角的矩形,第二个是用亮灰画刷填充的饼图,第三个是用阴影风格的画刷填充的椭圆。详见程序清单5-13 第45页,共48页,编辑于2022年,星期三示例2设置映像模式详见例5-3第46页,共48页,编辑于2022年,星期三示例3画笔和画刷的使用详见例5-4第47页,共48页,编辑于2022年,星期三任务2图形处理详见实验2第48页,共48页,编辑于2022年,星期三