Lesson 03_MFC应用程序的生与死

合集下载

MFC讲义

MFC讲义

1.将MFC应用程序的命令处理路径补充完整:命令—(视图类)—(文档类)—文档模板类—(框架窗口类)—应用程序类2.传统的软件开发主要采用(过程)驱动的方法,而WINDOWS程序的开发使用(消息)驱动模型,该模型靠(事件)机制来实现其功能。

3.(主框架类)是应用程序中负责控制菜单、工具栏和状态栏等界面元素的最主要的类。

4.VC++开发环境可以生成的基于MFC AppWizard exe的应用程序类型有(对话框)(单文档/视图结构)和(多文档/视图结构)。

5.包含类定义的文件称为(头文件),包含类中成员函数的实现代码的文件称为(源文件),包含资源信息的文件称为(资源文件)。

6.Resource View的主要功能是(编辑当前工程中的资源)。

7.应用程序向导的主要功能是(帮助生成应用程序)。

8.导的主要功能是(管理各个类中的消息)。

9.工作区窗口一般在开发环境的左侧,它包含工程的多各方面,分别是(ClassView)、(ResourceView)和(FileView)。

10.项目工作区的文件扩展名为(dsw)。

11. WINDOWS应用程序的消息来源主要包括(输入消息)、(控制消息)、(系统消息)和(用户消息)。

12.发送消息可以采用的两个函数是(PostMessage)和(SendMessage)。

mdUI类的主要功能是(主要用来更新命令用户接口的状态,如子菜单、工具栏上的按钮等)。

14.代码ON_UPDATE_COMMAND_UI(ID_TEST,OnUpdateTest)的主要功能是(将对ID_TEST的更新命令接口消息的处理映射到OnUpdateTest函数上)。

15.CString类的功能是(处理字符串),其Format函数的功能是(格式化字符串)。

16.Ctime类的功能是(处理日期时间),其Format函数的功能是(将时间对象格式化为字符串)。

17.MessageBox函数的第一个参数表示(消息文字),第二个参数表示(标题文字),第三个参数表示(图标与按钮组合).18.在windows中,按下一个字符键,会依次触发(WM_KEYDOWN)、(WM_CHAR)和(WM_KEYUP)3个消息19.windows窗口内部需要重新绘制时,会得到一个(WM_PAINT)消息,当释放鼠标右键时,会得到一个(WM_RBUTTONUP)消息。

#MFC程序的生死因果zb

#MFC程序的生死因果zb

MFC程序的生死因果笔记赵波2009.10.10于厦门华大说明:学习《深入浅出MFC》第六章笔记2009.10.10于厦门华大图书馆一、MFC&Win32二、程序剖析//////[resource.h][resource.h]资源ID 定义//resource.h#define IDM_ABOUT 100//////[stdafx.h][stdafx.h]载入afxwin.h //stdafx.h :include file for standard system include files,or project specific include files that are used frequently,but are changed infrequently#include <afxwin.h>//MFC core and standard components//////[stdafx.cpp][stdafx.cpp]制造Precompiled header ///原因原因:因为:因为afxwin.afxwin.hh 等.H 文件非常巨大且内容不变,编译器在这上面浪费的时间比较多。

Precomiled header 就是将.H 文档第一次编译后的结果存储起来,第二次编译时就可以直接从磁盘中取出来用。

//stdafx.cpp :source file that includes just the standard includes ;Hello.pch will be the pre-compiled header ;stdafx.obj will contain the pre-compiled type information#include "stdafx.h"//////[hello.h][hello.h]成员函数声明class CMyWinApp :public CWinApp{public:virtual BOOL InitInstance();//每一个应用程序都应该改写此程序virtual BOOL OnIdle(LONG lCount);//OnIdle 用来处理idle time};//--------------------------------------------------------------------class CMyFrameWnd :public CFrameWnd{public:CMyFrameWnd();//constructorafx_msg void OnPaint();//for WM_PAINTafx_msg void OnAbout();//for WM_COMMAND (IDM_ABOUT)void IdleTimeHandler(LONG lCount);//we want it call by CMyWinApp::OnIdle private:DECLARE_MESSAGE_MAP()//Declare Message Mapstatic VOID CALLBACK LineDDA Callback (int,int,LPARAM);//callback 必须是静态的才能除去隐藏指针this//////callback callback 函数函数:凡是你设计的却为:凡是你设计的却为Windows 系统调用的函数统称callback 函数。

深入浅出MFC学习笔记之第六章 :MFC程序的生死因果

深入浅出MFC学习笔记之第六章 :MFC程序的生死因果

软件英才网软件行业驰名招聘网站第六章:MFC程序的生死因果本章主要是从MFC程序代码中,找出一个windows程序原本该有的程序入口点、窗口类注册、窗口产生、消息循环、窗口函数等操作。

抽丝剥茧彻底理解一个MFC程序的诞生与结束。

MFC程序需要windows C runtime函数库、DLL import函数库以及MFC函数库。

Windows C runtime函数库为:LIBC.LIB 静态链接版本MSVCRT.LIB 动态链接版本MSVCRTD.LIB D ebug版本。

