可视化编程技术(4).ppt
《可视化编程技术(4).ppt》由会员分享,可在线阅读,更多相关《可视化编程技术(4).ppt(78页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、绘 图l设备文本lCPoint,CSize和CRectl绘图工具l绘图函数l文本处理l位图和位操作l图标和光标l编程范例0设备文本(Device Context)l是当是当windowswindows程序必须向一个设备演示输出时所需的存储信息程序必须向一个设备演示输出时所需的存储信息的结构。的结构。l设备文本提供了一张画布,人们可以在其上绘制点、直线、设备文本提供了一张画布,人们可以在其上绘制点、直线、曲线等一切可见的东西;曲线等一切可见的东西;l设备是指图形既可以在屏幕上显示,还可以在打印机、绘图设备是指图形既可以在屏幕上显示,还可以在打印机、绘图仪、虚拟现实的头盔上显示;仪、虚拟现实的头盔
2、上显示;Windows应用程序经过设备描述表到设备驱动程序1 五个设备环境类CDC:MFC设备文本的基类,利用它可以访问整个显示设备CPaintDC:为窗口的OnPaint函数所使用的设备环境类CClientDC:窗口客户区(不包括边框、标题栏和菜单栏)CWindowsDC:整个应用程序窗口的设备环境CMetaFileDC:表示Windows图元文件的设备环境类做一个画线的程序,演示各个类的作用。CDC*pDC=GetDC();pDC-MoveTo(m_ptOrigin);pDC-LineTo(point);ReleaseDC(pDC);CClientDC dc(this);/CClientD
3、C dc(GetParent();dc.MoveTo(m_ptOrigin);dc.LineTo(point);CWindowDC dc(this);/CWindowDC dc(GetParent();CWindowDC dc(GetDesktopWindow();dc.MoveTo(m_ptOrigin);dc.LineTo(point);*/2绘图使用方法在堆栈中构造对象:CClientDC myDC(this);myDC.Ellipse();通过CWnd的GetDC获得设备环境的指针,此时注意要调用ReleaseDC进行释放CDC*pDC=GetDC();pDC-Ellipse();Re
4、leaseDC(pDC);Windows限制了可用设备环境的数目,如果设备环境没有被成功地删除,程序在退出之前有一小部分内存就会丢失3CPoint,CSize和CRect1、CPoint 封装了标准结构POINT;POINT p;p.x=10;p.y=10;pDC-TextOut(p.x,p.y,POINT为一个结构为一个结构,成员只有成员只有x,y);CPoint q,q1(10,10),q2(0,100);q=q1+q2;pDC-TextOut(q.x,q.y,CPoint为一个类为一个类,封装了封装了POINT这个结构这个结构,成成员有员有x,y,Offset,+,.);2、CSize
5、封装了标准结构SIZE;SIZE的成员只有cx,cy,用来定义一个矩形区域的大小(自己练习);3、CRect 封装了标准结构RECT;RECT的成员只有left,top,right,bottom,用来定义矩形区域(自己练习);4绘图工具lWindows在设备文本中提供了许多绘图工具,如:CPen,CBrush,CFont和CPalette等,它们的基类是CGdiObject。l默认的画笔是黑色的,宽度是一个像素,默认的画刷是白色的。l颜色由RGB值来指定。(1)RGB(red,green,blue)(2)0 x 00 FF FF FF B G R5选择库存对象(画笔、画刷)1、选择库存对象(S
6、tockObject)函数原型(见MSDN):virtual CGdiObject*SelectStockObject(int nIndex);2、例子:在void CTestView:OnDraw中加入代码:pDC-SelectStockObject(LTGRAY_BRUSH);/(1)画圆pDC-Ellipse(50,50,150,150);pDC-SelectStockObject(BLACK_PEN);/(2)画线pDC-MoveTo(10,100);pDC-LineTo(550,100);pDC-SelectStockObject(DKGRAY_BRUSH);/(3)椭圆pDC-El
7、lipse(200,50,350,150);pDC-SelectStockObject(NULL_BRUSH);/(4)矩形pDC-Rectangle(400,50,500,150);6自定义画笔-11、一步构造法:CPen NewPen(PS_SOLID,5,RGB(0,0,255);画笔风格是实线,画笔宽度是5,颜色为蓝色;2、二步构造法CPen NewPen;NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);7自定义画笔-23、将画笔选入设备文本对象将画笔选入设备文本对象CPen NewPen;/声明画笔对象声明画笔对象CPen*pOldPen;/保存原先
8、画笔指针保存原先画笔指针NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);pOldPen=pDC-SelectObject(&NewPen);/将画笔选入设备文本对象将画笔选入设备文本对象pDC-Ellipse(150,100,300,200);pDC-MoveTo(100,200);pDC-LineTo(350,200);pDC-SelectObject(pOldPen);/恢复原先的画笔对象恢复原先的画笔对象8自定义的画刷1、画刷决定填充区域的颜色和风格(1)实心(solid)风格 CreateSolidBrush(COLORREF crColor)(2)网
9、格(hatched)风格CreateHatchBrush(int nIndex,COLORREF crColor)(3)模式(patterned)风格,根据用户定义的位图来绘制 CreatePatternBrush(Cbitmap*pBitmap)2、一旦初始化完画刷,可调用CDC的SelectObject将画刷选入设备文本对象9自定义的画刷举例/自定义画刷CBrush NewBrush;CBrush*pOldBrush;NewBrush.CreateHatchBrush(HS_CROSS,RGB(0,0,255);pOldBrush=pDC-SelectObject(&NewBrush);p
10、DC-Rectangle(100,100,200,200);pDC-SelectObject(pOldBrush);10绘图函数l绘图函数用到的坐标都是按逻辑单位给出绘图函数用到的坐标都是按逻辑单位给出的,默认时,左上角位于坐标的,默认时,左上角位于坐标(0,0)处,逻处,逻辑单位为像素。辑单位为像素。l绘图函数见绘图函数见p.133设置像素、设置当前位置、画简单线、画弧、设置像素、设置当前位置、画简单线、画弧、画矩形、画椭圆和圆、画饼图、画多边形画矩形、画椭圆和圆、画饼图、画多边形.11绘图函数-11、设置像素(SetPixel)、设置当前位置(MoveTo)、画线(LineTo)、画矩形(
11、Rectangle)、画椭圆(圆)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);3、圆角矩形pDC-RoundRect(100,100,300,200,100,50);pDC-Ellipse(100,100,200,150);12绘图函数-24、画饼图/pDC-Rectangle(100,100,300,
12、200);/边界矩形pDC-Pie(100,100,300,200,300,100,100,100);5、画多边形POINT 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);136、填充一个区域 FloodFillpDC-Rectangle(100,100,200,200);CBrush NewBrush;CBrush*pOldBrush;NewBrush.CreateSolidB
13、rush(RGB(0,0,255);pOldBrush=pDC-SelectObject(&NewBrush);pDC-FloodFill(150,150,RGB(0,0,0);pDC-SelectObject(pOldBrush);自己练习 710,参见书P136绘图函数-314绘图函数-47、用点线画一个矩形边框,在CTestView:OnLButtonDown中加入代码:CDC*pDC=GetDC();pDC-DrawFocusRect(new CRect(100,100,200,200);8、用指定画刷填充一个矩形区域,但不画边线 FillRectCBrush NewBrush;CBr
14、ush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(&NewBrush);pDC-FillRect(new CRect(100,100,200,200),&NewBrush);pDC-SelectObject(pOldBrush);159、用指定画刷画一个矩形,内部不填充 FrameRect CBrush NewBrush;CBrush*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(
15、&NewBrush);pDC-FrameRect(new CRect(100,100,200,200),&NewBrush);pDC-SelectObject(pOldBrush);绘图函数-516绘图函数-610、在给定矩形内反显现有颜色 InvertRectCPen NewPen;/声明画笔对象CPen*pOldPen;/保存原先画笔指针NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);pOldPen=pDC-SelectObject(&NewPen);/将画笔选入设备文本对象pDC-MoveTo(100,100);pDC-LineTo(200,200);p
16、DC-SelectObject(pOldPen);/恢复原先的画笔对象pDC-InvertRect(new CRect(100,100,200,200);17绘图模式1、绘图模式指定如何将画笔颜色和被填充对象的内部颜色与显示设备上的颜色相结合;2、改变绘图模式 int SetROP2(int nDrawMode)3、绘图模式(P140)(1)R2_COPYPEN,默认绘图模式,复制;(2)R2_NOT,当前显示颜色的反色;(3)R2_XORPEN,显示颜色与画笔颜色进行异或运算;18绘图模式(R2_NOT)-11、当前显示颜色的反色:蓝色(0 x000000FF)的反色为黄色(0 x00FFF
17、F00)白色(0 x00FFFFFF)的反色为黑色(0 x00000000)2、例子:(1)在CTestView:OnDraw中加入代码:CBrush NewBrush,*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Rectangle(100,10,300,100);pDC-SelectObject(pOldBrush);19绘图模式(R2_NOT)-2(2)在CTestView:OnLButtonDown中加入代码:CDC*pDC=GetDC();CPen
18、 NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255);/与这里RGB设的颜色无关pOldPen=pDC-SelectObject(&NewPen);pDC-SetROP2(R2_NOT);pDC-MoveTo(50,50);pDC-LineTo(350,50);pDC-SelectObject(pOldPen);20绘图模式(R2_XORPEN)-11、显示颜色与画笔颜色进行异或运算:0 x000000FF 0 x000000FF=0 x000000000 x00FFFFFF 0 x000000FF=0 x00FFFF002、例子:
19、(1)在CTestView:OnDraw中加入代码:CBrush NewBrush,*pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Rectangle(100,10,300,100);pDC-SelectObject(pOldBrush);21绘图模式(R2_XORPEN)-2(2)在CTestView:OnLButtonDown中加入代码:CDC*pDC=GetDC();CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOL
20、ID,3,RGB(0,0,255);pOldPen=pDC-SelectObject(&NewPen);pDC-SetROP2(R2_XORPEN);pDC-MoveTo(50,50);pDC-LineTo(350,50);pDC-SelectObject(pOldPen);22绘图模式(背景颜色)-1(1)设置背景颜色:默认时,在绘制图形或输出文本时,背景颜色是白色背景。可使用CDC的成员函数SetBKColor来设置新的背景颜色。函数原型为:Virtual COLORREF SetBkColor(COLORREF cr);例如:SetBkColor(RGB(0,255,0);23绘图模式(
21、背景颜色)-2(2)设置背景模式:设置完当前背景颜色后,若使其在输出时有效,还需要使用CDC的成员函数SetBKMode来控制显示在屏幕上时的背景颜色。函数原型为:Int SetBkMode(int nBkmode);参数的值可以是OPAQUE或TRANSPARENT。若为前者,则显示时背景都改变为当前颜色,为默认值。24CRgn与区域(P132)l设置区域可以保证绘图时不超过给定的范围,不覆盖已存在的信息lMFC提供CRgn封装了区域,其成员函数有:CreateRectRgn,CreateEllipseRgn,CreatePolygonRgn,CreatePolyPolygonCombine
22、Rgn可将新的区域合并起来lCDC的FillClipRgn或PaintRgn可填充区域lCDC的SelectClipRgn可设置剪裁区域l用SelectObject将裁剪区域选入设备文本中,可以防止在裁剪区域以外绘制。25CRgn举例在void CTestView:OnDraw中加入代码:/用点线画矩形边框(画出rgn大小)pDC-DrawFocusRect(new CRect(10,10,200,200);/CRgn rgn;/rgn.CreateRectRgn(10,10,200,200);/pDC-SelectObject(rgn);pDC-MoveTo(0,50);pDC-LineTo
23、(300,50);pDC-MoveTo(50,0);pDC-LineTo(50,300);26映射模式-1(P137)1、在视图窗口绘制图形时,给定的坐标称为逻辑坐标,视图窗口内对象的实际坐标称为设备坐标。所有绘图函数的坐标都是逻辑坐标,但鼠标消息处理函数的坐标是设备坐标。2、映射模式用于定义逻辑坐标的单位与设备单位坐标间的关系(p.137)(1)约束映射模式是指比例因子固定(p.138)(2)非约束映射模式是用矩形区域推导出比例因子及轴向27映射模式-23、设置映射模式调用CDC的SetMapModel逻辑坐标与设备坐标的转换 DPtoLP,LPtoDP4、默认的映射模式为MM_TEXT,把
24、每个逻辑单位映射成一个设备像素,X轴向右,Y轴向下。28举例1(映射模式)/MM_TEXT:默认映射模式;MM_HIENGLISH:每个逻辑单位映射成0.001英寸,X轴正方向向右,Y轴正方向向上pDC-SetMapMode(MM_TEXT);/MM_HIENGLISH CRect rect;GetClientRect(&rect);int nOX=rect.right/2,nOY=rect.bottom/2;pDC-SetViewportOrg(nOX,nOY);/设置视口原点pDC-MoveTo(-20,0);pDC-LineTo(100,0);/坐标轴 XpDC-MoveTo(0,-20
25、);pDC-LineTo(0,100);/坐标轴 YCPoint O(100,100);int r=50;/圆心、半径pDC-Ellipse(O.x-r,O.y-r,O.x+r,O.y+r);29举例2(设备坐标和逻辑坐标)1、新建Project,在最后一步将CTestView的基类改为CScrollView2、void CTestView:OnInitialUpdate()修改代码sizeTotal.cx=640;sizeTotal.cy=480;3、void CCCView:OnLButtonDown中加入代码:POINT dp,lp;/设备坐标和逻辑坐标dp=point;lp=point
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可视化 编程 技术
限制150内