MFC框架简介2

2023-05-16

MFC框架简介

一、MFC框架

MFC库是开发Windows应用程序的C++接口。MFC提供了面向对象的框架,采用面向对象技术,将大部分的Windows API 封装到C++类中,以类成员函数的形式提供给程序开发人员调用。

CWnd类是MFC中一个非常重要的类,它封装了与窗口相关的操作。

在前面中,曾经有构建一个Windwos程序的几个部分:

http://blog.163.com/zhoumhan_0351/blog/static/3995422720103401415721
    MFC中的WinMain函数实际上是调用AfxWinMain函数来实现的。在VC给我们MFC向导生成的代码中,我们发现,在AfxWinMain函数中,调用了三个函数:

1、pApp->InitApplication()//完成内存管理方面的工作

2、pApp->InitInstance()//此函数是虚函数,调用派生类的InitInstance函数,完成窗口类的创建,注册,更新等操作。窗口类的注册是由AfxEndDeferRegisterClass完成。如果该窗口类已经注册,则直接返回一个真值;如果尚未注册,就调用RegisterClass函数注册该窗口类。

其中,函数PreCreateWindow是为程序员修改窗口类参数准备的。其参数是CREATESTRUCT的引用,如果其值发生了变化,在调用CreateWindowEx函数时,其参数会发生相应的改变。

在MFC中,窗口的创建功能由Cwnd类的CreateEx函数实现(从父类继承来的,调用CWnd::CreateEx())。

3、pApp->Run()//完成消息循环。

默认的窗口过程函数采用消息映射机制来处理各种消息的。

二、MFC程序的运行过程如下:

1)利用全局应用程序对象theApp启动应用程序。

2)调用全局应用程序对象的构造函数,从而调用基类(CWinApp)的构造函数,完成应用程序的一些初始化工作,并将应用程序对象的指针保存起来。

3)进入WinMain函数。在AfxWinMain函数中获取子类的指针,利用指针实现上述的三个函数,从而完成窗口的创建注册等工作。

4)进入消息循环,一直到WM_QUIT。

说明:

1、this指针

孙老师在讲到CWinApp::CWinApp函数的代码时,讲到:

pThreadState->m_pCurrentWinThread = this;这一句时,问到this是指向CWinApp的对象呢,还是它的派生类的对象呢?然后说了,是指向其派生类的对象,接着说了为什么。不过,我觉得孙老师这一点上,只说了“知其然,而没有说清楚所以然”。我们先看看MSDN中this的定义:

    The this pointer is a pointer accessible only within the member functions of a class, struct, or union type. It points to the object for

 which the member function is called. Static member functions do not have a this pointer.

When a nonstatic member function is called for an object, the address of the object is passed as a hidden argument to the function. For example, the following function call.

由上定义可见,this指针所指的应当是对象,而与类没有必然的关联关系。也就是说,在调用对象的成员函数时,将指向当前对象的指针一起传递给了成员函数,如

myDate.setMonth( 3 );//can be interpreted this way:setMonth( &myDate, 3 );

    而不管是在基类中(通过指针)调用子类的成员函数,还是在派生类中调用其成员函数。这样,如果是定义了派生类的对象,而通过基类的构造函数进行初始化与基类相关的部分时,实质上是派生类对象调用基类的构造函数在初始化,很明显的,会将派生类对象的指针传给基类。

而在举例当时,很明显的,定义的是派生类对象:

CTestApp theApp;

所以,在调用基类的构造函数初始化基类时,传给基类的指针是指向派生类的;而如果定义的是基类的对象,那么this指针就应当是指向基类对象了。

2、无论是全局变量,还是全局对象,程序在运行时,在加载main函数之前,就已经为全局变量或全局对象分配了内存空间。

3、对MFC程序来说,通过产生一个应用程序类的对象来惟一标识应用程序的实例。每一个MFC程序有且仅有一个从应用程序类(CWinApp)派生的类。每一个MFC程序实例有且仅有一个该派生类的实例化对象,也就是theApp全局对象。该对象就表示了应用程序本身。

4、Afx前缀的函数代表应用程序框架(Application Framework)函数。应用程序框架(Application Framework)辅助我们生成应用程序的框架模型,该模型把多个类进行了有机的集成。在MFC中,以Afx为前缀的函数都是全局函数。后缀Ex的函数都是扩展函数。

5、MicroSoft在设计类库时,采用文档/视结构。数据的存储和加载由文档类来完成,数据的显示和修改由视类来完成。

