GDI基础及框架应用程序解析_图文_第1页
GDI基础及框架应用程序解析_图文_第2页
GDI基础及框架应用程序解析_图文_第3页
GDI基础及框架应用程序解析_图文_第4页
GDI基础及框架应用程序解析_图文_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、 Windows编程基础1本课程旨在向学员介绍:1掌握GDI基础应用2掌握框架应用程序开发过程3深入透彻理解框架应用程序时间:学时6教学方法:讲授+课上练习+课下作业第七章GDI基础及框架应用程序解析2 3从需求开始编写一个单文档应用程序,程序运行后界面显示:”这是一个单文档应用程序!” . 4三种典型的Visual C +应用程序使用AppWizard 创建项目时可以选择三种类型的应用界面即单文档、多文档和基于对话框的应用程序。单文档程序一次只能打开一个文件或文档,如记事本程序。多文档程序一次可以打开多个文档,如word 程序。使用AppWizard 创建单文档和多文档程序几乎一样,差别在于

2、:在创建SDI 界面的应用程序时,生成CMainFrame 类,CMainFrame 类的基类为CFrameWnd 在创建MDI 界面的应用程序时,CMainFrame 类的基类为CMDIFrameWnd ,生成CMDIChildWnd 类 5每次当视窗需要被重新绘制时,应用程序框架就要调用OnDraw 函数。驱使程序调用OnDraw 的两个途径:用户改变窗口的尺寸;窗口恢复先前被遮盖的部分;应用程序改变了窗口数据;程序中调用Invalidate (或者InvalidateRect ,通知Windows 调用OnDraw 函数OnDraw 成员函数 MFC中有许多类,但只有少数几个核心的类会对

3、应用程序的基本框架产生影响,它们分别是CWinAppCDocumentCViewCFrameWndCDocTemplate这5个类构成了大部分MFC文档/视图框架应用程序的核心,6 MFC并不是直接利用这些类生成框架,而是使用他们的派生类。基类派生类CWinApp CHelloAppCFrameWnd CMainFrameCDocument CHelloDocCView CHelloView使用派生类优点继承基类功能继承了框架方便增加新功能7 8应用程序类和框架窗口类应用程序类(CWinApp : 用MFC 编写的程序中唯一必不可少的类就是CWinApp ,它控制程序的流程。框架窗口(CFra

4、meWnd 框架窗口是应用程序的顶层窗口,通常是WS _OVERLAPPEDWINDOW 样式的窗口,带有可缩放边框,标题栏、系统菜单以及最小化、最大化和关闭按钮,它担当了视图的容器SDI 应用程序只有一个框架窗口CFrameWnd ,它被用作应用程序的顶层窗口并来包含视图。MDI 应用程序使用两种不同类型的框架窗口,其中CMDIFrameWnd 用作顶层窗口,而CMDIChildWnd 在顶层窗口中浮动用来包含应用程序文档的视图 在文档/视图结构中,文档是用来管理和组织数据的。CDocument类支持文档的标准操作,为了在应用程序中处理文档,首先应该从CDocument类派生出一个属于自己的

5、文档类,并且在类中声明一些成员变量,用来存放数据;然后完成读取和修改文档数据的成员函数;最后再至少重载专门负责文件读写操作的Serialize( 函数。9 10在使用MFC 创建新的应用程序框架时,AppWizard 准备好了文档类的空壳class CHelloDoc : public CDocument protected : CHelloDoc (; DECLARE _DYNCREATE (CHelloDoc public : virtual BOOL OnNewDocument (; virtual void Serialize (CArchive & ar ; ; 11视图类-1/4在

6、文档/视图结构中,视图的作用是显示和编辑文档数据,提供用户与文档数据的交互接口。视图在MFC 的CView 类里被实例化。在开发应用程序时,应该从CView 类派生出一个属于自己的视图类,并且在类中至少改写专门负责显示数据的OnDraw (函数或OnPrint (函数。 12视图类-2/4class CHelloView : public CView /派生出一个属于自己的视图类protected : / create from serialization onlyCHelloView (; DECLARE _DYNCREATE (CHelloView public :CMyDoc * Get

7、Document (; /得到与之相关联的文档对象的指针public :virtual void OnDraw (CDC * pDC ; / 负责显示数据的OnDraw (函数 virtual BOOL PreCreateWindow (CREATESTRUCT & cs ;protected :virtual BOOL OnPreparePrinting (CPrintInfo * pInfo ; virtual void OnBeginPrinting (CDC * pDC , CPrintInfo * pInfo ;public :virtual CHelloView (; ; CVie

8、w类和它的9个派生类封装了视图的各种不同的功能,它们为用户实现最新的Windows特性提供了很大的便利。这些派生视图类也可以作为用户程序中视图类的基类,而将这些视图类设置为基类的最基本的方法是在MFCAPPWizard创建SDI/MDI的第6步中进行基类的选择。这些视图类如下表所示。13 1415框架窗口、文档、视图类关系 16文档模板(Document Template 文档模板定义了文档、视图和框架窗口这3个类的关系。MFC 提供了一个文档模板类CDocTemplate 支持文档模板。文档模板类是一个抽象的基类,它定义了文档模板的基本处理函数接口。由于它是一个抽象基类,因此不能直接用它来定

9、义对象而必需用它的派生类。对一个单文档界面程序,使用CSingleDocTemplate 类,而对于一个多文档界面程序,使用CMultipleDocTemplate 类。 17应用实例应用实例1:小球运动基础版,实现小球从左上角到右下角移动应用实例2:小球运动升级版,当小球碰到边界是,实现反弹功能。图形设备接口Windows操作系统具有丰富的图形界面,可以说图形是Windows应用程序的主体,这些图形包括一般的几何图形、位图、光标形状、甚至文本。为了实现Windows应用程序的图形化,Windows操作系统提供了大量的函数,实现绘图要求,这些函数的集合,我们称之为图形设备接口。GDI的结构:从

10、程序员的角度来看,GDI由几百个函数调用和一些相关的数据类型和宏组成。在GDI32.DLL中。(Window三大模块:KERNEL32.DLL、USER32.DLL 、GDI32.DLL18 在Windows应用程序中,应用程序的输出并不直接面向物理设备,如显示屏或打印机,而是针对一个称之为设备描述表(Device Context的逻辑设备进行操作,设备环境与实际设备之间的信息传送由Windows直接管理。设备描述表(Device Context简称为DC,也称设备上下文、设备环境,是一种包含各种绘图属性(如前面所说的字体、颜色和方法(即各种绘图函数的数据结构,它定义了设备、画图工具和画图信息

11、,它不仅可以绘制各种图形,而且还可以确定在应用窗口中绘制图形的方式和图形的样式,它是应用程序与输出设备之间的桥梁。19 如果想在一个图形输出设备上绘图:首先获得一个DC的句柄(类型:HDC在GDI函数中将这个句柄作为一个参数,告诉Windows你想在这个设备上进行绘图。20 21设备描述表-3/3得到DC 句柄后,Windows 会使用默认的属性值,然后将这些属性值填入到设备表结构。可以通过设置设备描述表属性的GDI 函数改变这些属性值。通过GDI 获取属性信息函数可以取得这些属性的当前值。还有其他的一些GDI 绘图函数可以实现在客户区上绘图。 22MFC 中的设备描述表在MFC 编程中,设备

12、描述表被封装成类。在MFC 编程方式中,程序员不用捕获设备描述表句柄和调用GDI 输出函数,而是通过创建一个设备描述表对象并调用它的成员函数来实现画图和文本显示。MFC 的CDC 类将Windows 设备描述表和获取设备描述表句柄的GDI 函数封装在一起,而CDC 的派生类如CPaintDC 和CClientDC 则代表Windows 应用程序使用不同类型的设备描述表。CObjectCDCCClientDCCWindowDCCPaintDCCMetaFileDC23 CDC类它是所有设备描述表的基类.CPaintDC类这是创建响应WM_PAINT消息的DC,仅限于OnPaint处理程序,也就是

13、说通常它在OnPaint应用程序的OnPaint函数中使用,注意OnPaint函数会调用OnDraw函数。CClientDC类这是客户区设备描述表,在窗口中画图可以使用这个类(除了WM_PAINT消息外。24 CWindowDC类这是代表整个窗口的设备描述表,包括客户区和非客户区CMetaFileDC类这是代表Windows图元文件的DC。25CWindowDC、CPaintDC、CClientDC比较绘图区域不同用CPaintDC和CClientDC类的对象绘制图形时,绘制区只能是客户区,而不能在非客户区;而CWindowDC可以在非客户区进行绘图。绘图坐标系不同在CWindowDC绘图类下

14、,坐标系是建立在整个屏幕之上的,在像素坐标方式下,坐标原点在屏幕的左上角。而CPaintDC和CClientDC类的坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。2627CDC 设备描述表属性函数CDC :GetMapMode CDC :SetMapMode MM _TEXT 映射模式CDC :SelectObject CDC :SelectObject WHITE _BRUSH 当前画刷CDC :SelectObject CDC :SelectObject BLACK _PEN 当前画笔CDC :GetTextColor CDC :SetTextColor Black

15、 文本颜色获取函数设置函数缺省值属性 28方法1:GetDC 函数最常用的调用形式有两种,一种是Windows API 函数形式,如下:HDC GetDC (HWND hWnd / handle to window;该函数只有一个参数,此参数是想要获得的DC 所在的窗口的句柄,如果该参数为NULL ,那么得到的DC 将是整个屏幕释放函数格式:int ReleaseDC ( HWND hWnd , HDC hDC 另一种是CWnd 类的成员函数,如下:CDC * GetDC ( ;int ReleaseDC ( CDC * pDC ; 29方法2:BeginPaint 函数其最常用的调用形式也有

16、两种,一种是Windows API 函数形式,如下:HDC BeginPaint ( HWND hwnd , LPPAINTSTRUCT lpPaint ;该函数有两个参数,一个是需要重绘的窗口的句柄,另一个是指向结构PAINTSTRUCT 变量的指针。释放函数格式:BOOL EndPaint ( HWND hWnd ,CONST PAINTSTRUCT *lpPaint ;另一种常用的形式是CWnd 类的成员函数,如下:CDC * BeginPaint ( LPPAINTSTRUCT lpPaint 释放函数格式:void EndPaint ( LPPAINTSTRUCT lpPaint ;

17、 方法3:直接构造CDC对象该方法是用声明一个CDC类或其派生类对象的方式来获取。方法如下:CClientDC dc( CWnd* ;此时构造的是一个对象。这种方法实际上是间接使用了GetDC成员函数。因为当一个C+类声明一个对象时,系统会自动调用该类的构造函数,而在CClient类的构造函数中就调用了GetDC函数。当这个对象被释放时,又会自动调用该类的析构函数,在析构函数中则调用了ReleaseDC函数,用例释放设备描述表。30 31关于设备描述表使用说明当在栈上构造DC ,若对象的生命周期结束,则它的析构函数会被自动调用,而且析构函数一旦被调用,设备描述表就会返回给Windows 。当在

18、堆上用new 创建设备描述表(DC 时,要注意亲自释放设备描述表,如:CPaintDC * pDC =new CPaintDC (this ;在这种情况下,有必要在创建设备描述表的函数结束之前执行删除语句。delete pDC ; 32MFC 框架封装的OnPaint (函数void CView :OnPaint ( CPaintDC dc (this ; OnPrepareDC (&dc ; OnDraw (&dc ; 说明:CPaintDC 的构造函数自动调用BeginPaint 函数,析构函数中自动调用EndPaint 函数 第一个WM_PAINT消息大多数应用程序在WinMain中进入

19、消息循环之前的初始化期间都会调用函数UpdateWindow。Windows利用这个机会给窗口过程发送第一个WM_PAINT消息什么情况会产生WM_PAINT消息?在用户移动或显示窗口时,窗口中先前被隐藏的区域重新可见;用户改变窗口的大小。程序使用ScrollWindow或ScrollDC函数滚动客户区的一部分;程序使用InvalidateRect或InvalidateRgn等函数时,这种方法经常被使用。其它情况:如下拉菜单或工具条提示信息等情况33 34GDI 对象应用实例例:在View 窗口中实现画线的功能,以鼠标左键按下及抬起点做端点画线。实现过程:新建MFC 应用程序在View 类中添

20、加成员变量,用于保存鼠标按下点的坐标。添加响应的消息WM _LBUTTONDOWN 和WM _LBUTTONUP .实现消息响应函数使用MoveTo 和LineTo 成员函数 35与绘制图形相关的几个类先介绍几个常用的与图形绘制有关的数据结构类。1.CPoint 类2.CSize 类3.CRect 类4.RGB 宏图形对象图形对象类是MFC封装的Windows绘图工具CObjectCGdiObjectCPen CBrush CFont CBitmap CPalette CRgn 画笔类刷子类字体类位图类调色板类区域类36 37画笔对象MFC 类CPen 封装了GDI 中的画笔对象,画笔对象代表

21、了进行绘制时所用的线条。默认画笔画出的是一个像素点宽的黑色实线。Windows 用当前选入DC 的画笔绘制直线和曲线,并给用Rectangle 、Ellipse 以及其它图形生成函数画出的图形镶画边框。 方法一:构造一个CPen对象并把定义画笔所用参数都传给该对象。CPen pen(PS_SOLID,1,RGB(255,0,0;方法二:构造一个没有初始化的CPen对象并调用CPen:CreatePen。CPen pen;pen.CreatePen(PS_SOLID,1,RGB(255,0,0;38 39方法三:构造一个没有初始化的CPen 对象,向LOGPEN 结构中填充描述画笔特性的参数,然

22、后再调用CPen :CreatePenIndirect 生成画笔。 CPen pen ;LOGPEN lp ; lp .lopnStyle =PS _SOLID ; lp .lopnWidth .x =1; lp .lopnColor =RGB (255,0,0; pen .CreatePenIndirect (&lp ; BOOL CreatePen( int nPenStyle, int nWidth,COLORREF crColor ;其中参数nPenStyle代表了画笔的样式,可以为下列值之一PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDO

23、T,PS_NULL,PS_INSIDEFRAME怎样使用创建好的画笔只要把画笔选入DC,然后调用画线函数即可。示例如下:CPen pen(PS_SOLID,10,RGB(255,0,0;/红色画笔CPen *pOldPen=dc.SelectObject(&pen;dc.Ellipse(0,0,100,100;40 41 42 43画笔的使用格式在OnDraw 函数中CClientDC dc (this ;CPen NewPen ,*OldPen ;NewPen .CreatePen (PS _DASH ,1,RGB (255,0,0;OldPen =dc .SelectObject (&Ne

24、wPen ;使用该笔进行绘画;dc .SelectObject (OldPen ; 44刷子对象用来在GDI 输出时填充一个封闭图形的内部。在绘制时,Windows 将多个这样的位图平铺起来填充封闭图形的内部MFC 的CBrush 类封装了刷子对象CBrush ( ;CBrush (COLORREF crColor ;CBrush (int nIndex ,COLORREF crColor ;CBrush (CBitmap * pBitmap ;crColor 刷子颜色nIndex 刷子图案 画刷有三种基本类型:单色画刷:它填充的是单色带阴影话刷:它采用预先定义好的交叉线图案填充图形。图案话刷

25、:它采用位图来填充图形。单色画刷的创建方法方法一:将COLORREF的值传递给CBrush构造函数。Cbrush brush(RGB(255,0,0;方法二:创建一个没有初始化的CBrush对象,然后调用CBrush:CreateSolidBrush函数。方法三:将LOGBRUSH初始化并调用CBrush:CreateBrushIndirect45 阴影画刷的创建方法:方法一:CBrush brush(HS_DIAGCROSS,RGB(255,0,0;方法二:CBrush brush;brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0;成员函数CreateHatchBrush创建一个阴影刷子,其原型如下:BOOL CreateHatchBrush( int nIndex, COLORREFcrColor 参数nIndex指定了刷子的样式,它可以为以下常量之一:HS_BDIAGONAL:由左向右下斜45度的阴影线HS_CROSS:水平和垂直的交叉线HS_DIAGCROSS:45度的斜交叉线46 字体对象字体对象决定的设备上下文中进行文本输出的字符样式。在使用字体对象的时候,我们一般先创建一个CFont对象,然后调用CreateFont、CreateFontIndirect、CreatePointFont及CreatePointFontI

温馨提示

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

最新文档

评论

0/150

提交评论