DLL import函数库GDI32.LIBUSER32.LIBKERNEL32.LIBMFC函数库MFC42.LIBMFC42D.LIBMFCS42.LIBMFCS42D.LIB......SDK程序需要载入windows.h而MFC程序需要另外一些.h文件:软件英才网软件行业驰名招聘网站1:STDAFX.H 它用来载入其他MFC头文件。

2:AFXWIN.H 它和它载入的文件声明了所有的MFC类。

其内包含AFX.H,后者包含了AFXVER_.H,后者又载入了AFXV_W32.H,后者又载入WINDOWS.H。

3:AFXEXT.H 使用工具栏、状态栏的程序必须载入这个文件4:AFXDLGS.H 凡使用通用对话框(Common dialog)的MFC 程序需要载入此文件。

它内部包含COMMDLG.H5:FXCMN.H 凡使用windows 9x新增通用行控件(common control)的MFC程序需要载入此文件。

6:AFXCOLL.H 凡使用MFC提供的容器都需要载入此文件。

7:AFXDLLX.H 凡使用MFC extension DLLs需要载入此文件。

8:AFXRES.H MFC程序的RC文件必须载入此文件。

此文件中对于标准资源的ID都有默认值。

它们定义于此文件中。

MFC头文件均置于MFC\INCLUDE中。

MFC把有着相当固定行为的WinMain内部操作,封装在CWinApp中。

可视化教学PPT MFC应用程序概述

可视化教学PPT MFC应用程序概述

全局函数

AfxAbort( ), 无条件中断应用程序 AfxMessageBox( ), 显示一个消息框 AfxGetApp( ), 返回一个指向Project的 CWinApp Object的指针 AfxGetAppName( ), 返回应用程序的名 字,类型为一个指向字符串的指针 AfxGetMainWnd( ), 返回指向主框架窗 口(Main Frame Window)的指针

可视化程序设计
第3章MFC应用程序概述
第3章 MFC应用程序概述

3.1 微软基础类MFC

MFC概述 MFC的类层次结构 MFC定义的宏、全局函数及全局变量 创建基于MFC框架的应用程序 MFC应用程序分析 消息的种类 消息映射及消息传递 自定义消息

3.2 MFC应用程序框架
ຫໍສະໝຸດ 3.3 消息机制
微软基础类MFC

类库是一个可以在应用程序中使用的相 互关联的类的集合。MFC中包含了200 多个类,封装了Windows的大部分编程 对象和相关的操作。MFC是一个庞大的 文件库,它由几百个执行文件和源文件 构成。
MFC的类层次结构
CObject
CWinThread
CCmdTarget
p B aseM ap _ m essag eE n tries[] lp E n tries n M essag e, n C o d e, n ID , n L astID , n S ig , p fn m essag eM ap
自定义消息
首先定义一个消息 #define WM_MYMESSAGE WM_USER+100 在.CPP文件的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间定义一 个映射函数: ON_MESSAGE(WM_MYMESSAGE OnMyFn) 在相应的.h文件中定义函数 afx_msg LRSULT OnMyFn(WPARAM wParam,LPARAM lParam); 在相应的.h文件中定义函数 LRSULT CMyClass::OnMyFn(WPARAM wParam,LPARAM lParam){ …… return 0; }

VisualC 程序设计教程第三章MFC中的资源与界面设计ppt课件

VisualC 程序设计教程第三章MFC中的资源与界面设计ppt课件
在工作区的ResourceView页面打开String Table 文件夹,双击串表资源,出现如图3-7 所示的串表编辑器,其用法与快捷键编辑器类 似,这里不再详述。
精品课件
精品课件
3.2.8 工具栏
工具栏由一些形象化的位图按钮组成, 以图形方式表示应用程序的操作命令。 工具栏结合了菜单和快捷键的优点,具 有直观快捷、便于用户使用的特点。但 由于工具栏要占用屏幕空间,所以只能 将最常用的命令(一般是菜单命令项) 做成按钮放到工具栏上,并且在需要的 时候可以将工具栏隐藏起来。在工具栏 编辑器中可以添加工具栏以及其按钮。
精品课件
3.1.1微软基础类库MFC
1.MFC概述 MFC中的各种类结合起来构成了一个应用程序框架,它的
目的就是让程序员在此基础上建立Windows下的应用程序, 这是一种相对SDK来说更为简单的方法。总体上,MFC框架 定义了应用程序的轮廓,并提供了用户接口的标准实现方 法,程序员所要做的就是通过预定义的接口把具体应用程 序特有的东西填入这个轮廓。Microsoft Visual C++提供 了相应的工具来完成这个工作:AppWizard可以用来生成 初步的框架文件(代码和资源等);资源编辑器用于帮助 程序员直观地设计用户接口;ClassWizard用来协助将代 码添加到框架文件中;编译则是通过类库实现了应用程序 特定的逻辑。
精品课件
2.MDI应用程序的构成
用AppWizard产生一个MDI工程(无OLE等支 持)时,AppWizard创建了一系列文件,构 成了一个应用程序框架。这些文件分4类: 头文件(.h)、实现文件(.cpp)、资源文 件(.rc)和模块定义文件(.def)。图3-2解 释了该应用程序的结构,箭头表示信息流 向。

