第三课——MFC编程

article/2025/11/6 16:50:15

一、MFC概述

1. MFC简述

  MFC不仅仅是一套基础类库,更是一种编程方式

2. MFC由来

  1987年微软公司推出了第一代Windows产品,并为应用程序设计者提供了Win16(16位Windows操作系统)API,在此基础上推出了Windows GUI(图形用户界面),然后采用面向对象技术对API进行封装

  1992年推出应用程序框架产品AFX(Application Frameworks),并在AFX的基础上进一步发展为MFC产品。故在用MFC应用程序向导创建的程序中仍然保留stdafx.h头文件包含,它是每个应用程序所必有的预编译头文件,程序所用到的Visual C++头文件包含语句一般均添加到这个文件中。

3. MFC类的基本层次结构

  图示:

       

  CObject类是MFC提供的绝大多数类的基类。该类完成动态空间的分配与回收,支持一般的诊断、出错信息处理和文档序列化等。

  CCmdTarget类主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息发送、等待和派遣(调度)等工作,实现应用程序的对象之间协调运行。

  CWinApp类是应用程序的主线程类,它是从CWinThread类派生而来。CWinThread类用来完成对线程的控制,包括线程的创建、运行、终止和挂起等。

  CDocument类是文档类,包含了应用程序在运行期间所用到的数据。

  CWnd类是一个通用的窗口类,用来提供Windows 中的所有通用特性、对话框和控件。

  CFrameWnd 类是从 CWnd 继承来的,并实现了标准的框架应用程序。

  CDialog 类用来控制对话框窗口。

  CView 是用于让用户通过窗口来访问文档以及负责文档内容的显示。

  CMDIFrameWnd和CMDIChildWnd类分别用来多文档应用程序的主框架窗口和文档子窗口的显示和管理。

  CMiniFrameWnd类是一种简化的框架窗口,它没有最大化和最小化窗口按钮,也没有窗口系统菜单,一般很少用到它。

4. MFC的优势

  读到本文最后,可得出如下结论:使用MFC

  ①可减少Windows应用程序的代码量;

  ②通过消息映射机制使消息处理更为方便;

  ③能很好地体现面向对象编程的优点。

 

二、MFC程序框架

——写在理解MFC机制之前

下面是一个MFC应用程序:

#include <afxwin.h>						// MFC头文件
class CHelloApp : public CWinApp		// 声明应用程序类
{
public:		virtual BOOL InitInstance();
};
CHelloApp theApp; 						// 建立应用程序类的实例
class CMainFrame: public CFrameWnd		// 声明主窗口类
{
public:CMainFrame(){	// 创建主窗口Create(NULL, "我的窗口", WS_OVERLAPPEDWINDOW, CRect(0, 0, 480, 320));}
protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP()
};
// 消息映射入口
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_WM_PAINT()						// 绘制消息宏
END_MESSAGE_MAP()//定义消息映射函数
void CMainFrame::OnPaint() 
{CPaintDC		dc(this);CRect			rc;GetClientRect(&rc);dc.DrawText(_T("Hello MFC!"), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
// 每当应用程序首次执行时都要调用的初始化函数
BOOL CHelloApp::InitInstance()
{m_pMainWnd = new CMainFrame();m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return TRUE;
}

 

三、程序运行机制

0. 上面程序中的关系梳理

  • 应用程序类:CHelloApp(公有继承自CWinApp)
  • 应用程序类的实例:theApp
  • 主窗口类:CMainFrame(公有继承自CFrameWnd)

1. MFC使用afxwin.h来代替头文件windows.h,在此程序中看不到Windows应用程序所必须的入口函数WinMain,这是因为MFC将它隐藏在应用程序框架内部了。

2. 当用户运行应用程序时,Windows会自动调用应用程序框架内部的WinMain函数,并自动查找应用程序类CHelloApp(从CWinApp派生)的全局变量theApp,然后自动调用CHelloApp的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作

  • 重点:运行应用程序→WinMain+theApp→InitInstance(Create/ShowWindow/UpdateWindow)

3. 上面程序中InitInstance的执行过程(创建窗口+显示窗口+更新窗口)如下:

  ① m_pMainWnd = new CMainFrame();

  该语句的作用:创建从CFrameWnd类派生而来的用户框架窗口CMainFrame类对象,继而调用该类的构造函数,使得Create函数被调用,完成窗口创建工作。

  ② m_pMainWnd->ShowWindow(m_nCmdShow);

       m_pMainWnd->UpdateWindow();

  此两条语句的作用:用作窗口的显示和更新

  ③ 返回TRUE,表示窗口创建成功

4. InitInstance完成初始化工作之后,接下来就是调用CWinApp的成员函数Run,执行应用程序的消息循环,即重复执行接收消息并转发消息的工作。

笔记:InitInstance之后是Run,Run是用来处理消息的。

当Run检查到消息队列为空时,将调用基类CWinApp的成员函数OnIdle进行空闲时的后台处理工作。若消息队列为空且又没有后台工作要处理时,则应用程序一直处于等待状态,一直等到有消息为止。

5. 当程序结束后,调用基类CWinApp的成员函数ExitInstance,完成终止应用程序的收尾工作。

6. 尚待考究:既然MFC方式使用消息映射机制,那为何还要使用Run来处理消息?

 

四、消息映射

1. 区别于之前的消息处理机制

  在MFC中,不再使用消息循环代码以及在窗口过程函数中的switch结构来处理Win32的消息,而是使用独特的消息映射机制。

2. 何为消息映射

  所谓消息映射(Message Map)机制,就是将MFC类中的消息与消息处理函数一一对应起来的机制。

  在MFC中,任何一个从CCmdTarget派生的类理论上均可处理消息,且都有相应的消息映射函数。(即每个类都有相应的消息映射函数)

3. 映射一个消息的过程

  ① 在处理消息的类中,使用消息宏DECLARE_MESSAGE_MAP()声明对消息映射的支持,并在该宏之前声明消息处理函数。

  举例:

protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP()

  ② 使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在类声明之后的地方定义该类支持的消息映射入口点,所有消息映射宏都添加在这里,当然不同的消息MFC都会有不同的消息映射宏。

  举例:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)...
END_MESSAGE_MAP()

  其中,BEGIN_MESSAGE_MAP带有两个参数。第一个参数:用来指定需要支持消息映射的用户派生类;第二个参数:指定该类的基类

  ③ 定义消息处理函数(此例中OnPaint为消息处理函数

void CMainFrame::OnPaint() 
{CPaintDC		dc(this);CRect			rc;GetClientRect(&rc);dc.DrawText(_T("Hello MFC!"), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}

  注意:为了使该消息能被其他对象接收并处理,在函数中常常需要调用基类中的相关消息处理函数。

 

补充:

应用程序类:继承自CWinApp类

消息映射机制:将消息与消息处理函数相对应的机制

消息宏:DECLARE_MESSAGE_MAP(),使用它声明对消息映射的支持

消息映射入口点:由BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在类声明之后定义入口点,而所有消息映射宏都添加在此

消息映射宏:不同的消息MFC都有不同的消息映射宏,如ON_WM_PAINT

消息处理函数:如OnPaint,该函数的声明必须在消息宏之前

 

彩蛋:

在Visual C++ 6.0中不需要输入上述程序代码(其实不需要输入任何代码),就能创建所需要的应用程序!!

这就是MFC应用程序向导(MFC AppWizard)的功能。

上面只是拓宽你的视野!!!

具体MFC对应用程序项目的管理方式见下一课。

转载于:https://www.cnblogs.com/xzxl/p/7929086.html


http://chatgpt.dhexx.cn/article/bSsXu6v1.shtml

相关文章

MFC编程入门

一、 什么是MFC&#xff1f; 如果你要建立一个Windows应用程序&#xff0c;应该如何下手&#xff1f; 好的开端是从设计用户界面开始。 首先&#xff0c;你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。Windows用户界面有一些标准的控件&#xff0c;如按…

MFC最详细入门教程[转载]

本人在学习MFC的过程中&#xff0c;发现下面这个比较好的教程&#xff0c;这边转载记录一下 原文地址&#xff1a;MFC 最详细入门教程 From&#xff1a;https://blog.csdn.net/wang18323834864/article/details/78621633/ Visual Studio 2019&#xff1a;https://visualstudio.…

XAMPP详细安装教程

XAMPP安装教程 打开XAMPP安装包 等待安装完成 打开安装好的XAMPP 出现这种问题之后&#xff0c;我直接采用修改Apache端口号的方法 修改完Apache之后点击start运行MySQL&#xff0c;结果一直没开启成功&#xff0c;一直显示框框中的语句。百度几篇文章的结果就是找到regedit.e…

xampp使用教程方法免费分享

XAMPP是一个把Apache网页服务器与PHP、Perl及MySQL集合在一起的安装包&#xff0c;允许用户可以在自己的电脑上轻易的建立网页服务器。使用XAMPP您可以轻松的在本机调试您的PHP程序、CMS以及wordpress博客程序。本文主要分享一下XAMPP的使用教程。 XAMPP使用方法 1.下载XAMPP …

怎样在xampp中使用mysql以及配置xampp

怎样在xampp中使用mysql 以及配置xampp &#xff08;这里是在xampp中安装mysql的&#xff09; 第一步&#xff1a;安装xampp 找到xampp的安装包&#xff0c;双击下载&#xff1a; 我是安装在C盘的 安装好后&#xff0c;就会有下面页面 点 第二步&#xff1a;配置xampp&…

XAMPP汉化教程指南

xampp是一款新手学习PHP必备的软件&#xff0c;但是这款软件对于国人来说不太友好&#xff0c;因为他的控制面板界面只有英文和德文。 怎么汉化xampp xampp虽然好用&#xff0c;功能也比较简单&#xff0c;按钮功能好记&#xff0c;但是整个控制面板都是英文或者德文&#xf…

PHP 开发-XAMPP 安装

开发环境&#xff1a;Windows10&#xff0c;XAMPP&#xff08;x64-7.4.33&#xff09;&#xff0c;Netbeans。 XAMPP 安装 官网下载XAMPP安装包&#xff0c;我下载的版本 x64-7.4.33。安装包中相关软件版本&#xff08;官网上可查询&#xff09;&#xff1a; Apache 2.4.54M…

XAMPP安装和使用教程

最近由于某些情况&#xff0c;转入对PHP进行探讨&#xff0c;比较晚啦&#xff0c;呵呵&#xff01; 由于php在windows下配置虽不是很烦&#xff0c;但也难免出现误差&#xff0c;觉得集成工具也不错。下面把XAMPP的安装和使用教程转帖过来&#xff0c;以备我以后查阅。 XAMPP…

在xampp 中使用mysql的方法

法一、打开xampp 控制面板&#xff0c;启动mysql&#xff0c;然后打开shell,输入 mysql 即可 这里说一下最近碰到的问题&#xff1a;当我输入 mysql 的时候出错&#xff1a; Error Code: 1044. Access denied for user localhost to database mydb 原因&#xff1a;存在一个用…

xampp安装

XAMPP&#xff08;ApacheMySQLPHPPERL&#xff09;是一个功能强大的建站集成软件包&#xff0c; 是一个易于安装且包含 MySQL、PHP 和 Perl 的 Apache 发行版。小编在安装MySQL的路上不断碰壁&#xff0c;虽然是越挫越勇&#xff0c;但是&#xff0c;一旦挫太多次了也就没有那份…

XAMPP 使用教程

XAMPP 使用教程 文章目录 XAMPP 使用教程1.启动XAMPP。2.在Apache上点击start。3.访问http://localhonst&#xff0c;出现页面。 1.启动XAMPP。 2.在Apache上点击start。 3.访问http://localhonst&#xff0c;出现页面。 这说明你已经成功开启了本地服务器。&#xff08;在使用…

mac安装xampp及使用攻略

前言&#xff1a;最近接了一个商城的项目&#xff0c;后端要用到thinkphp6&#xff0c;听老板说很简单的框架&#xff0c;果断上手&#xff0c;不过在配置环境上&#xff0c;mac和windows差距很大&#xff0c;有很多坑&#xff0c;不过我已经一路踩过来了&#xff0c;建议喜欢的…

最详细的XAMPP的安装及使用教程(图文)

XAMPP的安装及使用教程 1、简介 XAMPP&#xff08;ApacheMySQLPHPPERL&#xff09;是一个功能强大的建站集成软件包。这个软件包原来的名字是 LAMPP&#xff0c;但是为了避免误解&#xff0c;最新的几个版本就改名为 XAMPP 了。它可以在Windows、Linux、Solaris、Mac OS X 等多…

XAMPP和MYSQL使用

1.下载 XAMPP 首先下载 XAMPP &#xff0c;您可以在本页面下方提供的链接直接点入官方网站下载。 2.安装 XAMPP 园子使用的是 XAMPP 的 Windows 版的安装包&#xff0c;下载后直接安装即可&#xff0c;安装过程所有选项保持默认即可。建议不要直接装在 C 盘。安装过程结束后&…

Xampp介绍、安装过程及使用方法

XAMPP&#xff08;ApacheMySQLPHPPERL&#xff09;是一个功能强大的建站集成软件包。 阅读一些资料&#xff0c;先整理如下&#xff1a; 软件介绍&#xff1a;http://baike.baidu.com/link?urlAGB3fqEAfvAKDp9ZpI-buHSS5A9bldAWbQbFP9C8_suyZgd5lSt68WgnUT4F6tn4nf5YhL144MMIp…

XAMPP安装教程

XAMPP 安装教程 文章目录 XAMPP 安装教程一、前往官网,下载二、安装OK. XAMPP是最流行的PHP开发环境 XAMPP是完全免费且易于安装的Apache发行版&#xff0c;其中包含MariaDB、PHP和Perl。XAMPP开放源码包的设置让安装和使用出奇容易。它可以构造一个本地服务器。 一、前往官网,…

XAMPP保姆级的安装及使用教程(图文)

一、简介 XAMPP&#xff08;ApacheMySQLPHPPERL&#xff09;是一个功能强大的建站集成软件包。这个软件包原来的名字是 LAMPP&#xff0c;但是为了避免误解&#xff0c;最新的几个版本就改名为 XAMPP 了。它可以在Windows、Linux、Solaris、Mac OS X 等多种操作系统下安装使用…

XAMPP安装配置教程(Windows)

1.下载官方安装包 https://www.apachefriends.org/zh_cn/index.html 2.安装XAMPP 安装前关闭所有杀毒软件&#xff1b; 安装xampp自带mysql无需再安装&#xff1b; 安装到合适的安装路径&#xff1b; 3.启动XAMPP 如果顺利start Apache和MySQL都没问题恭喜你基本完成。 adm…

最新xampp安装教程与配置

XAMPP安装并配置 XAMPP这个集成软件包之前并没有了解过&#xff0c;为了完成软件质量保证与测试的实验在此踩坑。需要实验报告的朋友们能免费下载。缺陷管理工具Mantis安装及使用 鉴于我们还不知道XAMPP是干什么的我们简单了解一下&#xff1a; 了解XAMPP: XAMPP&#xff08…

xampp的安装教程

1、准备xampp安装包并新建一个空文件夹如&#xff1a;xampp 2、启动xampp&#xff0c;开始安装&#xff0c;安装过程如下图所示&#xff1a; 点击yes&#xff0c;后如下图 点击next&#xff0c;进行下一步&#xff0c; 将软件安装到刚刚新建的空文件夹xampp中&#xff0c; …