CHP7 图形设备接口(东软mfc培训)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

图形设备接口隋秀凤suixf@neusoft.com东软IT人才实训中心3Sept.2008ConfidentialCopyright2008ByNeusoftGroup.Allrightsreserved3Sept.2008Confidential目的与目标学时:3学时教学方法:讲授ppt+上机练习+点评•通过本课的学习,学员应该掌握如下知识:•1.理解设备描述表及设备描述表类。•2.使用GDI对象的方法。3Sept.2008ConfidentialMFC设备描述表类应用程序MFC设备描述表图形设备接口(GDI)设备驱动程序物理硬件设备描述表类3Sept.2008Confidential设备描述表•设备描述表(DeviceContext简称为DC),也称设备上下文、设备环境,是一种包含各种绘图属性(如前面所说的字体、颜色)和方法(即各种绘图函数)的数据结构,它定义了设备、画图工具和画图信息,它不仅可以绘制各种图形,而且还可以确定在应用窗口中绘制图形的方式和图形的样式。Windows所有的绘制操作及图形输出都必须通过设备描述表这一虚拟用户工作区来进行。用户在绘图之前,必须获取绘图窗口区域的一个设备环境DC,接着才能进行GDI函数的调用,执行适合于设备环境的命令3Sept.2008ConfidentialMFC提供的设备描述表类CObjectCMetaFileDCCDCCPaintDCCClientDCCWindowDCCDC类的主要功能是定义设备描述表对象;提供在显示器上绘图和在打印机上图形输出的方法。3Sept.2008ConfidentialCDC类•CDC类封装了DC和GDI。–DC的句柄在CDC类中是一个public成员(m_hDC)。–不同的设备和屏幕区域,派生出不同的子类。通常使用这些子类。–所有GDI函数都以CDC类成员函数的形式出现。3Sept.2008ConfidentialCClientDC类•该类中的设备描述表表示窗口的客户区。客户区左上角的坐标为(0,0)•CClientDC的构造函数调用GetDC(),析构函数调用ReleaseDC()3Sept.2008ConfidentialCClientDC的使用步骤•创建CClientDC对象•在CClientDC对象上绘画•撤消CClientDC对象3Sept.2008ConfidentialCWindowDC类•该类的设备描述表表示整个窗口(包括用户区和非用户区)•CWindowDC的构造函数调用GetDC(),析构函数调用ReleaseDC()•使用方式同CClientDC3Sept.2008ConfidentialCPaintDC类•如果需要重新编写视窗类中的OnPaint函数,就需要使用CPaintDC类•通常在处理WM_PAINT消息时,系统自动调用OnPaint(只显示在屏幕上),OnPaint函数再调用OnDraw函数(可以同时显示在屏幕和打印机上)•CPaintDC类的构造函数将调用BeginPaint(),析构函数调用EndPaint()。3Sept.2008ConfidentialCWindowDC、CPaintDC、CClientDC比较•绘图区域不同–用CPaintDC和CClientDC类的对象绘制图形时,绘制区只能是客户区,而不能在非客户区;而CWindowDC可以在非客户区进行绘图。•绘图坐标系不同–在CWindowDC绘图类下,坐标系是建立在整个屏幕之上的,在像素坐标方式下,坐标原点在屏幕的左上角。而CPaintDC和CClientDC类的坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。3Sept.2008ConfidentialCPaintDC与CClientDC比较•绘图机制不同–二者都是在窗口的客户区内绘图。CPaintDC应用在OnPaint函数中,以响应Windows的WM_PAINT消息,而后者应用在非响应消息WM_PAINT的情况下。CPaintDC类响应WM_PAINT消息,自动完成绘制,这对维护图形的完整性有着重要的作用。通俗点说,当用CPaintDC类在OnPaint函数中绘图操作之后,当窗口由于被覆盖或其他什么原因使窗口重画时,系统会自动调用OnPaint函数,那么该函数中的绘图语句同样又被自动调用,又执行了绘图操作,这样就保持了图形的完整性。CClientDC类,可以实时的将图形绘制在屏幕上,需要什么时候画就什么时候画,如果用CPaintDC完成同样的工作,只能发出指令让包含要绘制的这条直线的屏幕部分重画,把这条直线绘制到屏幕上。当然,这个重画区域的其他图形元素同时也会重画。•适用范围不同–CPaintDC只能支持屏幕显示,而CClientDC除了支持屏幕显示,还支持打印3Sept.2008ConfidentialCPaintDC的使用格式voidCMainWnd::OnPaint(){CPaintDCdc(this);//参数为CWnd*CRectrc;GetClientRect(&rc);利用CDC中的有关绘画的成员函数进行绘画OnDraw(&dc);}注意:一般不需要重写OnPaint,但若重写,一定要调用OnDraw()函数3Sept.2008ConfidentialCPaintDC的使用格式对比WIN32与MFC响应WM_PAINT消息区别WIN32:hdc=BeginPaint(hWnd,&ps);…EndPaint(hWnd,&ps);MFC:CClientDCdc(this);CDC*pDC=GetDC();看一下:原来的Windows下的设备句柄HDC和绘制功能被打包成了CDC类3Sept.2008ConfidentialCDC的使用格式voidCMainWnd::OnLButtonDown(){CClientDCdc(this);//参数为CWnd*CWnd*pWnd;CDC*pDC=pWnd-GetDC();…ReleaseDC(pDC);}3Sept.2008Confidential获取CDC的方法•方法1:GetDC函数昀常用的调用形式有两种,一种是WindowsAPI函数形式,如下:HDCGetDC(HWNDhWnd//handletowindow);•该函数只有一个参数,此参数是想要获得的DC所在的窗口的句柄,如果该参数为NULL,那么得到的DC将是整个屏幕。•另一种是CWnd类的成员函数,如下:CDC*GetDC();3Sept.2008Confidential获取CDC的方法•方法2:BeginPaint函数•其昀常用的调用形式也有两种,一种是WindowsAPI函数形式,如下:HDCBeginPaint(HWNDhwnd,LPPAINTSTRUCTlpPaint);•该函数有两个参数,一个是需要重绘的窗口的句柄,另一个是指向结构PAINTSTRUCT变量的指针。•另一种常用的形式是CWnd类的成员函数,如下:–CDC*BeginPaint(LPPAINTSTRUCTlpPaint)3Sept.2008Confidential获取CDC的方法•方法3:直接构造CDC对象•该方法是用声明一个CDC类或其派生类对象的方式来获取。方法如下:–CClientdcdc(CWnd*);•此时,构造的是一个对象。这种方法实际上是间接使用了GetDC成员函数。因为当一个C++类声明一个对象时,系统会自动调用该类的构造函数,而在CClient类的构造函数中就调用了GetDC函数,当这个对象被释放时,又会自动调用该的析构函数,而在析构函数中,则调用了ReleaseDC函数来释放设备描述表3Sept.2008Confidential设备上下文环境状态•GDI图形对象•映射模式•文本对齐格式3Sept.2008Confidential图形对象图形对象类是MFC封装的Windows绘图工具CObjectCGdiObjectCPenCBrushCFontCBitmapCPaletteCRgn画笔类刷子类字体类位图类调色板类区域类3Sept.2008Confidential使用各种图形对象的基本步骤•定义图形对象,用Create*()方法初始化对象。•使用CDC::SelectObject()方法,选择新对象进入当前设备描述表。•结束时,恢复原始的图形对象。3Sept.2008ConfidentialCPen类⎯画笔的样式•PS_SOLID实线笔•PS_DASH宽度为1时的虚线笔•PS_DOT宽度为1时的点线笔•PS_DASHDOT宽度为1时的虚线及点交替笔•PS_DASHDOTDOT宽度为1的虚线及双点交替笔•PS_NULL空笔•PS_INSIDEFRAME在WinGDI边界内绘制形状的笔BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor)3Sept.2008Confidential常用的使用格式•在OnDraw函数中CClientDCdc(this);CPenNewPen,*OldPen;NewPen.CreatePen(PS_DASH,1,RGB(255,0,0));OldPen=dc.SelectObject(&NewPen);•使用该笔进行绘画;–dc.SelectObject(OldPen);思考问题:如果创建另一只笔,应如何实现?3Sept.2008ConfidentialCBrush类•可直接利用构造函数CBrush::CBrush()创建Windows刷子。–CBrush();–CBrush(COLORREFcrColor);–CBrush(intnIndex,COLORREFcrColor);–CBrush(CBitmap*pBitmap);•crColor刷子颜色•nIndex刷子图案3Sept.2008Confidential刷子阴影线样式•HS_BDIAGONAL45o下降阴影线•HS_CROSS水平和垂直交叉阴影线•HS_DIAGCROSS45o十字交叉阴影线•HS_FDIAGONAL45o上升阴影线•HS_HORIZONTAL水平阴影线•HS_VERTICAL垂直阴影线3Sept.2008Confidential刷子应用举例CPaintDCdc(this);CBrushbr(HS_BFDIAGONAL,RGB(0,0,255));CBush*pbrOld=dc.SelectObject(&br);•使用该刷子进行绘画;dc.SelectObject(pbrOld);3Sept.2008ConfidentialWindows系统字体的使用Windows有六种库存字体ANSI_FIXED_FONT固定宽度ANSI_VAR_FONT变宽DEVICE_DEFAULT_FONT设备默认字体OEM_FIXED_FONT固定宽度SYSTEM_FIXED_FONT固定高度SYSTEM_FONT均匀间距3Sept.2008Confidential使用系统字体举例CFont*pOldFont=(CFont*)dc.SelectStockObject(ANSI_FIXED_FONT);charmsg[]=“Hello,World”;dc.TextOut(20,50,msg,strlen(msg));……dc.SelectObject(pOldFont);3Sept.2008ConfidentialGDI对象应用实例•画笔的使用•例1:在View窗口中实现画线的功能,以鼠标左键按下及抬起点做端点画线。•实现过程:–新建MFC应用程序–在View类中添加成员变量,用于保存鼠标按下点的坐标。–添加响应的消息WM_LBUTTONDOWN和WM_LBUTTONUP.–实现消息响应函数•使用MoveTo和LineTo成员函数3Sept.2008ConfidentialGDI对象应用实例•画笔的使用•例2:对刚才的实例进行改进,在鼠标移动过程中实现画线功能,类似画图程序中的画笔功能。•实现过程:–新建MFC应用

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功