mfc使用教程

mfc使用教程

mfc使用教程MFC使用教程不要标题MFC是Microsoft Foundation Class的缩写,是一套C++的库,用于开发Windows平台的应用程序。

以下是一个简单的MFC使用教程,帮助你了解如何创建一个基本的MFC应用程序。

首先,打开Visual Studio并选择创建新项目。

在项目模板中,选择"MFC应用程序"。

在下一步中,选择"对话框"作为应用程序类型。

接下来,选择项目的名称和位置,然后点击"完成"按钮。

Visual Studio将自动生成一个MFC应用程序的基本框架。

应用程序的主要代码位于"MainFrm.cpp"和"MainFrm.h"文件中。

打开"MainFrm.cpp"文件,你将看到一个名为"Create"的函数。

在这个函数中,可以创建应用程序的主窗口。

在"Create"函数的内部,使用"MFC应用程序向导"提供的函数来创建一个对话框。

例如,可以使用"CDialogEx"类来创建一个简单的对话框。

在"Create"函数的最后,需要调用"ShowWindow"函数显示主窗口,并调用"UpdateWindow"函数来更新窗口。

在"MainFrm.h"文件中,你可以定义应用程序的主窗口类。

例如,可以继承自"CFrameWnd"类,并添加自定义的成员变量和函数。

在"MainFrm.cpp"文件的"Create"函数中,还可以添加一些自定义的代码,例如设置窗口的标题和大小,添加菜单和工具栏等。

最后,编译并运行应用程序。

你应该能够看到一个简单的MFC应用程序的窗口。

mfc运行流程

mfc运行流程

mfc运行流程
MFC程序的运行流程如下:
1.程序启动
程序启动时,首先会调用WinMain函数。

WinMain函数是MFC程序的入口函数,负责程序的初始化和运行。

2.程序初始化
在WinMain函数中,会调用CWinApp::InitInstance()函数进行程序的初始化。

CWinApp::InitInstance()函数负责注册窗口类、创建应用程序对象、创建窗口等工作。

3.窗口创建
在程序初始化完成后,会创建应用程序的窗口。

应用程序窗口是应用程序的入口,用户可以通过应用程序窗口与应用程序进行交互。

4.消息循环
在窗口创建完成后,会进入消息循环。

消息循环是MFC程序的核心,负责处理来自操作系统的消息。

5.程序退出
用户关闭应用程序时,会调用CWinApp::ExitInstance()函数退出程序。

CWinApp::ExitInstance()函数负责释放程序使用的资源。

MFC应用程序概述

MFC应用程序概述
如: CView::OnDraw(CDC* pDC) ;
•声明一个 MFC设备环境类的对象,并使用this指针为该 对象赋值。
如:CView::OnLButtonDown(UINT nFlags, CPoint point){ CClientDC dc(this); dc.LineTo(100,100); }
根据指定的左上角和右下角坐标绘制一个矩形
Ellipse()
根据指定的矩形绘制一个内切圆或椭圆
颜色的设置
在绘制图形和图像时,颜色是一个重要的因素。Windows用COLORREF类型 的数据存放颜色,它实际上是一个32位整数。 任何一种颜色都是由红、绿、蓝3种基本颜色组成的,COLORREF类型数据 的低位字节存放红色强度值,第2个字节存放绿色强度值,第3个字节存放蓝 色强度值,高位字节为0,每一种颜色分量的取值范围为0~255。 MFC提供了RGB宏,用于设置颜色,它将其中的红、绿、蓝分量值转换为 COLORREF类型的颜色数据,其使用形式为: RGB(byRed,byGreen,byBlue) 其中参数byRed、byGreen和byBlue分别表示红、绿、蓝分量值(范围0~ 255)。 以下是一些常用颜色的RGB值。 黑色 RGB(0,0,0) 白色 RGB(255,255,255) 红色 RGC(255,0,0)
创建和使用自定义画笔 如果要在设备环境中使用自己的画笔绘图,首先 需要创建一个指定风格的画笔,然后选择所创建的画 笔,最后还原画笔 最后还原画笔。 最后还原画笔 1.创建画笔 1.创建画笔 创建画笔的方法有两种:
(1)定义画笔对象时直接创建,例如 CPen PenNew(PS_DASH,1,RGB(255,0,0));
获取设备环境 绘图前,必须准备好设备环境DC。设备环境不像其他 Windows结构,在程序中不能直接存取,只能通过系统提 供的一系列函数或使用设备环境的句柄HDC来间接地获取 或设置设备环境结构中的各项属性,这些属性包括显示器 高度和宽度、支持的颜色数及分辨率等。

Visual C++第03章 MFC基本应用程序的建立

Visual C++第03章  MFC基本应用程序的建立

第3章MFC基本应用程序的建立C++面向对象程序设计语言是在C语言的基础上发展起来的,它与传统的程序设计方式不同,而是一种新的程序设计范型。

