可视化编程PPT课件

上传人:hs****ma 文档编号:569839673 上传时间:2024-07-31 格式:PPT 页数:88 大小:2.74MB
返回 下载 相关 举报
可视化编程PPT课件_第1页
第1页 / 共88页
可视化编程PPT课件_第2页
第2页 / 共88页
可视化编程PPT课件_第3页
第3页 / 共88页
可视化编程PPT课件_第4页
第4页 / 共88页
可视化编程PPT课件_第5页
第5页 / 共88页
点击查看更多>>
资源描述

《可视化编程PPT课件》由会员分享,可在线阅读,更多相关《可视化编程PPT课件(88页珍藏版)》请在金锄头文库上搜索。

1、第4章 GDI与Windows绘图n设备环境类n绘图工具n绘图函数n文本处理n位图与位操作n图标与光标1设备文本的概念n设备文本用于程序的可视化输出n设备文本提供一张画布,可在上面书写文字,或绘制点、直线、曲线等n图形既可通过屏幕显示,还可通过打印机等设备输出2设备环境类(1)nCDC:MFC的设备文本基类nCClientDC:客户区(不包括边框、标题栏和菜单栏)的设备文本类nCWindowDC:程序窗口的设备文本类nCPaintDC:OnPaint函数使用的设备文本类nCMetaFileDC:图元文件的设备文本类3设备环境类(2)n画线程序的例子(CDC)(添加start)void CTes