6、::开始表示全局方法。

7、C++窗口类对象与窗口并不是一回事,它们之间惟一的关系就是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个C++窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束,但C++窗口类对象销毁时,与之相关的窗口也将销毁。窗口创建时都会产生WM_CREATE消息。

8、文件存放

1)MFC中的WinMain函数在APPMODUL.cpp中,在编译的时候才会连接进来。

2)CWinApp在文件appcore.cpp中。

3)WinMain函数实际上是调用AfxWinMain函数来实现的。AfxWinMain位于WINMAIN.cpp中。

4)在MFC程序中,窗口的创建功能由Cwnd类的CreateEx函数实现(被位于WINFRM.CPP当中的Create调用,注意CreateEx不是虚函数),该函数的声明位于AFXWin.h文件中。实现代码位于WINCORE.CPP文件中。注册函数AfxEndDeferRegisterClass也在这个文件里。

5)CWinThread类的Run函数定义位于THRDCORE.CPP中。

6)CFrameWnd的PreCreateWindow函数位于WINFRM.CPP中。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC框架简介2 的相关文章

  • MFC和ATL之间的根本区别是什么?

    假设我是only将它们用于 普通 GUI 程序 没有 COM 没有 ActiveX 没什么花哨的 我将看到 ATL 和 MFC 之间的根本区别是什么 以帮助我弄清楚使用哪一个 我在网上做了一些搜索 但最终没有一个答案真正回答了我的问题 ht
  • MFC/WinAPI 的大问题

    我需要创建一个带有两个选项卡的表单视图的 SDI 表单 其中封装了多个对话框作为选项卡内容 但表格必须有彩色背景 诸如此类的事情让我讨厌编程 首先 我通过资源编辑器尝试了 CTabControl 尝试了不同的事情 但未记录的行为和没有答案的
  • 如何在禁用组框时禁用组框文本?

    我面临组框文本的问题 我通过调用 EnableWindow FALSE 禁用了组框 问题是组框标题没有变灰 谁能告诉我为什么会发生这种情况以及如何摆脱这个问题 这似乎是 comctrl32 dll 中的一个错误视觉风格 https lear
  • 如果我没有为其相应的命令声明消息映射条目,如何阻止 MFC 禁用我的控件?

    我有以下问题 如果我没有相应消息的消息映射条目 假设 ID MYBUTTON1 MFC 将禁用我的工具栏 CToolbar 控件 有没有解决的办法 我对菜单也有同样的问题 但我发现您可以通过将 CFrameWnd m bAutoMenuEn
  • 有效的 MFC ID 范围

    这让我很困惑 我正在读这个技术说明 https learn microsoft com en gb cpp mfc tn020 id naming and numbering conventions它指出 Prefix Resource t
  • 如何显示非模式对话框并立即在其中显示信息?

    我想在屏幕上显示一个无模式对话框并在其中显示一些信息 但是 如果我按照以下方式使用它 则会出现一些问题 function showdialog XXX heavy work update the dialog heavy work upda
  • 升级后的 MFC 应用程序看起来仍然很旧

    我有一个用 VC6 编写的 MFC 应用程序 我已将其升级到 VS2015 并且它可以构建并运行 该应用程序是一个主可执行文件 其中包含许多包含对话框的 DLL 然而应用仍然looks就像用 VC6 构建的一样 所有 GUI 组件都没有 W
  • 跨平台 Windows / OS X 开发,具有大量现有代码库

    对于使用 MFC 和 WinAPI 用 C 编写的复杂应用程序 有大量现有代码库 需要将其移植到 Mac OS X 理想的解决方案是在不同平台之间拥有尽可能多的通用代码 尤其是诸如业务之类的代码逻辑 GUI 可能会有所不同 具体取决于跨平台
  • 默认情况下启用或禁用菜单项。为什么?

    我有一些遗留代码 由于某种原因 菜单项在启动时被启用或禁用 我的问题是 如何 有没有办法在不调用 EnableMenuItem 函数的情况下执行此操作 MFC 有没有办法做与资源设置所说相反的事情 我也不明白为什么当最后一个子窗口关闭时 当
  • 如何找到激活时打开给定 HMENU 的菜单项(如果有)?

    我想用原型实现一个功能 Locates the menu item of the application which caused the given menu mnu to show up return true if the given
  • 如何在VC++/MFC中替换字符串中两个子字符串之间的字符串?

    假设我有一个 CString 对象 strMain AAAABBCCCCCCDDBBCCCCCCCCDDDAA 我还有两个较小的字符串 例如 strSmall1 BB strSmall2 DD 现在 我想替换 strMain 中 strSm
  • 如何将基数词转换为序数词

    有没有一种简单的方法可以将数字 1 2 3 转换为 1st 2nd 3rd 并且以这种方式我可以为该函数提供一种语言并具有它会返回我目标语言的正确形式吗 标准 C stl 或 boost 都可以 MFC 或 ATL win32 api 或我
  • 获取正在运行的程序的属性

    我想开发一个程序 其 ID 是一张牌 因为它在另一个正在运行的程序 例如扑克或红心游戏或其他程序 中播放 我首先尝试获取有关已运行的游戏程序的所需信息 但我从一开始就遇到了问题 我正在运行 MSVC 2013 并开发 MFC 应用程序 现在
  • MinGW支持MFC吗?

    我已经使用 MinGW 开发了 WinAPI 应用程序 没有出现任何问题 现在 我可以用 MFC 做同样的事情吗 我只是在这里猜测 但我认为您需要购买 Visual Studio 的副本才能获得使用 MFC 的许可证 MFC 也不因其对 C
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • 如何通过MFC将应用程序设置保存到注册表中?

    我有一个由 MFC 项目向导创建的 MFC 应用程序 我想在注册表中保存 读取应用程序设置 所以问了这个question https stackoverflow com questions 1880275 good c registry w
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 具有键唯一性和按位置排序的 MFC 字典集合

    看着表上http msdn microsoft com en us library y1z022s1 28v vs 80 29 aspx core collection shape features http msdn microsoft
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 如何在MFC中对CListCtrl中的Item进行排序?

    我在 MFC 中制作了一个基于对话框的应用程序 我将 CListCtrl 控件放在对话框上 并将其视图样式设置为报告类型 我在此列表视图中有五列 所有列都是字符串类型 我想在此列表中实现排序 也就是说 当我单击某一列时 它应该对列表中的项目