它对降低软件的复杂性,改善其重要性和维护性、提高软件的生产效率,有着十分重要的意义。

因此面向对象程序设计被普遍认为是程序设计方法的一场实质性的革命Visual C++是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境,它使C++语言在Windows平台上得到了有效的可视化的应用。

C++编程都是在控制台方式下运行的,这样可以在不需要太多涉及Visual C++的细节而专心于C++程序设计的本身。

但是,当C++及程序设计基本掌握后,我们就不能仅停留在控制台方式下运行,因为学习C++的目的在于应用,从本章开始,将着重讨论如何用Visual C++的强大功能开发Windows应用程序。

我们将看到,展现在你面前的是彩色亮丽的图形图像及千变万化的可移动的文字、影像界面。

像市场流行的游戏软件、企事业管理、图形图像处理、银行、电信、教育及各大小网站的软件编程和网页设计等。

本章一、二节是Windows编程和MFC编程,不是我们重点掌握的,大家可以自己看看,也是有帮助的。

我们从第三节(150页):使用MFC AppWizard(应用程序向导)开始讲。

前面一、二节中需要大家掌握的是:1、Windows应用程序上机编程操作步骤(C++上机编程操作步骤,教材140页)2、理解Windows编程特点中的:消息驱动机制概念、图形设备接口概念、基于资源的程序设计概念、动态连接库概念、进程和线程的概念、阅读147页MFC 应用程序并理解其代码(146—149页)(做为讨论题留给大家)实际上,在Visual C++6.0中,我们不需要加入更多的Windows程序代码,就能创建所需要的应用程序,这就是我们要着重掌握的MFC AppWizard(应用程序向导),它能为用户快速、高效、自动地生成一些常用的标准程序结构和编程风格,它们被称为应用程序框架类型(MFC AppWizard提供的各应用程序框架类型150页说明)其中:MFC AppWizard(exe)是我们常用的(一般MFC的Windows应用程序),它包含用户最常用、最基本的3种应用程序类型:单文档、多文档和基于对话框的应用程序。

MFC应用程序框架的生成和消息处理精品PPT课件

MFC应用程序框架的生成和消息处理精品PPT课件
►CWnd类提供的功能包括注册新窗口类、创建窗口 及子窗口、获取窗口、管理窗口、访问窗口及控 件、控制窗口光标、创建和使用句柄和支持工具 提示等,
结束语
当你尽了自己的最大努力时,失败也是伟大的, 所以不要放弃,坚持就是正确的。
When You Do Your Best, Failure Is Great, So Don'T Give Up, Stick To The End
2.MFC应用程序窗口的创建
创建窗口的过程
Create函数的原型
参数说明:
►第一个参数lpszClassName指定WNDCLASS窗 口类别,值为NULL代表以MFC内建的窗口类 别产生一个标准的外框窗口。
Create函数的调用过程
►CFrameWnd::Create(8个参数) ►CFrameWnd::PreCreateWindow(…) ►CFrameWnd::OnCreate(…) ►CFrameWnd::OnCreateClient(…)
►CFrameWnd提供了若干个成员函数用于获得和 设置活动文档、视图、图文框、标题栏、状态栏 等操作。
CWnd类 ►CWnd类由CCmdTarget类直接派生而来,该类及
其派生类的实例是一个窗口。CWnd类代表了MFC 中最基本的GUI对象,它是一个功能最完善、成 员函数最多的MFC类。
►窗口的实例包括应用程序主窗口、对话框和控件 等。
谢谢大家
荣幸这一路,与你同行
It'S An Honor To Walk With You All The Way
演讲人:XXXXXX 时 间:XX年XX月XX日
注意:特殊注解“//{{AFX_MSG_MAP”是ClassWizard类 向导用于维护消息映射宏的标记,用户不要删除注解轻易 修改注解内的代码。

MFC原理与方法

MFC原理与方法
先大体上了解MFC的概念、组成和基本约定,从简单的类入手, 结合程序设计,由浅入深,循序渐进、日积月累。
编程时如果MFC某个类能完成所需要的功能,可以直接调用已 有类的方法(成员函数)。否则,可以利用面向对象技术中的 “继承”方法对MFC类的行为进行扩充和修改,从MFC中已有 的类派生出自己需要的类。
Hale Waihona Puke CMainFrame类类 CMainFrame 是由 MFC 中的 CFrameWnd 派生的,所 以它也是一个框架窗口。CMainFrame 是类 CXXView 的 父类,即 CXXView 类的对象显示在主框架窗口的客户 区中。在类 CMainFrame 中,系统已经从类 CFrameWnd 中继承了处理窗口的一般事件的 Windows 消息,如改变窗口的大小、窗口最小化等的成员函数 ,因此编程时程序员不必关心此类消息的处理,从而 减轻了程序员的负担。当然,如果确实需要重新编写 此类消息的成员函数,则需要对原有的成员函数进行 重载。
MFC 中的大部分类都是从基类 CObject 中继承的,该 类包含大部分 MFC 类所通用的数据成员和成员函数;
CWinApp 类是在建立应用程序时需要用到的,并且在 任何程序中都只用一次;
CWnd 类汇集了 Windows 中的所有通用特性、对话框 和控制。
CFrameWnd 类是从 CWnd 中继承的,并实现了标准的 框架应用程序;
CDialog 可分别处理无模式和有模式两种类型的对话框 。
CView 用于让用户通过窗口来访问文档。
MFC应用程序的生与死
在MFC应用程序的CWinApp派生类对象theApp是一个全局变 量,代表了应用程序运行的主线程。它在程序整个运行期 间都存在,它的销毁意味着运行程序的消亡。