2、tView:OnLButtonUp(UINT nFlags, void CTestView:OnLButtonUp(UINT nFlags, CPoint point) CPoint point) CDC *pDC=GetDC(); CDC *pDC=GetDC(); pDC-MoveTo(start); pDC-MoveTo(start); pDC-LineTo(point); pDC-LineTo(point); ReleaseDC(pDC); ReleaseDC(pDC); 4设备环境类(3)n画线程序的例子(CClientDC)void CTestView:OnLButtonUp(UI

3、NT nFlags, void CTestView:OnLButtonUp(UINT nFlags, CPoint point) CPoint point) CClientDC dc(this); CClientDC dc(this); /CClientDC dc(GetParent(); /CClientDC dc(GetParent(); dc.MoveTo(start); dc.MoveTo(start); dc.LineTo(point); dc.LineTo(point); 5设备环境类(4)n画线程序的例子(CWindowDC)void CTestView:OnLButtonUp(

4、UINT nFlags, void CTestView:OnLButtonUp(UINT nFlags, CPoint point) CPoint point) CWindowDC dc(this); CWindowDC dc(this); /CWindowDC dc(GetParent(); /CWindowDC dc(GetParent(); /CWindowDC dc(GetDesktopWindow(); /CWindowDC dc(GetDesktopWindow(); dc.MoveTo(start); dc.MoveTo(start); dc.LineTo(point); dc.

5、LineTo(point); 6设备环境类(5)7绘图的基本方法n通过CClientDC构造对象n通过GetDC获得设备环境指针CClientDC dc(this);CClientDC dc(this);dc.Ellipse(10,10,200,200);dc.Ellipse(10,10,200,200);CDC* pDC=GetDC();CDC* pDC=GetDC();pDC-Ellipse(10,10,200,200);pDC-Ellipse(10,10,200,200);ReleaseDC(pDC);ReleaseDC(pDC);8CPoint、CSize与CRect(1)nCPoin

6、t:封装POINT结构的类定义一个点坐标,成员为x、ynCRect:封装RECT结构的类定义一个矩形区域,成员为left、right、top、bottomnCSize:封装SIZE结构的类定义矩形区域的大小,成员为cx、cy9CPoint、CSize与CRect(2)nCPoint类的例子POINT p;POINT p;p.x=10; p.y=10;p.x=10; p.y=10;pDC-TextOut(p.x,p.y,POINTpDC-TextOut(p.x,p.y,POINT为一个结构为一个结构, ,成成员只有员只有x,y);x,y);CPoint q,q1(10,10),q2(0,90);

7、CPoint q,q1(10,10),q2(0,90);q=q1+q2;q=q1+q2;pDC-TextOut(q.x,q.y,CPointpDC-TextOut(q.x,q.y,CPoint为一个类为一个类, ,封装封装POINTPOINT结构结构, ,成员有成员有x,yx,y等等););10绘图工具(1)n设备文本类(CDC)提供绘图工具,例如CPen、CBrush与CFont等,基类是CGdiObjectn默认的画笔是黑色,宽度是一个像素,默认的画刷是白色n颜色由RGB值来指定RGB(Red,Green,Blue)0x 00 FF FF FF B G R11绘图工具(2)画刷类型画刷类型

8、 说明说明画刷类型画刷类型 说明说明BLACK_BRUSH 黑色画刷HOLLOW_BRUSH 透明画刷DKGRAY_BRUSH 深灰色画刷 NULL_BRUSH 空画刷GRAY_BRUSH 灰色画刷BLACK_PEN 黑色画笔LTGRAY_BRUSH 浅灰色画刷 WHITE_PEN 白色画笔WHITE_BRUSH 白色画刷NULL_PEN 空画笔n库存画刷的类型12绘图工具(3)nSelectStockObject的例子pDC-SelectStockObject(BLACK_PEN);pDC-SelectStockObject(BLACK_PEN);pDC-MoveTo(10,100);pDC

9、-MoveTo(10,100);pDC-LineTo(550,100);pDC-LineTo(550,100);pDC-SelectStockObject(LTGRAY_BRUSH);pDC-SelectStockObject(LTGRAY_BRUSH);pDC-Ellipse(50,50,150,150);pDC-Ellipse(50,50,150,150);pDC-SelectStockObject(DKGRAY_BRUSH);pDC-SelectStockObject(DKGRAY_BRUSH);pDC-Ellipse(200,50,350,150);pDC-Ellipse(200,50

10、,350,150);pDC-SelectStockObject(NULL_BRUSH);pDC-SelectStockObject(NULL_BRUSH);pDC-Rectangle(400,50,500,150);pDC-Rectangle(400,50,500,150);13自定义画笔(1)n单步构造方法n两步构造方法n画笔风格是实线,宽度是5,颜色是蓝色CPen NewPen(PS_SOLID,5,RGB(0,0,255);CPen NewPen(PS_SOLID,5,RGB(0,0,255);CPen NewPen;CPen NewPen;NewPen.CreatePen(PS_SOL

11、ID,5,RGB(0,0,255);NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);14自定义画笔(2) 画笔类型画笔类型 说明说明 PS_SOLID 实线画笔 PS_DASH 划线(虚线)画笔 PS_DASHDOT 点划线画笔 PS_DASHDOTDOT 双点划线画笔 PS_DOT 点线画笔 PS_NULL 空画笔n库存画笔的类型(除实线外,宽度为1)15自定义画笔(3)n自定义画笔的例子CPen NewPen;CPen NewPen;CPen *pOldPen;CPen *pOldPen;NewPen.CreatePen(PS_SOLID,5,RGB(0,

12、0,255);NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);pOldPen=pDC-SelectObject(&NewPen); pOldPen=pDC-SelectObject(&NewPen); pDC-Ellipse(150,100,300,200); pDC-Ellipse(150,100,300,200); pDC-MoveTo(100,200);pDC-MoveTo(100,200);pDC-LineTo(350,200);pDC-LineTo(350,200);pDC-SelectObject(pOldPen);pDC-SelectObject

13、(pOldPen); 16自定义画笔(4)17自定义画刷(1)n实心(solid)风格CreateSolidBrush(COLORREF crColor);CreateSolidBrush(COLORREF crColor);n网格(hatched)风格CreateHatchBrush(int nIndex,COLORREF CreateHatchBrush(int nIndex,COLORREF crColor);crColor);n模式(patterned)风格CreatePatternBrush(CCreatePatternBrush(CB Bitmapitmap * *pBitmapp

14、Bitmap););18自定义画刷(2) 网格样式网格样式 说明说明 HS_CROSS 十字线填充 HS_HORIZONAL 水平线填充 HS_VERTICAL 垂直线填充 HS_FDIAGONAL 斜线填充 HS_BDIAGONAL 反斜线填充 HS_DIAGCROSS 斜十字线填充19自定义画刷(3)n自定义画刷的例子CBrush NewBrush;CBrush NewBrush;CBrush *pOldBrush;CBrush *pOldBrush;NewBrush.CreateHatchBrush(HS_CROSS,RGB(0,NewBrush.CreateHatchBrush(HS_

15、CROSS,RGB(0,0,255);0,255);pOldBrush=pDC-SelectObject(&NewBrush);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Rectangle(100,100,200,200);pDC-Rectangle(100,100,200,200);pDC-SelectObject(pOldBrush);pDC-SelectObject(pOldBrush);20自定义画刷(4)21绘图函数(1)n绘图函数的坐标是逻辑单位。默认的左上角坐标为(0,0),逻辑单位为像素n绘图函数设置像素(SetPixel)、当前位置(

16、Moveto)、画直线(Lineto)、画弧线(Arc)、画矩形(Rectangle)、画椭圆(Ellipse)、画饼图(Pie)、画多边型(Polygon)22绘图函数(2)n圆角矩形n弧线pDC-Rectangle(100,100,300,200);pDC-Rectangle(100,100,300,200);pDC-MoveTo(200,150); pDC-LineTo(300,175);pDC-MoveTo(200,150); pDC-LineTo(300,175);pDC-MoveTo(200,150); pDC-LineTo(125,100); pDC-MoveTo(200,150

17、); pDC-LineTo(125,100); pDC-Arc(100,100,300,200,300,175,125,100);pDC-Arc(100,100,300,200,300,175,125,100);pDC-Rectangle(100,100,300,200);pDC-Rectangle(100,100,300,200);pDC-RoundRect(100,100,300,200,50,40);pDC-RoundRect(100,100,300,200,50,40);23绘图函数(3)n饼图n多边形pDC-Rectangle(100,100,300,200);pDC-Rectang

18、le(100,100,300,200);pDC-Pie(100,100,300,200,300,100,100,100);pDC-Pie(100,100,300,200,300,100,100,100);CPoint point4;CPoint point4;point0.x=100; point0.y=100; point0.x=100; point0.y=100; point1.x=200; point1.y=200;point1.x=200; point1.y=200;point2.x=200; point2.y=100; point2.x=200; point2.y=100; poin

19、t3.x=100; point3.y=200;point3.x=100; point3.y=200;pDC-Polygon(point,4);pDC-Polygon(point,4);24绘图函数(4)n用点线画矩形边框(DrawFocusRect)n用画刷填充矩形,不画边框(FillRect)pDC-DrawFocusRect(CRect(100,100,200,200);pDC-DrawFocusRect(CRect(100,100,200,200);CBrush NewBrush;CBrush NewBrush;NewBrush.CreateSolidBrush(RGB(0,0,255)

20、;NewBrush.CreateSolidBrush(RGB(0,0,255);pDC-SelectObject(&NewBrush);pDC-SelectObject(&NewBrush);pDC-FillRect(CRect(100,100,200,200), pDC-FillRect(CRect(100,100,200,200), &NewBrush);&NewBrush);25绘图函数(5)n用画刷画矩形边框,不填充内部(FrameRect)CBrush NewBrush;CBrush NewBrush;CBrush *pOldBrush;CBrush *pOldBrush;NewBr

21、ush.CreateSolidBrush(RGB(0,0,255);NewBrush.CreateSolidBrush(RGB(0,0,255);pOldBrush=pDC-SelectObject(&NewBrush);pOldBrush=pDC-SelectObject(&NewBrush);pDC-FrameRect(CRect(100,100,200,200), pDC-FrameRect(CRect(100,100,200,200), &NewBrush);&NewBrush);pDC-SelectObject(pOldBrush);pDC-SelectObject(pOldBrus

22、h);26绘图函数(6)n在矩形区域中反显颜色(InvertRect)CPen NewPen;CPen NewPen;CPen *pOldPen; CPen *pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); pOldPen=pDC-SelectObject(&NewPen); pOldPen=pDC-SelectObject(&NewPen); pDC-MoveTo(100,100);pDC-MoveTo(100,100);pDC-LineTo(200,20

23、0);pDC-LineTo(200,200);pDC-SelectObject(pOldPen); pDC-SelectObject(pOldPen); pDC-InvertRect(CRect(100,100,200,200);pDC-InvertRect(CRect(100,100,200,200);27绘图模式(1)n绘图模式指定画笔颜色和现有颜色的处理SetROP2(int nDrawMode)n绘图模式R2_COPYPEN(画笔颜色)R2_NOT(画笔颜色取反)R2_XORPEN(显示颜色与画笔颜色异或)28绘图模式(2)nR2_NOT的例子蓝色(0x00FF0000)反色为黄色(0

24、x0000FFFF)白色(0x00FFFFFF)反色为黑色(0x00000000)n在CTestView:OnDraw()中CBrush NewBrush;CBrush NewBrush;CBrush *pOldBrush; CBrush *pOldBrush; NewBrush.CreateSolidBrush(RGB(0,0,255); NewBrush.CreateSolidBrush(RGB(0,0,255); pOldBrush=pDC-SelectObject(&NewBrush); pOldBrush=pDC-SelectObject(&NewBrush); pDC-Rectan

25、gle(100,100,300,200);pDC-Rectangle(100,100,300,200);pDC-SelectObject(pOldBrush);pDC-SelectObject(pOldBrush);29绘图模式(3)n在CTestView:OnLButtonDown()中CDC *pDC=GetDC();CDC *pDC=GetDC();CPen NewPen;CPen NewPen;CPen *pOldPen;CPen *pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255);NewPen.CreatePen(PS_SOLID,3,

26、RGB(0,0,255);pOldPen=pDC-SelectObject(&NewPen);pOldPen=pDC-SelectObject(&NewPen);pDC-SetROP2(R2_NOT);pDC-SetROP2(R2_NOT);pDC-MoveTo(50,150); pDC-LineTo(350,150);pDC-MoveTo(50,150); pDC-LineTo(350,150);pDC-SelectObject(pOldPen);pDC-SelectObject(pOldPen); ReleaseDC(pDC);ReleaseDC(pDC);30绘图模式(4)31绘图模式(

27、5)nR2_XORPEN的例子0x00FF00000x00FF0000=0x000000000x00FFFFFF0x00FF0000=0x0000FFFFn在CTestView:OnDraw()中CBrush NewBrush;CBrush NewBrush;CBrush *pOldBrush; CBrush *pOldBrush; NewBrush.CreateSolidBrush(RGB(0,0,255); NewBrush.CreateSolidBrush(RGB(0,0,255); pOldBrush=pDC-SelectObject(&NewBrush); pOldBrush=pDC

28、-SelectObject(&NewBrush); pDC-Rectangle(100,100,300,200);pDC-Rectangle(100,100,300,200);pDC-SelectObject(pOldBrush);pDC-SelectObject(pOldBrush);32绘图模式(6)n在CTestView:OnLButtonDown()中CDC *pDC=GetDC();CDC *pDC=GetDC();CPen NewPen;CPen NewPen;CPen *pOldPen;CPen *pOldPen;NewPen.CreatePen(PS_SOLID,3,RGB(0

29、,0,255);NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255);pOldPen=pDC-SelectObject(&NewPen);pOldPen=pDC-SelectObject(&NewPen);pDC-SetROP2(R2_XORPEN);pDC-SetROP2(R2_XORPEN);pDC-MoveTo(50,150); pDC-LineTo(350,150);pDC-MoveTo(50,150); pDC-LineTo(350,150);pDC-SelectObject(pOldPen);pDC-SelectObject(pOldPen); Rele

30、aseDC(pDC);ReleaseDC(pDC);33绘图模式(7)34CRgn与区域(1)n设置区域保证绘图时不超过给定范围nMFC的CRgn封装区域,其成员函数有:CreateRectRgn、CreateEllipseRgn、CreatePolygonRgn等CombineRgn用于将新的区域合并nCDC的FillClipRgn或PaintRgnyong填充区域,SelectClipRgn设置剪裁区域,SelectObject将区域选入设备文本35CRgn与区域(2)n在CTestView:OnDraw()中pDC-DrawFocusRect(CRect(10,10,200,200);

31、pDC-DrawFocusRect(CRect(10,10,200,200); CRgn rgn;CRgn rgn;rgn.CreateRectRgn(10,10,200,200);rgn.CreateRectRgn(10,10,200,200);pDC-SelectObject(rgn);pDC-SelectObject(rgn);pDC-MoveTo(0,50);pDC-MoveTo(0,50);pDC-LineTo(300,50);pDC-LineTo(300,50);pDC-MoveTo(50,0);pDC-MoveTo(50,0);pDC-LineTo(50,300);pDC-Lin

32、eTo(50,300);36CRgn与区域(3)37映射模式(1)n在视图窗口绘制图形时,给定的坐标为逻辑坐标,视图对象的实际坐标为设备坐标n绘图函数的坐标是逻辑坐标,鼠标消息处理函数的坐标是设备坐标n映射模式定义逻辑坐标与设备坐标单位的关系约束映射模式:比例因子固定非约束映射模式:由矩形区域推导出比例因子及轴向38映射模式(2)nCDC的SetMapMode用于设置映射模式LPtoDP:逻辑坐标转为设备坐标DPtoLP:设备坐标转为逻辑坐标nMM_TEXT:默认映射模式,每个单位映射为一个像素,X轴向右、Y轴向下nMM_HIENGLISH:每个单位映射成0.001英寸,X轴向右、Y轴向上39

33、映射模式(3)nMM_TEXT与MM_HIENGLISH的区别pDC-SetMapMode(MM_TEXT);pDC-SetMapMode(MM_TEXT);CRect rect;CRect rect;GetClientRect(&rect);GetClientRect(&rect);int x=rect.right/2; int y=rect.bottom/2;int x=rect.right/2; int y=rect.bottom/2;pDC-SetViewportOrg(x,y); pDC-SetViewportOrg(x,y); pDC-MoveTo(-20,0); pDC-Line

34、To(100,0); pDC-MoveTo(-20,0); pDC-LineTo(100,0); pDC-MoveTo(0,-20); pDC-LineTo(0,100); pDC-MoveTo(0,-20); pDC-LineTo(0,100); CPoint pt(100,100); int r=50; CPoint pt(100,100); int r=50; pDC-Ellipse(pt.x-r,pt.y-r,pt.x+r,pt.y+r);pDC-Ellipse(pt.x-r,pt.y-r,pt.x+r,pt.y+r);40文本处理(1)n文本输出函数TextOut:在指定位置输出文本

35、DrawText:在指定矩形区域输出文本ExtTextOut:在指定位置输出文本,并使用当前选择字体TabbedTextOut:在指定位置输出文本,并使用指定的字符间距41文本处理(2)n文本属性设置函数SetBkMode:设置背景模式SetBkColor:设置背景颜色SetTextColor:设置文本颜色SetTextAlign:设置文本对齐方式SetTextCharacterExtra:设置字符间隔值42文本处理(3)n文本属性设置的例子pDC-SetBkMode(OPAQUE);pDC-SetBkMode(OPAQUE);pDC-SetBkColor(RGB(0,255,255);pDC

36、-SetBkColor(RGB(0,255,255);pDC-SetTextColor(RGB(0,0,255);pDC-SetTextColor(RGB(0,0,255);pDC-SetTextAlign(TA_CENTER|TA_BOTTOM);pDC-SetTextAlign(TA_CENTER|TA_BOTTOM);pDC-SetTextCharacterExtra(10);pDC-SetTextCharacterExtra(10);pDC-TextOut(100,50,pDC-TextOut(100,50,设置文本属性设置文本属性););pDC-MoveTo(0,50); pDC-L

37、ineTo(200,50);pDC-MoveTo(0,50); pDC-LineTo(200,50);pDC-MoveTo(100,0); pDC-LineTo(100,100);pDC-MoveTo(100,0); pDC-LineTo(100,100);43文本处理(4)44字符属性(1)n字符属性包括:字符大小、行距typedef struct tagTEXTMETRIC typedef struct tagTEXTMETRIC LONG tmHeight; / LONG tmHeight; /字符高度字符高度 LONG tmAscent; / LONG tmAscent; /字符上升高

38、度字符上升高度 LONG tmDescent; / LONG tmDescent; /字符下降高度字符下降高度 LONG tmExternalLeading; / LONG tmExternalLeading; /行间距行间距 TEXTMETRIC; TEXTMETRIC;45字符属性(2)ntmAscent与tmDescent的含义46字符属性(3)n字符属性的例子TEXTMETRIC tm;TEXTMETRIC tm;pDC-GetTextMetrics(&tm);pDC-GetTextMetrics(&tm);CString str;CString str;str.Format(str.

39、Format(字符高度字符高度(tmHeight)=%d,(tmHeight)=%d,行间距行间距(tmExternalLeading)=%d,tm.tmHeight,tm.tmE(tmExternalLeading)=%d,tm.tmHeight,tm.tmExternalLeading);xternalLeading);pDC-TextOut(50,50,str);pDC-TextOut(50,50,str);47字符属性(4)CString str; CSize sz;CString str; CSize sz;sz=pDC-GetTextExtent(sz=pDC-GetTextExt

40、ent(字字););str.Format(str.Format(字的宽度字的宽度=%d,=%d,高度高度=%d,sz.cx,sz.cy);=%d,sz.cx,sz.cy);pDC-TextOut(50,50,str);pDC-TextOut(50,50,str);sz=pDC-GetTextExtent(a); sz=pDC-GetTextExtent(a); str.Format(astr.Format(a的宽度的宽度=%d,=%d,高度高度=%d,sz.cx,sz.cy);=%d,sz.cx,sz.cy);pDC-TextOut(50,100,str);pDC-TextOut(50,100

41、,str);sz=pDC-GetTextExtent(m); sz=pDC-GetTextExtent(m); str.Format(mstr.Format(m的宽度的宽度=%d,=%d,高度高度=%d,sz.cx,sz.cy);=%d,sz.cx,sz.cy);pDC-TextOut(50,150,str);pDC-TextOut(50,150,str);sz=pDC-GetTextExtent(i); sz=pDC-GetTextExtent(i); str.Format(istr.Format(i的宽度的宽度=%d,=%d,高度高度=%d,sz.cx,sz.cy);=%d,sz.cx,s

42、z.cy);pDC-TextOut(50,200,str);pDC-TextOut(50,200,str);48字体操作(1)n库存字体的类型 字体类型字体类型 说明说明 SYSTEM_FONT 系统字体 SYSTEM_FIXED_FONT 固定宽度系统字体 ANSI_FIXED_FONT ANSI固定宽度系统字体 ANSI_VAR_FONT ANSI可变宽度系统字体 DEVICE_DEFAULT_FONT 设备相关缺省字体 OEM_FIXED_FONT OEM相关固定宽度字体49字体操作(2)n库存字体的例子pDC-TextOut(50,50,pDC-TextOut(50,50,DEFAUL

43、TDEFAULT字体字体););pDC-SelectStockObject(ANSI_FIXED_FONT);pDC-SelectStockObject(ANSI_FIXED_FONT);pDC-TextOut(50,100,ANSI_FIXED_FONTpDC-TextOut(50,100,ANSI_FIXED_FONT字体字体););pDC-SelectStockObject(SYSTEM_FONT);pDC-SelectStockObject(SYSTEM_FONT);pDC-TextOut(50,150,SYSTEM_FONTpDC-TextOut(50,150,SYSTEM_FONT

44、字体字体););50字体操作(3)n两步构造方法在LOGFONT结构中定义逻辑字体调用CreateFontIndirect()函数n单步构造方法直接调用CreateFont()函数51字体操作(4)LOGFONT lf;LOGFONT lf;lf.lfHeight=30; /lf.lfHeight=30; /高度为高度为30 30 lf.lfWidth=0; /lf.lfWidth=0; /默认宽度默认宽度lf.lfEscapement=150; /lf.lfEscapement=150; /逆时针旋转逆时针旋转1515度度lf.lfWeight=FW_BOLD; /lf.lfWeight=F

45、W_BOLD; /粗体粗体lf.lfUnderline=false; /lf.lfUnderline=false; /无下划线无下划线lf.lfItalic=false; /lf.lfItalic=false; /非斜体非斜体lf.lfStrikeOut=false; /lf.lfStrikeOut=false; /无删除线无删除线lf.lfCharSet=GB2312_CHARSET; /GB2312lf.lfCharSet=GB2312_CHARSET; /GB2312字符集字符集CFont NewFont,*pOldFont;CFont NewFont,*pOldFont;NewFont

46、.CreateFontIndirect(&lf);NewFont.CreateFontIndirect(&lf);pOldFont=pDC-SelectObject(&NewFont);pOldFont=pDC-SelectObject(&NewFont);pDC-TextOut(100,100,pDC-TextOut(100,100,例子例子Example);Example);pDC-SelectObject(pOldFont);pDC-SelectObject(pOldFont);52位图操作(1)nBMP是与硬件无关的图像格式,采用位映射存储方式,除图像深度可选外,不使用其它压缩 n图像

47、深度包括:1位(单色)、4位(16色)、8位(256色)、24位(16M色)nBMP文件结构文件头:文件类型、大小、起始位置等信息头:图像大小、压缩方法等颜色表与位图数据:在24位BMP中,每个像素由BGR表示53位图操作(2)n位图用位模式形成图像,MFC提供CBitmap类管理位图,LoadBitmap()从资源装载位图nCDC提供传输图形数据的函数PatBlt():用选定画刷填充一个矩形BitBlt():将图像数据输出到指定位置StetchBlt():与BitBlt()类似,可改变图像数据大小54位图操作(3)n画刷参数的类型 画刷参数画刷参数 说明说明 WHITENESS 区域为白色

48、BLACKNESS 区域为黑色 PATCOPY 画刷复制到填充区域 PATINVERT 画刷异或到填充区域 DSTINVERT 填充区域被反相55位图操作(4)nPatBlt的例子CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);CBrush NewBrush,*pOldBrush;CBrush NewBrush,*pOldBrush;NewBrush.CreatePatternBrush(&bm);NewBrush.CreatePatternBrush(&bm);pOldBrush=

49、pDC-SelectObject(&NewBrush);pOldBrush=pDC-SelectObject(&NewBrush);RECT rect; GetClientRect(&rect);RECT rect; GetClientRect(&rect);pDC-PatBlt(0,0,rect.right,rect.bottom, pDC-PatBlt(0,0,rect.right,rect.bottom, PATCOPY);PATCOPY);pDC-SelectObject(pOldBrush);pDC-SelectObject(pOldBrush);bm.DeleteObject();

50、bm.DeleteObject();56位图操作(5)57位图操作(6)nBitBlt的例子CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);CDC MemDC;CDC MemDC;MemDC.CreateCompatibleDC(pDC);MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&bm);MemDC.SelectObject(&bm);BITMAP tmp; bm.GetBitmap(&tmp);BITMAP tmp; bm.

51、GetBitmap(&tmp);pDC-BitBlt(0,0,tmp.bmWidth,tmp.bmHeight, pDC-BitBlt(0,0,tmp.bmWidth,tmp.bmHeight, &MemDC,0,0,SRCCOPY);&MemDC,0,0,SRCCOPY);bm.DeleteObject();bm.DeleteObject();58位图操作(7)nStretchBlt的例子CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);CDC MemDC;CDC MemDC;Mem

52、DC.CreateCompatibleDC(pDC);MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&bm);MemDC.SelectObject(&bm);BITMAP tmp; bm.GetBitmap(&tmp);BITMAP tmp; bm.GetBitmap(&tmp);pDC-StretchBlt(0,0,tmp.bmWidth/2,tmp. pDC-StretchBlt(0,0,tmp.bmWidth/2,tmp. bmHeight/2,&MemDC,0,0,tmp.bmWidth,tmp. bmHeight/2,&MemDC,

53、0,0,tmp.bmWidth,tmp. bmHeight,SRCCOPY);bmHeight,SRCCOPY);bm.DeleteObject();bm.DeleteObject();59位图操作(7)60图标操作(1)n图标(Icon)是一种特殊的位图,其与位图的区别是固定大小nCWinApp提供LoadStandardIcon(),用于加载系统预定义的图标nCWinApp提供LoadIcon(),用于加载图形编辑器创建的图标61图标操作(2)n系统预定义的图标 预定义图标宏预定义图标宏 说明说明 IDI_APPLICATION 默认图标 IDI_ASTERISK 信息图标 IDI_EXC

54、LAMATION 惊叹号图标 IDI_HAND 严重警告图标 IDI_QUESTION 问号图标62图标操作(3)n显示图标的例子HICON hIcon;HICON hIcon;hIcon=AfxGetApp()-LoadStandardIcon hIcon=AfxGetApp()-LoadStandardIcon (IDI_QUESTION);(IDI_QUESTION);/hIcon=AfxGetApp()-LoadIcon(IDI_MYICON);/hIcon=AfxGetApp()-LoadIcon(IDI_MYICON);CRect rect;CRect rect;GetClient

55、Rect(&rect);GetClientRect(&rect);pDC-DrawIcon(rect.right-GetSystemMetrics pDC-DrawIcon(rect.right-GetSystemMetrics (SM_CXICON)/2,(rect.bottom-(SM_CXICON)/2,(rect.bottom-GetSystemMetrics(SM_CYICON)/2,hIcon);GetSystemMetrics(SM_CYICON)/2,hIcon);63图标操作(4)64光标操作(1)n光标(Cursor)用于显示鼠标操作时,鼠标所在位置与显示形状nCWinAp

56、p提供LoadStandardCursor(),用于加载系统预定义的光标nCWinApp提供LoadCursor(),用于加载图形编辑器创建的光标nSetCursor用于设置光标形状65光标操作(2)n系统预定义的光标光标类型光标类型 说明说明光标类型光标类型 说明说明IDC_ARROW 箭头 IDC_UPARROW 垂直箭头IDC_CROSS 十字光标IDC_SIZEALL 四向箭头IDC_WAIT 沙漏光标IDC_SIZENWSE 左上右下角双箭头IDC_IBEAM 输入光标IDC_SIZENESW 右上左下角双箭头IDC_SIZE 装入方框IDC_SIZEWE 水平双箭头IDC_ICON

57、 空肖像IDC_SIZENS 垂直双箭头66光标操作(3)n在CTestView:OnLButtonDown()中SetCapture(); SetCapture(); HCURSOR hCursor; HCURSOR hCursor; hCursor=AfxGetApp()-LoadStandardCursor hCursor=AfxGetApp()-LoadStandardCursor (IDC_CROSS);(IDC_CROSS);/hCursor=AfxGetApp()-LoadCursor /hCursor=AfxGetApp()-LoadCursor (IDC_MYCURSOR);

58、(IDC_MYCURSOR);SetCursor(hCursor);SetCursor(hCursor);RECT rect; GetClientRect(&rect);RECT rect; GetClientRect(&rect);ClientToScreen(&rect); ClipCursor(&rect);ClientToScreen(&rect); ClipCursor(&rect);67光标操作(4)n在CTestView:OnLButtonUp()中ReleaseCapture();ReleaseCapture();ClipCursor(NULL);ClipCursor(NULL

59、);68鼠标画线的例子(1)n在CTestView类定义中n在CTestView构造函数中private:private: int m_Draw; int m_Draw; HCURSOR m_Cursor; HCURSOR m_Cursor; CPoint m_Old, m_Origin; CPoint m_Old, m_Origin;m_Draw=0;m_Draw=0;m_Cursor=AfxGetApp()-LoadStandardCursor m_Cursor=AfxGetApp()-LoadStandardCursor (IDC_CROSS);(IDC_CROSS);69鼠标画线的例子

60、(2)n在CTestView:OnLButtonDown()中n在CTestView:OnLButtonUp()中m_Old=point; m_Origin=point;m_Old=point; m_Origin=point;SetCapture(); SetCursor(m_Cursor);SetCapture(); SetCursor(m_Cursor); m_Draw=1;m_Draw=1;CRect rect; GetClientRect(&rect);CRect rect; GetClientRect(&rect);ClientToScreen(&rect); ClipCursor(

61、&rect);ClientToScreen(&rect); ClipCursor(&rect);m_Draw=0;m_Draw=0;ReleaseCapture(); ReleaseCapture(); ClipCursor(NULL); ClipCursor(NULL); 70鼠标画线的例子(3)n在CTestView:OnMouseMove()中CClientDC dc(this);CClientDC dc(this);dc.SetROP2(R2_NOT);dc.SetROP2(R2_NOT);if(m_Draw=1)if(m_Draw=1) dc.MoveTo(m_Origin); dc

62、.LineTo(m_Old); dc.MoveTo(m_Origin); dc.LineTo(m_Old); dc.MoveTo(m_Origin); dc.LineTo(point); dc.MoveTo(m_Origin); dc.LineTo(point); m_Old=point; m_Old=point; 71鼠标画线的例子(4)72背景与贴图的例子(1)n在CTestView类定义中n在CTestView构造函数中private:private: CBitmap m_Back; CBitmap m_Back; CBitmap m_Bird0; CBitmap m_Bird0; CB

63、itmap m_Bird1; CBitmap m_Bird1;m_Back.LoadBitmap(IDB_BACK);m_Back.LoadBitmap(IDB_BACK);m_Bird0.LoadBitmap(IDB_BIRD0);m_Bird0.LoadBitmap(IDB_BIRD0);m_Bird1.LoadBitmap(IDB_BIRD1);m_Bird1.LoadBitmap(IDB_BIRD1);73背景与贴图的例子(2)n在CMainFrame:PreCreateWindow()中n在CTestView:OnDraw()中CDC MemDC;CDC MemDC;MemDC.Cr

64、eateCompatibleDC(pDC);MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&m_Back);MemDC.SelectObject(&m_Back);pDC-pDC-BitBlt(0,0,534,432,&MemDC,0,0,SRCCOPY);BitBlt(0,0,534,432,&MemDC,0,0,SRCCOPY);cs.cx=534;cs.cx=534;cs.cy=432;cs.cy=432;cs.style&=WS_MAXIMIZEBOX;cs.style&=WS_MAXIMIZEBOX;74背景与贴图的例子(3)n在C

65、TestView:OnLButtonDown()中CDC *pDC=GetDC();CDC *pDC=GetDC();CDC MemDC;CDC MemDC;MemDC.CreateCompatibleDC(pDC);MemDC.CreateCompatibleDC(pDC);MemDC.SelectObject(&m_Bird0);MemDC.SelectObject(&m_Bird0);pDC-BitBlt(point.x,point.y,point.x+137, pDC-BitBlt(point.x,point.y,point.x+137, point.y+99,&MemDC,0,0,S

66、RCAND);point.y+99,&MemDC,0,0,SRCAND);MemDC.SelectObject(&m_Bird1);MemDC.SelectObject(&m_Bird1);pDC-BitBlt(point.x,point.y,point.x+137, pDC-BitBlt(point.x,point.y,point.x+137, point.y+99,&MemDC,0,0,SRCPAINT);point.y+99,&MemDC,0,0,SRCPAINT);ReleaseDC(pDC);ReleaseDC(pDC);75背景与贴图的例子(4)76扇面效果的例子(1)n在CTes

67、tView类中添加数据成员n在CTestView构造函数中初始化n在CTestView:OnLButtonDown中private:private: BOOL m_Draw; BOOL m_Draw; CPoint m_Old, m_Origin; CPoint m_Old, m_Origin;m_Draw=false;m_Draw=false;m_Draw=true;m_Draw=true;m_Old=point; m_Origin=point;m_Old=point; m_Origin=point;77扇面效果的例子(2)n在CTestView:OnMouseMove()中n在CTestV

68、iew:OnLButtonUp()中CClientDC dc(this);CClientDC dc(this);CPen NewPen(PS_SOLID,1,RGB(255,0,0);CPen NewPen(PS_SOLID,1,RGB(255,0,0);dc.SelectObject(&NewPen);dc.SelectObject(&NewPen);if(m_Draw=true)if(m_Draw=true) dc.MoveTo(m_Origin); dc.LineTo(point); dc.MoveTo(m_Origin); dc.LineTo(point); dc.LineTo(m_O

69、ld); m_Old=point; dc.LineTo(m_Old); m_Old=point; m_Draw=false;m_Draw=false;78扇面效果的例子(3)79鼠标拖动圆的例子(1)80鼠标拖动圆的例子(2)n在CTestView类定义中n在CTestView构造函数中private:private: CRect m_Ellipse; CRect m_Ellipse; CPoint m_MousePos; CPoint m_MousePos; bool m_Capture; bool m_Capture;m_Ellipse=CRect(0,0,100,100);m_Ellip

70、se=CRect(0,0,100,100);m_Capture=false;m_Capture=false;81鼠标拖动圆的例子(3)n在CTestView:OnDraw()中n在CTestView:OnLButtonUp()中pDC-SelectStockObject(LTGRAY_BRUSH);pDC-SelectStockObject(LTGRAY_BRUSH);pDC-Ellipse(m_Ellipse);pDC-Ellipse(m_Ellipse);ReleaseCapture();ReleaseCapture();m_Capture=false;m_Capture=false;82

71、鼠标拖动圆的例子(4)n在CTestView:OnLButtonDown()中CRgn circle;CRgn circle;circle.CreateEllipticRgnIndirect(m_Ellipse);circle.CreateEllipticRgnIndirect(m_Ellipse);if(circle.PtInRegion(point)if(circle.PtInRegion(point) SetCapture(); SetCapture(); m_Capture=true; m_Capture=true; m_MousePos=point; m_MousePos=point

72、; SetCursor(LoadCursor(NULL,IDC_CROSS); SetCursor(LoadCursor(NULL,IDC_CROSS); 83鼠标拖动圆的例子(5)n在CTestView:OnMouseMove()中CSize offset; offset=point-m_CSize offset; offset=point-m_M MousePosousePos; ;CRect clientRect,tempRect,newRect;CRect clientRect,tempRect,newRect;GetClientRect(&clientRect);GetClientR

73、ect(&clientRect);if(m_Capture=true)if(m_Capture=true) if(clientRect.PtInRect(point) if(clientRect.PtInRect(point) newRect=m_Ellipse+offset; newRect=m_Ellipse+offset; tempRect.UnionRect(m_Ellipse,newRect); tempRect.UnionRect(m_Ellipse,newRect); InvalidateRect(tempRect,true); InvalidateRect(tempRect,true); m_MousePos=point; m_Ellipse=newRect; m_MousePos=point; m_Ellipse=newRect; 84鼠标拖动圆的例子(6)85第4次作业n设计一个带动画操作的程序,要求具有以下几种功能:带快捷选单(Line、Ellipse、Rectangle)通过点击菜单项输出相应的图形通过工具栏按钮保存与打开图形按键盘上的“M”键开始动画操作,使一个位图(自行设计)沿着图形移动86谢谢大家87

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号