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项目 它支持 40 多种语言 我的电脑上有两个显示器 它们都是不同尺寸的显示器和不同的分辨率 如果我将应用程序移至较小的显示器上 则不会显示完整的语言菜单 我知道它会显示滚动条 为什么不是呢 我的菜单是标准菜单 没有什么花哨
  • 具有透明背景的CWnd

    我想创建一个基于 CWnd 的类 它将引入具有透明背景的控件 只要内容是静态的 创建一个控件并用透明背景绘制其内容对我来说没什么大不了的 问题是当我想创建一个内容不断变化的控件时 这是因为我不知道如何用父背景删除控件的内容 一般情况下可能不
  • MFC 控件上的文本 - Unicode 字符(例如日语)被截断

    背景 我正在开发一个 C MFC 应用程序 我们已经将其转换为显示 unicode 字符以支持外语 在大多数情况下 这是成功的并且 unicode 字符显示正确 但我遇到了一个问题 某些控件上的某些文本被截断 Example 在这里 您可以
  • MFC:如何捕获Web浏览器控件中的链接单击事件?

    我有一个带有 Web 控件的 MFC 应用程序 单击可单击链接时 它将使用 IE 打开 而不是默认浏览器 问题 有没有办法强制使用默认浏览器打开它 如果没有 我如何捕获链接单击事件 以便稍后可以操纵单击事件 谢谢 不 据我所知还没有 查看有
  • 基于 C# .NET 文档的应用程序操作图

    我想开发一个新的应用程序 用户可以在其中创建描述流程的图表 我认为在这种情况下 基于文档的应用程序是我唯一的选择 我熟悉C net C MFC 和J2EE 根据您的经验 实现这一目标的最佳方法是什么 我应该关注哪个平台 图表必须由方框和箭头
  • 如何调整 CWnd 内 WPF 控件的大小?

    我正在托管 WPFUserControlMFC 内部CWnd 它工作得很好 我现在需要弄清楚如何与其父控件一起调整控件的大小 我已经迷上了OnSize我正在打电话GetWindowRect并将结果设置为我的控件 如下所示 void CChi
  • 获取正在运行的程序的属性

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

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • 如何在 MFC 中创建带圆角的进度控件?

    我需要在 MFC 应用程序中创建一个带圆角的进度条 我尝试过使用 CreateRoundRectRgn 和 SetWindowRgn 的组合 它具有使控件完全消失的效果 我还尝试使用透明的 GIF 覆盖层 该覆盖层将绘制在进度栏的顶部 但我
  • 如何在 MFC 中调整对话框大小时移动控件?

    我已经在 MFC 中创建了对话框视图 从下图中可以清楚地看到 如滑块控件和编辑框等 当我调整对话框大小时 这些控件不会移动 在此输入图像描述 https i stack imgur com 7OxAK jpg 我想移动控件以适应对话框 但不
  • MFC编辑控件更新

    我尝试使用它添加的变量来更新编辑控件的文本 这是一个CString但我失败了 m sNrAuto some text UpdateData TRUE 我也尝试过使用UpdateWindow 但编辑控件仍为空白 我知道我可以使用SetWind
  • 用于基于 MFC 的 GUI 应用程序的免费自动化测试工具

    我是 Windows 开发和测试平台的新手 我正在开发一个基于 MFC 的 GUI 应用程序 并正在寻找有助于 UI 自动化测试的工具 我搜索时出现了一大堆工具 但大多数似乎都不支持MFC 我考虑的选项是 A 编码 UI UI 自动化 看起
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 使用 MFC 对象初始化 std::map 无法编译

    MFC初学者看这里 我尝试过初始化std map像这样 在CView的标题中 myprogramView h std map
  • 如何中止使用 wininet 发送的请求?

    我有一个 MFC 应用程序 用于向相应的服务器发送 post 请求 这是一个http请求 用于上传文件 但有要求中止发送的请求 就像用户正在发送一个大文件一样 用户应该能够在请求完成之前取消请求 我正在使用 wininet api Http
  • 调试器忽略动态加载的 DLL 中的错误

    我有一个与自编码 DLL 的调试相关的非常奇怪的问题 我有一个 MFC 驱动的基于对话框的应用程序 几个静态链接的项目和几个在运行时加载的 DLL 项目 我在调试中构建解决方案 运行应用程序 然后我可以轻松调试这些 DLL 项目 现在问题来
  • 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 以及 OPOS 可以工作吗?

    我试图了解将在 x86 Windows 10 上运行的 C MFC 应用程序移植到具有 Qualcomm Snapdragon 处理器的 ARM Windows 10 设备的障碍 32位应用程序具有以下特点 MFC 与 C 用于用户界面 C
  • 使用什么 API 在现有 MFC 应用程序中添加 HTTP 客户端支持?

    我最近接到一项任务 要添加与以下内容交互的能力网络地图服务 http en wikipedia org wiki Web Map Service到现有的 MFC 应用程序 我需要客户端 HTTP API 根据我的研究 领先的候选人似乎是CA
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 是否可以将 CMFCToolBar 添加到对话框中?

    我刚刚尝试了将 CToolbar 添加到新 CMFCToolBar 上的对话框的标准方法 但这不起作用 在我深入研究新的实现之前 我想知道它是否真的可行 我不确定你所说的 标准方式 是什么意思 但你当然可以以编程方式做到这一点 In MyD

随机推荐

  • 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 以类