mfc课程设计课程表

mfc课程设计课程表

mfc课程设计课程表一、教学目标本课程的教学目标是让学生掌握MFC(Microsoft Foundation Classes)的基本概念和编程技术,能够运用MFC进行Windows应用程序的开发。

具体分为以下三个部分:1.知识目标:学生需要了解MFC的体系结构、基本概念和常用类;掌握MFC应用程序的创建步骤和基本编程技术。

2.技能目标:学生能够独立完成MFC应用程序的设计和开发,解决实际编程过程中遇到的问题。

3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生独立思考和解决问题的能力,培养学生的团队协作精神。

二、教学内容根据课程目标,教学内容主要包括以下几个部分:1.MFC概述:介绍MFC的体系结构、基本概念和常用类。

2.MFC应用程序创建:讲解MFC应用程序的创建步骤,包括项目设置、界面设计、事件处理等。

3.MFC编程技术:深入讲解MFC的基本编程技术,如消息映射、控件操作、文件操作等。

4.实例分析:分析并演示典型的MFC应用程序,让学生了解实际应用中MFC的特点和优势。

三、教学方法为了达到课程目标,我们将采用以下教学方法:1.讲授法:讲解MFC的基本概念、原理和编程技术。

2.案例分析法:分析典型的MFC应用程序,让学生了解MFC在实际应用中的使用方法。

3.实验法:安排上机实验,让学生动手实践,巩固所学知识。

4.讨论法:学生进行课堂讨论,鼓励学生提出问题、分享心得,提高学生的参与度和积极性。

四、教学资源为了支持课程的开展,我们将准备以下教学资源:1.教材:《MFC编程入门》或其他类似教材,为学生提供理论知识的学习。

2.参考书:提供一些关于MFC的进阶学习资料,供学生自主学习。

3.多媒体资料:制作课件、教学视频等,辅助学生理解和掌握课程内容。

4.实验设备:为学生提供计算机实验室,进行上机实验和练习。

五、教学评估为了全面、客观地评估学生的学习成果,我们将采用以下评估方式:1.平时表现:评估学生在课堂上的参与度、提问和回答问题的积极性等,占比20%。

第三讲 MFC框架程序剖析

第三讲 MFC框架程序剖析

