《可视化编程》PPT课件.ppt_第1页
《可视化编程》PPT课件.ppt_第2页
《可视化编程》PPT课件.ppt_第3页
《可视化编程》PPT课件.ppt_第4页
《可视化编程》PPT课件.ppt_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

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

文档简介

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、y CRect:封装RECT结构的类 定义一个矩形区域,成员为left、right、top、bottom CSize:封装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) 0x 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的例子 蓝色(0x00FF0000)反色为黄色(0x0000FFFF) 白色(0x00FFFFFF)反色为黑色(0x00000000) 在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的例子 0x00FF00000x00FF0000=0x00000000 0x00FFFFFF0x00FF0000=0x0000FFFF 在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; CPoi

温馨提示

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

评论

0/150

提交评论