随机推荐

  • C语言中队列、堆栈、内存映射、多线程概念

    队列 xff1a 先近先出 xff1b 栈 xff1a 先近后出 xff1b 栈的大小是由编译器决定的 xff0c 默认大小是1M xff0c 可以更改 xff0c 但是一般不建议修改 xff0c 每个exe都有一个栈 xff0c 无法利用
  • C++多线程编程分析-线程间通信

    上文我们介绍了如何建立一个简单的多线程程序 xff0c 多线程之间不可避免的需要进行通信 相比于进程间通信来说 xff0c 线程间通信无疑是相对比较简单的 首先我们来看看最简单的方法 xff0c 那就是使用全局变量 xff08 静态变量也可
  • 多线程访问全局变量和局部变量剖析

    如果一个变量是成员变量 xff0c 那么多个线程对同一个对象的成员变量进行操作时 xff0c 它们对该成员变量是彼此影响的 xff0c 也就是说一个线程对成员变量的改变会影响到另一个线程 如果一个变量是局部变量 xff0c 那么每个线程都会
  • c语言中全局变量多线程调用-局部变量、静态局部变量、全局变量与静态全局变量分析

    基本概念 xff1a 作用域 xff1a 起作用的区域 xff0c 也就是可以工作的范围 代码块 xff1a 所谓代码块 xff0c 就是用 括起来的一段代码 数据段 xff1a 数据段存的是数 xff0c 像全局变量就是存在数据段的 代码
  • vnc viewer 绿色版,6款超好用的vnc viewer 绿色版

    市面上形形色色的vnc viewer 绿色版软件很多 在众多的vnc viewer 绿色版软件中 你会选择哪一款呢 你所了解的vnc viewer 绿色版又有哪些呢 接下来让我们一起看看有哪些好用的vnc viewer 绿色版软件吧 第一款
  • django 框架模型之models常用的Field,这些Field的参数、及常见错误原因及处理方案。

    1 django 模型models 常用字段 1 models AutoField 自增列 61 int 11 如果没有的话 xff0c 默认会生成一个名称为 id 的列 如果要显式的自定义一个自增列 xff0c 必须设置primary k
  • 干货丨ChatGPT大爆发以来,最值得收藏的30个AI工具,让你生产力爆表、效率无敌!

    随着ChatGPT的火爆出圈 xff0c 炸出来一堆 AI神器 xff0c 它们不仅大大拓宽了我们原本的能力范围 xff0c 更是让工作效率瞬间翻倍 接下来 xff0c 给大家推荐30个精选的 AI工具 xff0c 拿走 xff0c 直接用
  • 多线程下局部变量与全局变量的使用及区别

    局部变量是在栈中运行 每个运行的线程都有自己的堆栈 别的线程无法访问得到 xff0c 因此我们说 xff0c 局部变量是 安全 的 全局变量是在堆中运行 堆是对所有的线程都可见的 因此在两个以上的线程访问全局变量时 xff0c 就会出现所谓
  • MFC中Windows窗口消息循环及多线程之间关系

    Windows中一个进程可以包含多个线程 xff0c 由多个线程组成 在Windows应用程序中 xff0c 窗体是由 UI线程 xff08 User Interface Thread xff09 的特殊类型的线程创建的 一个UI线程包含一
  • c#中Show和Showdialog的区别分析

    简单地说他们的区别就是show弹出来的窗体和父窗体 xff08 上一个窗体的简称 xff09 是属于同一等级的 xff0c 这两个窗体可以同时存在而且可以随意切换 xff0c 但是showdialog弹出来的窗体就不能这样 xff0c 他永
  • 模态对话框和非模态对话框的消息循环分析

    1 非模态对话框和父窗口共享当前线程的消息循环 2 模态对话框新建一个新的消息循环 xff0c 并由当前消息循环派发消息 xff0c 而父窗口 模态对话框屏蔽了用户对它父窗口的操作 xff0c 但是不是在消息循环里面屏蔽 xff0c 所以给
  • MFC中实现模态对话框的结构与原理

    1 模态对话框 在涉及GUI程序开发的过程中 xff0c 常常有模态对话框以及非模态对话框的概念 模态对话框 xff1a 在子界面活动期间 xff0c 父窗口是无法进行消息响应 独占用户输入 非模态对话框 xff1a 各窗口之间不影响 模态
  • 深入理解MFC消息循环和消息泵的原理

    首先 xff0c 应该清楚MFC的消息循环 GetMessage PeekMessage xff0c 消息泵 CWinThread PumpMessage 和MFC的消息在窗口之间的路由是两件不同的事情 在MFC的应用程序中 应用程序类基于
  • 窗口结束后资源释放不掉问题解决办法

    net类库已经帮助我们实现了窗口的关闭 xff0c 如果此窗口是系统的主窗口 xff0c 关闭此窗口即应该退出了整个应用程序 但事实上有时候并不是这样的 xff0c 关闭窗口 xff0c 只是停止了当前窗口的消息循环 系统主窗口 xff0c
  • 模态对话框的消息循环原理及分析笔记

    简述 xff1a APP消息循环和模态对话框中局部消息循环的关系 根据上图可以看出 xff0c 在APP的消息循环再派发ONOK消息后 xff0c 调用ModalDlg的响应函数 xff0c pWnd gt OnOk 在该消息中 xff0c
  • 数据库常用命令笔记

    一 xff1a 增 1 INSERT INTO table name 列1 列2 VALUES 值1 值2 2 insert into user tbl select from user tbl where user name 61 39
  • MFC中动态创建控件以及添加事件响应

    本文实例讲述了MFC中动态创建控件以及事件响应实现方法 xff0c 分享给大家供大家参考 具体实现方法如下 xff1a 动态控件是指在需要时由Create 创建的控件 xff0c 这与预先在对话框中放置的控件是不同的 一 创建动态控件 xf
  • vnc好用吗,vnc是什么,vnc好用吗

    VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件 xff0c 远程控制能力强大 xff0c 高效实用 xff0c 其性能可以和Windows 和 MAC 中的任何远程控制软件媲美 VNC Virtual Network
  • MFC框架1

    第一点 xff1a 类别型录网的搭建 xff1a 类别型录网搭建的目的是为了实现所谓的 34 执行期类型识别 34 xff0c 也就是在程序运行的时候识别出某个对象是否是某个类的实例 基类也可以 这里还不是很明白为什么需要实现 34 执行期
  • MFC框架简介2

    MFC框架简介 一 MFC框架 MFC库是开发Windows应用程序的C 43 43 接口 MFC提供了面向对象的框架 xff0c 采用面向对象技术 xff0c 将大部分的Windows API 封装到C 43 43 类中 xff0c 以类