《MFC简介及第一个MFC程序》由会员分享,可在线阅读,更多相关《MFC简介及第一个MFC程序(40页珍藏版)》请在金锄头文库上搜索。
1、1Windows编程基础2本课程旨在向学员介绍:1)了解 MFC类库2)理解第一个 MFC程序执行过程时间:学时 5教学方法:讲授 +课上练习 +课下作业第二章 MFC简介及第一个 MFC程序3 编写 Windows应用程序主要有三种方法 方法 1:调用 Windows环境提供的 Win32 API函数 (C语言方法 ) 大量程序代码由用户自己编写 方法 2:使用 MFC(微软基础类库 )直接编写 提供大量预先编好的类和支持代码 方法 3:使用 MFC和向导 (Wizards)编写 用 AppWizard来生成 Windows应用程序框架本章内容编写 Windows程序4 用 Windows
2、API方式编程的碰到的问题 : 熟悉 Windows内部原理 手工编写代码(数以千计的 API函数) 回忆开发环境自动产生的代码 如果界面再丰富些,菜单再多一些 ,会怎么样 ? 如何解决? 利用面向对象的思想解决MFC类库产生原因5 面向对象程序设计语言可以将一些变量和函数封装到类中 当变量被类封装后,称之为 属性 或 数据成员 。 当函数被封装后称之为 方法 或 成员函数 对 Windows API函数进行封装,如 Windows API的LoadIcon函数被转化为 CWinApp的成员函数。关于面向对象的思想由谁来实现?注意:函数名称没有改变,好处?6 MFC全称: Microsoft
3、Foundation Classes, 是微软把 Window API进行封装的类库,该类库以层次结构组织起来,其中封装了大部分 Windows API函数和 Windows控件。 1989 年微软公司成立 Application Framework 技术团队,名为 AFX 小组,用以开发 C+面向对象工具给 Windows 应用程序开发人员使用。 AFX 的 “X” 其实 没有什么意义 ,只是为了凑成一个响亮好念的名字。 应用 MFC编程的好处:使 Windows程序员能够利用 C+面向对象的思想进行编程。 出发点: 有好的类库做出发点、减少代码编写量 添加工具条:有 CToolBar. 动
4、态数组:有 CList,CArrayMFC简介 -1/27 两个层次: 首先,我们先会用这些类 其次,思考 AFX小组究竟怎么抽象出来的这些类。MFC简介 -2/28MFC类的组织结构纵览 MFC(VC6.0)200多个类有简单 (CPoint)有复杂 (CWnd)9纵览 MFC(.net)10MFC还很好地保持了程序的向下兼容性是用来编写 Windows应用程序的 C+类集以层次结构组织封装了大部分 API函数提供了 图形环境 下应用程序的框架提供了创建应用程序的组件提供了大量的基类供程序员根据不同的应用环境进行扩充允许在编程过程中自定义和扩展应用程序中的类较好的移植性,可移植于众多的平台M
5、FC11MFC类定义头文件 MFC类定义头文件 :“afxwin.h”class CSize;class CPoint;class CRect;/CObject/CException/CSimpleExceptionclass CResourceExceptionclass CUserException; class CGdiObject; / CDC drawing toolclass CPen; / a pen / HPEN wrapperclass CBrush; / a brush / HBRUSH wrapperclass CFont; / a font / HFONT wrappe
6、rclass CBitmap; / a bitmap / HBITMAP wrapperclass CPalette; / a palette / HPALLETE wrapperclass CRgn; / a region / HRGN wrapper12 不属于任何类,以 afx开头注册窗口类AfxRegisterClass获得程序实例句柄AfxGetInstanceHandle获得程序主窗口指针AfxGetMainWnd获得程序对象的指针AfxGetAppApi函数 messageboxAfxMessageBox结束一个旧线程AfxEndThread开始一个新线程AfxBeginThre
7、ad被 winMain调用的函数,初始化AfxWinInit全局函数13 Hello World文化一脉相承、多种语言百花齐放 C语言 C+CSDN一篇文章 -1/214 JAVA MFCCSDN一篇文章 -2/215 Hello应用程序简化的 MFC程序运行效果16 习惯: 把类的定义放在 .h文件中,把源程序放在 .cpp文件中,随着代码量增加,这种存放方法的优势将更加明显。 窗口拥有哪些功能? 可以移动、调整大小、最小、最大化及正常关闭等简化的 MFC程序文件说明17 使用 Windows API进行 Windows应用程序的开发的好处是可以清楚地看见整个程序的来龙去脉,但 MFC程序把
8、这些内容都包起来了。 一系列问题: WinMain在哪里? RegisterClass,CreateWindow在哪? 消息循环在哪? 窗口过程函数如何执行?简化的 MFC程序如何运行?18CObjectCWndCmdTargetCHelloAppCWinThreadCWinAppCFrameWndCMainFrame简化的 MFC程序类图19 接下来我们开始学习几个非常重要的类: CObject, CCmdTarget, CWinThread, CWinApp CWnd CFrameWnd CObject类 Microsoft基本类库中的 大多数类 都是由 CObject类派生而来的。 CO
9、bject对所有由它派生出的类提供了有用的基本服务,包括动态类信息、动态创建 (Dynamic )、对象序列化(Serialize)等等基本类 -1/420 CCmdTarget类 CCmdTarget 是 MFC 消息映射结构的基类。消息映射将命令或消息发送给应用程序编写的处理命令或消息的响应函数。 具有消息处理能力的类均应为该类的派生类。 CWinThread 类 Microsoft 的类库支持多个 线程的并行执行 。每个应用程序至少有一个线程(被称作 主 线程)。 CWinThread 封装了操作系统的调度功能。基本类 -2/421 CWinApp类: CWinApp 封装了 Windo
10、ws 应用程序 初始化、 运行 、 终止 应用程序的代码。基于框架建立的应用程序必须有一个且只有一个 从 CWinApp派生的类对象。 三个重要的函数 virtual BOOL InitApplication(); virtual BOOL InitInstance(); /CreateWindow virtual int Run(); /消息循环 注意: CWinApp是从 CWinThread派生而来,因此在构造该对象时会调用 beginthreadex和 endthreadex来创建和结束线程。基本类 -3/4完成WinMain函数工作该类是核心22 CWnd类 CWnd是各种 窗口 、
11、 对话框 和 控制框 的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。 CFrameWnd类 提供了一个 Windows 单文档 界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。基本类 -4/423 1. 构造全局对象 CWinApp派生类对象; 2. 运行由应用程序框架提供的 WinMain函数; WinMain是 MFC程序早已准备好 ,并由连接器直接加入到代码中了 . 3. WinMain调用 AfxWinMain函数,通过 AfxGetApp获得全局对象的指针 pApp,调用全局函数 AfxWinInit,为CWinApp的成员变量
12、m_hInstance, m_hPrevInstance, m_lpCmdLine,m_nCmdShow赋初值; 4. 调用 pApp-InitApplication,这是 CWinApp的虚函数,一般不需要改写;简化的 MFC程序启动过程 -1/224 5. 调用 pApp-InitInstance,每个程序都必需改写这个函数,进行应用程序初始化;在 InitInstance函数中,先用new构造一个 CFrameWnd派生类对象,其构造函数又调用 Create,创建主窗口, MFC依次自动为应用程序注册窗口类; 6. 然后调用 ShowWindow显示窗口,调用UpdateWindow,发
13、出 WM_PAINT消息; 7. 回到 AfxWinMain中,调用 pApp-Run,进入消息循环 ;简化的 MFC程序启动过程 -2/2注意看定义25 1. 若用户选择菜单 File/Close,则程序收到 WM_CLOSE消息,调用: DestroyWindow发出 WM_DESTROY消息. 2. 调 PostQuitMessage,发出 WM_QUIT消息,此时 Run会结束其内部消息循环. 3. 调用 ExitInstance;最后,返回 AfxWinMain,执行WinTerm,结束程序运行。简化的 MFC程序结束过程26 开始 结束调用WinMain查找theAppInitIn
14、stance()创建CMainFrame对象显示窗口调用Run函数删除CMainFrame对象退出Run函数退出WinMain删除theApp创建theApp简化的 MFC程序启动和结束过程27程序开始初始化全局对象theApp:CHelloAppCHelloApp构造函数CWinApp构造函数AfxWinMain函数 InitInstance()CMainFrame:CMainFrame()Create();销毁窗口程序结束WM_QUITCHelloApp:ExitInstance空闲CWinApp: OnIdle()CWinApp:InitApplicationCHelloApp:Init
15、InstanceCWinApp:Runm_pMainWnd = new CMyFrameWnd()(创建主窗口对象 )28 MFC应用程序的核心就是基于 CWinApp类的应用程序对象。 CWinApp提供了消息循环来检索消息并将消息调度给应用程序窗口。它还包括可以被覆盖的、用来自定义应用程序的主要虚函数。 实现方法: 包含 AfxWin.h 在 Hello.cpp中使用如下语句: CHelloApp theApp;应用程序类 -1/329 Hello.h中包含了类的声明代码 Initinstance函数调用比较早,在应用程序开始运行之后而窗口创建之前被调用。 注意:除非 InitInstance创建一个窗口,否则应用程序不会有窗口。这正是为什么即使最小的 MFC程序也必须重载 Initinstance函数的原因。应用程序类 -2/3class CHelloApp : public CWinApppublic:virtual