《可视化编程》PPT课件.ppt
1,第4章 GDI与Windows绘图,设备环境类绘图工具绘图函数文本处理位图与位操作图标与光标,2,设备文本的概念,设备文本用于程序的可视化输出设备文本提供一张画布,可在上面书写文字,或绘制点、直线、曲线等图形既可通过屏幕显示,还可通过打印机等设备输出,应用程序,GDI,设备驱动程序,输出设备,3,设备环境类(1),CDC:MFC的设备文本基类CClientDC:客户区(不包括边框、标题栏和菜单栏)的设备文本类CWindowDC:程序窗口的设备文本类CPaintDC:OnPaint函数使用的设备文本类CMetaFileDC:图元文件的设备文本类,4,设备环境类(2),画线程序的例子(CDC)(添加start),void CTestView:OnLButtonUp(UINT nFlags,CPoint point)CDC*pDC=GetDC();pDC-MoveTo(start);pDC-LineTo(point);ReleaseDC(pDC);,5,设备环境类(3),画线程序的例子(CClientDC),void CTestView:OnLButtonUp(UINT nFlags,CPoint point)CClientDC dc(this);/CClientDC dc(GetParent();dc.MoveTo(start);dc.LineTo(point);,6,设备环境类(4),画线程序的例子(CWindowDC),void CTestView:OnLButtonUp(UINT nFlags,CPoint point)CWindowDC dc(this);/CWindowDC dc(GetParent();/CWindowDC dc(GetDesktopWindow();dc.MoveTo(start);dc.LineTo(point);,7,设备环境类(5),8,绘图的基本方法,通过CClientDC构造对象通过GetDC获得设备环境指针,CClientDC dc(this);dc.Ellipse(10,10,200,200);,CDC*pDC=GetDC();pDC-Ellipse(10,10,200,200);ReleaseDC(pDC);,9,CPoint、CSize与CRect(1),CPoint:封装POINT结构的类定义一个点坐标,成员为x、yCRect:封装RECT结构的类定义一个矩形区域,成员为left、right、top、bottomCSize:封装SIZE结构的类定义矩形区域的大小,成员为cx、cy,10,CPoint、CSize与CRect(2),CPoint类的例子,POINT p;p.x=10;p.y=10;pDC-TextOut(p.x,p.y,POINT为一个结构,成员只有x,y);CPoint q,q1(10,10),q2(0,90);q=q1+q2;pDC-TextOut(q.x,q.y,CPoint为一个类,封装POINT结构,成员有x,y等);,11,绘图工具(1),设备文本类(CDC)提供绘图工具,例如CPen、CBrush与CFont等,基类是CGdiObject默认的画笔是黑色,宽度是一个像素,默认的画刷是白色颜色由RGB值来指定RGB(Red,Green,Blue)0 x 00 FF FF FF B G R,12,绘图工具(2),库存画刷的类型,13,绘图工具(3),SelectStockObject的例子,pDC-SelectStockObject(BLACK_PEN);pDC-MoveTo(10,100);pDC-LineTo(550,100);pDC-SelectStockObject(LTGRAY_BRUSH);pDC-Ellipse(50,50,150,150);pDC-SelectStockObject(DKGRAY_BRUSH);pDC-Ellipse(200,50,350,150);pDC-SelectStockObject(NULL_BRUSH);pDC-Rectangle(400,50,500,150);,14,自定义画笔(1),单步构造方法两步构造方法画笔风格是实线,宽度是5,颜色是蓝色,CPen NewPen(PS_SOLID,5,RGB(0,0,255);,CPen NewPen;NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);,15,自定义画笔(2),库存画笔的类型(除实线外,宽度为1),16,自定义画笔(3),自定义画笔的例子,CPen NewPen;CPen*pOldPen;NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);pOldPen=pDC-SelectObject(,17,自定义画笔(4),18,自定义画刷(1),实心(solid)风格CreateSolidBrush(COLORREF crColor);网格(hatched)风格CreateHatchBrush(int nIndex,COLORREF crColor);模式(patterned)风格CreatePatternBrush(CBitmap*pBitmap);,19,自定义画刷(2),20,自定义画刷(3),自定义画刷的例子,CBrush NewBrush;CBrush*pOldBrush;NewBrush.CreateHatchBrush(HS_CROSS,RGB(0,0,255);pOldBrush=pDC-SelectObject(,21,自定义画刷(4),22,绘图函数(1),绘图函数的坐标是逻辑单位。默认的左上角坐标为(0,0),逻辑单位为像素绘图函数设置像素(SetPixel)、当前位置(Moveto)、画直线(Lineto)、画弧线(Arc)、画矩形(Rectangle)、画椭圆(Ellipse)、画饼图(Pie)、画多边型(Polygon),23,绘图函数(2),圆角矩形弧线,pDC-Rectangle(100,100,300,200);pDC-MoveTo(200,150);pDC-LineTo(300,175);pDC-MoveTo(200,150);pDC-LineTo(125,100);pDC-Arc(100,100,300,200,300,175,125,100);,pDC-Rectangle(100,100,300,200);pDC-RoundRect(100,100,300,200,50,40);,24,绘图函数(3),饼图多边形,pDC-Rectangle(100,100,300,200);pDC-Pie(100,100,300,200,300,100,100,100);,CPoint point4;point0.x=100;point0.y=100;point1.x=200;point1.y=200;point2.x=200;point2.y=100;point3.x=100;point3.y=200;pDC-Polygon(point,4);,25,绘图函数(4),用点线画矩形边框(DrawFocusRect)用画刷填充矩形,不画边框(FillRect),pDC-DrawFocusRect(CRect(100,100,200,200);,CBrush NewBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pDC-SelectObject(,26,绘图函数(5),用画刷画矩形边框,不填充内部(FrameRect),CBrush NewBrush;CBrush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(,27,绘图函数(6),在矩形区域中反显颜色(InvertRect),CPen NewPen;CPen*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255);pOldPen=pDC-SelectObject(,28,绘图模式(1),绘图模式指定画笔颜色和现有颜色的处理SetROP2(int nDrawMode)绘图模式R2_COPYPEN(画笔颜色)R2_NOT(画笔颜色取反)R2_XORPEN(显示颜色与画笔颜色异或),29,绘图模式(2),R2_NOT的例子蓝色(0 x00FF0000)反色为黄色(0 x0000FFFF)白色(0 x00FFFFFF)反色为黑色(0 x00000000)在CTestView:OnDraw()中,CBrush NewBrush;CBrush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(,30,绘图模式(3),在CTestView:OnLButtonDown()中,CDC*pDC=GetDC();CPen NewPen;CPen*pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255);pOldPen=pDC-SelectObject(,31,绘图模式(4),32,绘图模式(5),R2_XORPEN的例子0 x00FF00000 x00FF0000=0 x000000000 x00FFFFFF0 x00FF0000=0 x0000FFFF在CTestView:OnDraw()中,CBrush NewBrush;CBrush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(,33,绘图模式(6),在CTestView:OnLButtonDown()中,CDC*pDC=GetDC();CPen NewPen;CPen*pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255);pOldPen=pDC-SelectObject(,34,绘图模式(7),35,CRgn与区域(1),设置区域保证绘图时不超过给定范围MFC的CRgn封装区域,其成员函数有:CreateRectRgn、CreateEllipseRgn、CreatePolygonRgn等CombineRgn用于将新的区域合并CDC的FillClipRgn或PaintRgnyong填充区域,SelectClipRgn设置剪裁区域,SelectObject将区域选入设备文本,36,CRgn与区域(2),在CTestView:OnDraw()中,pDC-DrawFocusRect(CRect(10,10,200,200);CRgn rgn;rgn.CreateRectRgn(10,10,200,200);pDC-SelectObject(rgn);pDC-MoveTo(0,50);pDC-LineTo(300,50);pDC-MoveTo(50,0);pDC-LineTo(50,300);,37,CRgn与区域(3),38,映射模式(1),在视图窗口绘制图形时,给定的坐标为逻辑坐标,视图对象的实际坐标为设备坐标绘图函数的坐标是逻辑坐标,鼠标消息处理函数的坐标是设备坐标映射模式定义逻辑坐标与设备坐标单位的关系约束映射模式:比例因子固定非约束映射模式:由矩形区域推导出比例因子及轴向,39,映射模式(2),CDC的SetMapMode用于设置映射模式LPtoDP:逻辑坐标转为设备坐标DPtoLP:设备坐标转为逻辑坐标MM_TEXT:默认映射模式,每个单位映射为一个像素,X轴向右、Y轴向下MM_HIENGLISH:每个单位映射成0.001英寸,X轴向右、Y轴向上,40,映射模式(3),MM_TEXT与MM_HIENGLISH的区别,pDC-SetMapMode(MM_TEXT);CRect rect;GetClientRect(,41,文本处理(1),文本输出函数TextOut:在指定位置输出文本DrawText:在指定矩形区域输出文本ExtTextOut:在指定位置输出文本,并使用当前选择字体TabbedTextOut:在指定位置输出文本,并使用指定的字符间距,42,文本处理(2),文本属性设置函数SetBkMode:设置背景模式SetBkColor:设置背景颜色SetTextColor:设置文本颜色SetTextAlign:设置文本对齐方式SetTextCharacterExtra:设置字符间隔值,43,文本处理(3),文本属性设置的例子,pDC-SetBkMode(OPAQUE);pDC-SetBkColor(RGB(0,255,255);pDC-SetTextColor(RGB(0,0,255);pDC-SetTextAlign(TA_CENTER|TA_BOTTOM);pDC-SetTextCharacterExtra(10);pDC-TextOut(100,50,设置文本属性);pDC-MoveTo(0,50);pDC-LineTo(200,50);pDC-MoveTo(100,0);pDC-LineTo(100,100);,44,文本处理(4),45,字符属性(1),字符属性包括:字符大小、行距,typedef struct tagTEXTMETRIC LONG tmHeight;/字符高度 LONG tmAscent;/字符上升高度 LONG tmDescent;/字符下降高度 LONG tmExternalLeading;/行间距 TEXTMETRIC;,46,字符属性(2),tmAscent与tmDescent的含义,47,字符属性(3),字符属性的例子,TEXTMETRIC tm;pDC-GetTextMetrics(,48,字符属性(4),CString str;CSize sz;sz=pDC-GetTextExtent(字);str.Format(字的宽度=%d,高度=%d,sz.cx,sz.cy);pDC-TextOut(50,50,str);sz=pDC-GetTextExtent(a);str.Format(a的宽度=%d,高度=%d,sz.cx,sz.cy);pDC-TextOut(50,100,str);sz=pDC-GetTextExtent(m);str.Format(m的宽度=%d,高度=%d,sz.cx,sz.cy);pDC-TextOut(50,150,str);sz=pDC-GetTextExtent(i);str.Format(i的宽度=%d,高度=%d,sz.cx,sz.cy);pDC-TextOut(50,200,str);,49,字体操作(1),库存字体的类型,50,字体操作(2),库存字体的例子,pDC-TextOut(50,50,DEFAULT字体);pDC-SelectStockObject(ANSI_FIXED_FONT);pDC-TextOut(50,100,ANSI_FIXED_FONT字体);pDC-SelectStockObject(SYSTEM_FONT);pDC-TextOut(50,150,SYSTEM_FONT字体);,51,字体操作(3),两步构造方法在LOGFONT结构中定义逻辑字体调用CreateFontIndirect()函数单步构造方法直接调用CreateFont()函数,52,字体操作(4),LOGFONT lf;lf.lfHeight=30;/高度为30 lf.lfWidth=0;/默认宽度lf.lfEscapement=150;/逆时针旋转15度lf.lfWeight=FW_BOLD;/粗体lf.lfUnderline=false;/无下划线lf.lfItalic=false;/非斜体lf.lfStrikeOut=false;/无删除线lf.lfCharSet=GB2312_CHARSET;/GB2312字符集CFont NewFont,*pOldFont;NewFont.CreateFontIndirect(,53,位图操作(1),BMP是与硬件无关的图像格式,采用位映射存储方式,除图像深度可选外,不使用其它压缩 图像深度包括:1位(单色)、4位(16色)、8位(256色)、24位(16M色)BMP文件结构文件头:文件类型、大小、起始位置等信息头:图像大小、压缩方法等颜色表与位图数据:在24位BMP中,每个像素由BGR表示,54,位图操作(2),位图用位模式形成图像,MFC提供CBitmap类管理位图,LoadBitmap()从资源装载位图CDC提供传输图形数据的函数PatBlt():用选定画刷填充一个矩形BitBlt():将图像数据输出到指定位置StetchBlt():与BitBlt()类似,可改变图像数据大小,55,位图操作(3),画刷参数的类型,56,位图操作(4),PatBlt的例子,CBitmap bm;bm.LoadBitmap(IDB_MYBITMAP);CBrush NewBrush,*pOldBrush;NewBrush.CreatePatternBrush(,57,位图操作(5),58,位图操作(6),BitBlt的例子,CBitmap bm;bm.LoadBitmap(IDB_MYBITMAP);CDC MemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(,59,位图操作(7),StretchBlt的例子,CBitmap bm;bm.LoadBitmap(IDB_MYBITMAP);CDC MemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(,60,位图操作(7),61,图标操作(1),图标(Icon)是一种特殊的位图,其与位图的区别是固定大小CWinApp提供LoadStandardIcon(),用于加载系统预定义的图标CWinApp提供LoadIcon(),用于加载图形编辑器创建的图标,62,图标操作(2),系统预定义的图标,63,图标操作(3),显示图标的例子,HICON hIcon;hIcon=AfxGetApp()-LoadStandardIcon(IDI_QUESTION);/hIcon=AfxGetApp()-LoadIcon(IDI_MYICON);CRect rect;GetClientRect(,64,图标操作(4),65,光标操作(1),光标(Cursor)用于显示鼠标操作时,鼠标所在位置与显示形状CWinApp提供LoadStandardCursor(),用于加载系统预定义的光标CWinApp提供LoadCursor(),用于加载图形编辑器创建的光标SetCursor用于设置光标形状,66,光标操作(2),系统预定义的光标,67,光标操作(3),在CTestView:OnLButtonDown()中,SetCapture();HCURSOR hCursor;hCursor=AfxGetApp()-LoadStandardCursor(IDC_CROSS);/hCursor=AfxGetApp()-LoadCursor(IDC_MYCURSOR);SetCursor(hCursor);RECT rect;GetClientRect(,68,光标操作(4),在CTestView:OnLButtonUp()中,ReleaseCapture();ClipCursor(NULL);,69,鼠标画线的例子(1),在CTestView类定义中在CTestView构造函数中,private:int m_Draw;HCURSOR m_Cursor;CPoint m_Old,m_Origin;,m_Draw=0;m_Cursor=AfxGetApp()-LoadStandardCursor(IDC_CROSS);,70,鼠标画线的例子(2),在CTestView:OnLButtonDown()中在CTestView:OnLButtonUp()中,m_Old=point;m_Origin=point;SetCapture();SetCursor(m_Cursor);m_Draw=1;CRect rect;GetClientRect(,m_Draw=0;ReleaseCapture();ClipCursor(NULL);,71,鼠标画线的例子(3),在CTestView:OnMouseMove()中,CClientDC dc(this);dc.SetROP2(R2_NOT);if(m_Draw=1)dc.MoveTo(m_Origin);dc.LineTo(m_Old);dc.MoveTo(m_Origin);dc.LineTo(point);m_Old=point;,72,鼠标画线的例子(4),73,背景与贴图的例子(1),在CTestView类定义中在CTestView构造函数中,private:CBitmap m_Back;CBitmap m_Bird0;CBitmap m_Bird1;,m_Back.LoadBitmap(IDB_BACK);m_Bird0.LoadBitmap(IDB_BIRD0);m_Bird1.LoadBitmap(IDB_BIRD1);,74,背景与贴图的例子(2),在CMainFrame:PreCreateWindow()中在CTestView:OnDraw()中,CDC MemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(,cs.cx=534;cs.cy=432;cs.style,75,背景与贴图的例子(3),在CTestView:OnLButtonDown()中,CDC*pDC=GetDC();CDC MemDC;MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(,76,背景与贴图的例子(4),77,扇面效果的例子(1),在CTestView类中添加数据成员在CTestView构造函数中初始化在CTestView:OnLButtonDown中,private:BOOL m_Draw;CPoint m_Old,m_Origin;,m_Draw=false;,m_Draw=true;m_Old=point;m_Origin=point;,78,扇面效果的例子(2),在CTestView:OnMouseMove()中在CTestView:OnLButtonUp()中,CClientDC dc(this);CPen NewPen(PS_SOLID,1,RGB(255,0,0);dc.SelectObject(,m_Draw=false;,79,扇面效果的例子(3),80,鼠标拖动圆的例子(1),81,鼠标拖动圆的例子(2),在CTestView类定义中在CTestView构造函数中,private:CRect m_Ellipse;CPoint m_MousePos;bool m_Capture;,m_Ellipse=CRect(0,0,100,100);m_Capture=false;,82,鼠标拖动圆的例子(3),在CTestView:OnDraw()中在CTestView:OnLButtonUp()中,pDC-SelectStockObject(LTGRAY_BRUSH);pDC-Ellipse(m_Ellipse);,ReleaseCapture();m_Capture=false;,83,鼠标拖动圆的例子(4),在CTestView:OnLButtonDown()中,CRgn circle;circle.CreateEllipticRgnIndirect(m_Ellipse);if(circle.PtInRegion(point)SetCapture();m_Capture=true;m_MousePos=point;SetCursor(LoadCursor(NULL,IDC_CROSS);,84,鼠标拖动圆的例子(5),在CTestView:OnMouseMove()中,CSize offset;offset=point-m_MousePos;CRect clientRect,tempRect,newRect;GetClientRect(,85,鼠标拖动圆的例子(6),86,第4次作业,设计一个带动画操作的程序,要求具有以下几种功能:带快捷选单(Line、Ellipse、Rectangle)通过点击菜单项输出相应的图形通过工具栏按钮保存与打开图形按键盘上的“M”键开始动画操作,使一个位图(自行设计)沿着图形移动,87,谢谢大家,