制作:刘晓翔
4
暨南大学珠海学院《Windows编程》
2011-12-12
MFC框架程序剖析 框架程序剖析
Fundamentals of Computers
JINAN University
MFC单文档界面程序初探(续) 单文档界面程序初探( 单文档界面程序初探
stdafx.h、stdafx.cpp 、
MainFrm.h、MainFrm.cpp 、
管理和维护主框架类CMainFrame(由CWnd继承而 ( 管理和维护主框架类 继承而 ),主框架是应用程序的主体窗口 其他的窗口( 主框架是应用程序的主体窗口, 来),主框架是应用程序的主体窗口,其他的窗口(如 视类窗口、工具条、状态条)都依附于主框架窗口( 视类窗口、工具条、状态条)都依附于主框架窗口(覆 盖在它上面)。 盖在它上面)。
制作:刘晓翔
5
暨南大学珠海学院《Windows编程》
2011-12-12
MFC框架程序剖析 框架程序剖析
Fundamentals of Computers
JINAN University
MFC单文档界面程序初探(续) 单文档界面程序初探( 单文档界面程序初探
test.h、test.cpp 、 管理和维护主应用程序类CTestApp(由CWinApp继承 ( 管理和维护主应用程序类 继承 而来),每一个MFC程序有且仅有一个主应用程序类对 ),每一个 而来),每一个MFC程序有且仅有一个主应用程序类对 象 theApp,它代表一个程序本体。 ,它代表一个程序本体。
刘晓翔jinanuniversity暨南大学珠海学院windows编程20217131mfc框架程序剖析框架程序剖析窗口类对象与窗口窗口类对象与窗口范例程序范例程序c窗口类对象与窗口并不是一回事它们之间唯窗口类对象与窗口并不是一回事它们之间唯一的关系是一的关系是c窗口类内部定义了一个窗口句柄作为它窗口类内部定义了一个窗口句柄作为它的成员变量的成员变量保存了与这个保存了与这个c窗口类对象相关的那个窗口类对象相关的那个窗口的句柄

MFC程序的运行过程

MFC程序的运行过程

MFC程序的运行过程先简要说明下MFC程序的运行过程:★利用全局应用程序对象theApp启动应用程序;★调用全局应用程序对象的基类CWinApp类的构造函数,然后调用theApp类的构造函数,完成应用程序的一些初始化工作,并将应用程序对象的指针保存起来;★进入WinMain函数,在AfxWinMain函数中可以获取子类的指针,利用此指针调用虚函数InitInstance,根据多态性原来,实际上是调用子类的InitInstance 函数,来完成应用程序的一些初始化工作,包括窗口类的注册,创建,显示和更新。

在此期间还将多次调用CreateEx函数;★进入消息循环,虽然MFC也设置了默认的窗口过程函数,但是MFC应用程序实际上是采用消息映射机制来处理各种消息的,当收到WM_QUIT消息时,突出消息循环,程序结束。

以下为VC++MFC框架程序的执行顺序流程做简要分析:为便于说明,该程序为Text,对应的框架应用程序类为CTestApp一、窗口创建之前1.Windows应用程序在进入WinMain主函数之前,先执行全局变量与全局对象;2.Windows应用程序首先定义了CTestApp类的全局对象theApp,因为CT estApp是从CWinApp继承而来,所以在调用CTestApp类的构造函数之前,先调用了CWinApp类的构造函数,然后调用其派生类对象theApp类的构造函数;3.在应用程序调用完CWinApp类的构造函数,并执行了theApp 类的构造函数,产生了theApp对象之后,则接下来进入WinMain函数extern"C"int WINAPI_tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){//call shared/exported WinMainreturnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);}(WinMain函数实现:E:Program FilesMicrosoft Visual StudioVC98MFCSRC下的APPMODUL.CPP文件中)4.在WinMain函数中,实际上是通过调用AfxWinMain函数来完成其功能的int AFXAPI AfxWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){ASSERT(hPrevInstance==NULL);int nReturnCode=-1;CWinThread*pThread=AfxGetThread();//1CWinApp*pApp=AfxGetApp();//2//AFX internal initializationif(!AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdSho w))//3goto InitFailure;//App global initializations(rare)if(pApp!=NULL&&!pApp->InitApplication())goto InitFailure;//Perform specific initializationsif(!pThread->InitInstance())//4{if(pThread->m_pMainWnd!=NULL){TRACE0("Warning:Destroying non-NULL m_pMainWndn");pThread->m_pMainWnd->DestroyWindow();}nReturnCode=pThread->ExitInstance();goto InitFailure;}nReturnCode=pThread->Run();//5InitFailure:#ifdef_DEBUG//Check for missing AfxLockTempMap callsif(AfxGetModuleThreadState()->m_nT empMapLock!=0){TRACE1("Warning:Temp map lock count non-zero(%ld).n",AfxGetModuleThreadState()->m_nT empMapLock);}AfxLockTempMaps();AfxUnlockTempMaps(-1);#endifAfxWinTerm();return nReturnCode;}(AfxWinMain函数实现:WINMAIN.APP)注:Afx前缀的含糊代表应用程序框架函数。

3_第三章 MFC应用程序框架

3_第三章 MFC应用程序框架

3.3 MFC应用程序框架的基本类(2)
2. 基本类及其作用 CWinApp:负责初始化和运行应用程序 CFrameWnd:负责显示和搜寻用户命令 CDocument:负责装载和维护文档,其中 包括应用程序的工作成果和环境设置数据, 或其它任何内容。 CView:负责为文档提供一个或几个视图, 提供修改、查询文档的人机交互的界面。 3. 基本类与SDI、MDI关系(P100图 3.19和 P101图3.20)
窗口创建 消息处理
窗口销毁
3.2 MFC应用程序与Win32程序(2)

MFC应用程序的启动流程(P88图3.16) –全局主函数AfxWinMain():启动应用程序 –C*App::InitInstance() :创建窗口对象和主窗口,视 图对象和视图窗口,以及文档对象。

C*App:应用程序类,负责程序的初始化和结束处理。 CMainFrame : 主窗口类,负责主窗口的创建、显示和消息派发。 C *Doc :文档类,负责应用程序的数据存储、修改和管理。 C *View :视图类,负责为数据的显示和修改提供人机界面。
3.1 基于MFC的窗口程序(3)


动态创建对象(见第八章)。 文档模板类管理动态创建信息。 CCommandLineInfo类对象保存程序启动时的命令行信息。 ParseCommandLine()分解命令行信息,填写程序启动标志。 ProcessShellCommand()根据命令行信息,启动不同的任务。 创建“三个对象,两个窗口”的流程(P92图3.17和P93图 3.18) 窗口的显示和更新
9X新增的通用控件类
3.1 基于MFC的窗口程序(5)

VC集成开发工具与应用程序生成步骤: – 利用VC的AppWizard生成新项目。 – VC集成编辑器可以编辑源文件,用 ClassWizard编辑C++类,在资源编辑器修改 资源文件。 – 源文件经过编译生成*.OBJ文件,资源文件经 过编译生成*.RES文件。链接器将各个*.OBJ、 *RES和库文件结合起来,生成可执行文件。

MFC第三课的听课总结

MFC第三课的听课总结

1. MFC 是有WinMain()函数的,但不是显现调用的,是连接的时候调用的。

2. C_App 类在执行main ()函数之前就已经定义了全局的对象(应用程序对象),即执行了构造函数。

3. C_App 是CWinAPP 的子类,调用C_App 的构造函数时,首先调用了CWinAPP 的构造函数。

4. CWinAPP 的构造函数是带参数的,但是C_App 在调用构造函数时,并没有显性的赋予参数。

这是因为CWinAPP 的构造函数的参数有一个默认参数。

5. CWinAPP 的构造函数做了一些初始化的工作。

6. 下面开始执行WinMain()函数里的程序,即调用AfxWinMain()函数。

带Afx 的函数,是应用程序框架的函数。

相当于是全局函数,用于协调各个类之间的关系。

7. 在AfxWinMain()中完成了一系列窗口类的注册,消息循环等。

8. CmainFrame 的从CWIND 派生出来的,C_View 也是一个窗口类。

9. 窗口类的流程:注册-》创建-》---》显示---》更新-》----消息循环;(消息的响应)产生全局对象---》WinMain()函数-----》调用函数----》C_Doc 类是对象类(文档类),不是窗口类,用于数据的加工,与数据的显示分开。

类之间的组织是通过C_App 的InitInstance()函数组织起来的。

(把窗口类,视图类,和文档类组织起来);窗口类得封装窗口类得封装和窗口的产生和窗口的产生和窗口的产生::首先定义一个窗口类,类中包含其构造函数,显示函数,更新函数,和成员变量( 窗口句柄的成员变量)。

然后在编写构造函数、显示函数、更新函数的时候,分别调用系统的全局::CreateWindowEx(……); ::ShowWindow(m_hWnd,nCmdShow); ::UpdateWindow(m_hWnd);的时候,将窗口类得窗口句柄传递给这个全局函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Lesson 03 MFC应用程序的生与死一、如何学习MFC1.使用Windows API开发程序以raw Windows API 开发程序,学习的路径是单纯的,条理分明的,你一定先从程序进入点开始,然后产生窗口类,然后产生窗口,然后取得消息,然后分辨消息,然后决定如何处理消息。

虽然动作繁琐,学习却容易。

图1 学习Windows API编程2.使用MFC编程(1)开始容易,学习困难,如图2图2 学习MFC编程以MFC开发程序,一开始很快速,因为开发工具会为你产生一个骨干程序,一般该有的各种界面一应俱全。

但是MFC的学习曲线十分陡峭,程序员从骨干程序出发一直到有能力修改程序代码以符合个人的需要,是一段不易攀登的峭壁。

(2)理解MFC的根本,学习变得容易,如图3如果我们了解Windows 程序的基本运行原理,并了解MFC 如何把这些基础动作整合起来,我们就能够使MFC 学习曲线的陡峭程度缓和下来。

因此能够迅速接受MFC,进而使用MFC。

一条似远实近的道路!图3 理解MFC的根本3.熟悉MFC的类层次结构MSDN MFC最主要的几个类及其继承关系。

二、MFC程序的来龙去脉MFC程序也是Windwos程序,有且只有一个全局对象theApp,当操作系统将程序加载并激活时,这个全局对象获得配置,其构造函数会先执行,比WinMain更早。

MFC实际上把WinMain内部操作封装在CWinApp中,把WndProc内部操作封装在CFrameWnd中:● CWinApp代表程序本体● CFrameWnd代表一个主窗口(1)CWinApp取代WinMain的地位MFC中CWinApp的声明:(文件:AFXWIN.H)Class CWinApp :public CWinThread{// Attributes// Startup args (do not change)HINSTANCE m_hInstance;HINST ANCE m_hPrevInstance;LPTSTR m_lpCmdLine;int m_nCmdShow;……public:// Overridables// hooks for your initialization codevirtual BOOL InitApplication();……// overrides for implementationvirtual BOOL InitInstance();virtual int ExitInstance();// return app exit codevirtual int Run();virtual BOOL OnIdle(LONG lCount); // return TRUE if more idle processing……};其中记录主窗口句柄的变量在CWinApp的父类CWinThread中。

(文件:AFXWIN.H)class CWinThread : public CCmdTarget{public:// AttributesCWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd)CWnd* m_pActiveWnd; // active main window (may not be m_pMainWnd)BOOL m_bAutoDelete; // enables 'delete this' after thread termination// only valid while runningHANDLE m_hThread; // this thread's HANDLE……// Overridables// thread initializationvirtual BOOL InitInstance();// running and idle processingvirtual int Run();virtual BOOL PreT ranslateMessage(MSG* pMsg);virtual BOOL PumpMessage(); // low level message pumpvirtual BOOL OnIdle(LONG lCount); // return TRUE if more idle processing……};(2)CFrameWnd取代WndProc的地位CFrameWnd 主要掌管窗口,MFC内建了一个Message Map机制,会把消息自动送到与消息对应的特定函数中去;消息与处理函数之间的对应关系由程序员指定。

下面的宏把消息与其处理函数关联在一起:BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)ON_WM_PAINT()……END_MESSAGE_MAP与DECLARE_MESSAGE_MAP对应(3)应用程序对象theApp每个MFC应用程序都有且只有一个应用程序对象:theApp,当程序运行时,这个全局对象产生,于是其构造函数执行。

CWinApp类的构造函数内容如下:(文件:APPCORE.CPP)CWinApp::CWinApp(LPCTSTR lpszAppName)if (lpszAppName != NULL)m_pszAppName = _tcsdup(lpszAppName);elsem_pszAppName = NULL;// initialize CWinThread stateAFX_MODULE_STA TE* pModuleState = _AFX_CMDTARGET_GETSTA TE(); AFX_MODULE_THREAD_STA TE* pThreadState = pModuleState->m_thread; ASSERT(AfxGetThread() == NULL);pThreadState->m_pCurrentWinThread = this;ASSERT(AfxGetThread() == this);m_hThread = ::GetCurrentThread();m_nThreadID = ::GetCurrentThreadId();// initialize CWinApp stateASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please pModuleState->m_pCurrentWinApp = this;ASSERT(AfxGetApp() == this);// in non-running state until WinMainm_hInstance = NULL;m_pszHelpFilePath = NULL;m_pszProfileName = NULL;m_pszRegistryKey = NULL;m_pszExeName = NULL;m_pRecentFileList = NULL;m_pDocManager = NULL;m_atomApp = m_atomSystemTopic = NULL;m_lpCmdLine = NULL;m_pCmdInfo = NULL;// initialize wait cursor statem_nWaitCursorCount = 0;m_hcurWaitCursorRestore = NULL;// initialize current printer statem_hDevMode = NULL;m_hDevNames = NULL;m_nNumPreviewPages = 0; // not specified (defaults to 1)// initialize DAO statem_lpfnDaoTerm = NULL; // will be set if AfxDaoInit called// other initializationm_bHelpMode = FALSE;m_nSafetyPoolSize = 512; // default size}CWinApp之中的成员变量因为theApp全局对象的产生而获得配置与初值。

(4)隐含的WinMaintheApp配置完成后,WinMain开始,其代码是MFC早已准备好并由链接器直接加到应用程序的代码中,代码如下,_tWinMain函数的“_t”是为了支持Unicode而准备的一个宏:(文件:APPMODUL.CPP)extern "C" int WINAPI_tWinMain(HINST ANCE hInstance, HINST ANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow){// call shared/exported WinMainreturn AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);}MFC程序的入口点:AfxWinMain:(文件:WINMAIN.CPP)// Standard WinMain implementation// Can be replaced as long as 'AfxWinInit' is called firstint AFXAPI AfxWinMain(HINST ANCE hInstance, HINST ANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow){ASSERT(hPrevInstance == NULL);int nReturnCode = -1;CWinThread* pThread = AfxGetThread();CWinApp* pApp = AfxGetApp();// AFX internal initializationif (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))goto InitFailure;// App global initializations (rare)if (pApp != NULL && !pApp->InitApplication())goto InitFailure;// Perform specific initializationsif (!pThread->InitInstance()){if (pThread->m_pMainWnd != NULL){TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");pThread->m_pMainWnd->DestroyWindow();}nReturnCode = pThread->ExitInstance();goto InitFailure;}nReturnCode = pThread->Run();InitFailure:#ifdef _DEBUG// Check for missing AfxLockTempMap callsif (AfxGetModuleThreadState()->m_nTempMapLock != 0){TRACE1("Warning: Temp map lock count non-zero (%ld).\n",AfxGetModuleThreadState()->m_nTempMapLock);}AfxLockTempMaps();AfxUnlockTempMaps(-1);#endifAfxWinT erm();return nReturnCode;}(5)AfxWinMain的四个主要操作以及引发的行为:①AfxWinInit:内部初始化操作AfxWinInit是继CWinApp构造函数之后的第一个操作,以下为源代码:(文件:APPINIT.CPP)BOOL AFXAPI AfxWinInit(HINST ANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow){ASSERT(hPrevInstance == NULL);// handle critical errors and avoid Windows message boxesSetErrorMode(SetErrorMode(0) |SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);// set resource handlesAFX_MODULE_STA TE* pModuleState = AfxGetModuleState();pModuleState->m_hCurrentInstanceHandle = hInstance;pModuleState->m_hCurrentResourceHandle = hInstance;// fill in the initial state for the applicationCWinApp* pApp = AfxGetApp();if (pApp != NULL){// Windows specific initialization (not done if no CWinApp)pApp->m_hInstance = hInstance;pApp->m_hPrevInstance = hPrevInstance;pApp->m_lpCmdLine = lpCmdLine;pApp->m_nCmdShow = nCmdShow;pApp->SetCurrentHandles();}// initialize thread specific data (for main thread)if (!afxContextIsDLL)AfxInitThread();return TRUE;}②CWinApp::InitApplicationAfxWinInit之后的操作是pApp->InitApplication。

相关文档
最新文档