MFC简要介绍

article/2025/10/22 4:31:52

一、概念

MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,vc++是 微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC++其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。

二、在MFC下创建一个窗口对象
MFC下创建一个窗口对象分两步,首先创建MFC窗口对象,然后创建对应的Windows窗口。在内存使用上,MFC窗口对象可以在栈或者堆(使用new创建)中创建。具体表述如下:
创建MFC窗口对象。通过定义一个CWnd或其派生类的实例变量或者动态创建一个MFC窗口的实例,前者在栈空间创建一个MFC窗口对象,后者在堆空间创建一个MFC窗口对象。
调用相应的窗口创建函数,创建Windows窗口对象。
例如:在前面提到的AppWizard产生的源码中,有CMainFrame(派生于CMDIFrame(SDI)或者CMDIFrameWnd(MDI))类。它有两个成员变量定义如下:
CToolBar m_wndToolBar;
CStatusBar m_wndStatusBar;
当创建CMainFrame类对象时,上面两个MFC Object也被构造。
CMainFrame还有一个成员函数
OnCreate(LPCREATESTRUCT lpCreateStruct),
它的实现包含如下一段代码,调用CToolBar和CStatusBar的成员函数Create来创建上述两个MFC对象对应的工具栏HWND窗口和状态栏HWND窗口:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (!m_wndToolBar.Create(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
}
关于工具栏、状态栏将在后续有关章节作详细讨论。
在MFC中,还提供了一种动态创建技术。动态创建的过程实际上也如上所述分两步,只不过MFC使用这个技术是由框架自动地完成整个过程的。通常框架窗口、文档框架窗口、视使用了动态创建。介于MFC的结构,CFrameWnd和CView及其派生类的实例即使不使用动态创建,也要用new在堆中分配。理由见窗口的销毁(2.2.5节)。
至于动态创建技术,将在下一章具体讨论。
在Windows窗口的创建过程中,将发送一些消息,如:
在创建了窗口的非客户区(Nonclient area)之后,发送消息WM_NCCREATE;
在创建了窗口的客户区(client area)之后,发送消息WM_CREATE;
窗口的窗口过程在窗口显示之前收到这两个消息。
如果是子窗口,在发送了上述两个消息之后,还给父窗口发送WM_PARENATNOTIFY消息。其他类或风格的窗口可能发送更多的消息,具体参见SDK开发文档。

三、MFC编程的缺点

1.大量使用稀奇古怪的宏,会使代码可读性很差。要掌握MFC需要编程人员耐心的去分析它们。

2.消息映射的现实机制十分笨拙,没有采用继承机制,也没有采用委托技术,而是采用表驱动。

3.对于底层SDK的封装太薄,面向对象的感觉不足。

4.自己编写了RTTI,SHE,CObjXXX(Container)等,实现起来不太理想。

5.很多场合本来是标准库可以一展身手的地方,MFC完全没用上。

6.为了迎合MFC,编译器的很多地方都违反标准。

7.Doc/View体系的局限性,想图破很难。

四、一个MFC编程的例子

1. 由于mfc只是对win32API进行了大量的封装,因此可以通过修改win32项目来创建mfc工程


2. 工程名起名为FirstMFC,然后下一步选择windows应用程序,然后点击完成

3. 创建完成后发现主cpp文件已经为我们自动生成了win32创建窗口的代码,因为要用mfc实现,所以只需保留头文件,删掉其余的代码

FirstMFC.cpp内只剩下如下代码

// FirstMFC.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "FirstMFC.h"

4.由于我们要使用MFC库,因此需要在stdafx头文件里包含afxwin.h  而afxwin.h内已经包含windows.h,因此可以直接将stdafx.h内的#include <windows.h>替换成<afxwin.h>。

5. 右键点击工程名,选择属性,在弹出对话框中MFC使用这一项选择在静态库中使用MFC,然后选择应用确定。

6. 因为mfc程序需要至少包含一个应用程序类和窗口框架类,因此我们需要在FirstMFC.cpp定义一个CFrameWnd和CWinApp的子类,并为CWinApp的子类创建一个全局的实 

    例化对象,并在CwinApp的子类中重载InitInstance函数创建窗口,代码如下:

[cpp]  view plain copy
  1. class CMyFrameWnd : public CFrameWnd  
  2. {  
  3.   
  4. };  
  5.   
  6. class CMyWinApp : public CWinApp  
  7. {  
  8.     virtual BOOL InitInstance();  
  9. };  
  10.   
  11. CMyWinApp myApp;  
[cpp]  view plain copy
  1. InitInstance函数中创建窗口代码如下<pre name="code" class="cpp">BOOL CMyWinApp::InitInstance()  
  2. {  
  3.     CMyFrameWnd * pFrame = new CMyFrameWnd();  
  4.     pFrame->Create(NULL,"FirstMFC");  
  5.     m_pMainWnd = pFrame;  
  6.     pFrame->ShowWindow(SW_SHOW);  
  7.     pFrame->UpdateWindow();  
  8.     return TRUE;  
  9. }  
从代码可以看出,InitInstance主要完成的工作就是窗口的创建过程,查阅csdn可以发现

CFrameWnd::Create

BOOL Create( LPCTSTR lpszClassName,

LPCTSTR lpszWindowName

DWORD dwStyle = WS_OVERLAPPEDWINDOW, 

const RECT& rect = rectDefault, 

CWnd* pParentWnd = NULL, 

LPCTSTR lpszMenuName = NULL, 

DWORD dwExStyle = 0,

CCreateContext* pContext = NULL );

create函数的第一个参数为类名,可以置空,在创建的过程中mfc会自己重新为它赋值,第二个参数为要创建的窗口的名称,后面的参数固定参数,无须赋值






http://chatgpt.dhexx.cn/article/7WR9rLYj.shtml

相关文章

MFC入门小项目

之前学习MFC的时候就是三天打鱼两天晒网&#xff0c;什么都不记&#xff0c;脑子也不转&#xff0c;完全是代码的搬运工。这次又要从头开始&#xff0c;索性写个博客了。截至目前断断续续更了三十篇blog&#xff0c;文笔依然如此拙劣&#xff0c;实属羞愧。技术尚且肤浅&#x…

C++ MFC简介

介绍MFC之前&#xff0c;需要先介绍几个MFC的概念。 1) API Windows操作系统提供了各种各样的函数&#xff0c;以方便我们开发Windows应用程序。这些程序是Windows操作系统提供给应用程序编程的接口&#xff08;Application Programming Interface&#xff09;,简称为API函数…

一、MFC介绍

一、什么是MFC MFC(全称:Microsoft Foundation Classes),微软基础类库。他封装了Windows应用程序的各种API以及相关机制的c++类库。 1、特点: (1)开发效率高 (2)程序执行效率高,相对C# (3)迁移性差(仅支持Windows)相对QT 二、MFC程序介绍 1、MFC类库常用头…

VS2015之博大精深的MFC项目开发(一)

VS2015之博大精深的MFC项目开发&#xff08;一&#xff09; 第一章 MFC基础篇1、MFC01-2&#xff1a;Win32程序资源管理1.1 讲解MessageBox&#xff08;在windows中如何输出&#xff09;1.2 给我们的软件插入一个图标1.3 对话框程序是如何建立的&#xff08;在windows中如何输入…

简单MFC程序开发-C++反编译肉鸡养成

目录 一、需求 二、程序效果 效果1&#xff1a;鼠标左键点击&#xff0c;显示坐标 效果2&#xff1a;按下按键&#xff0c;显示键值 三、实现过程 1.创建MFC程序 2.修改添加功能 2.1 修改标题 2.2 增加鼠标消息 2.3 增加键盘消息 2.4 显示文字函数 2.5 编译生成exe 一…

MFC应用程序开发教程1

以下为本人学习笔记 原视频&#xff1a;黑马程序员MFC教程 一、基础概念 SDK&#xff1a;软件开发工具包&#xff08;Software Development Kit&#xff09;&#xff0c;第三方工具API&#xff1a;Windows擦欧总系统提供给应用程序编程的接口窗口&#xff1a;一个Windows应用…

MFC程序开发概述

MFC程序开发概述 一&#xff1a;MFC类库的产生与发展 在Microsoft推出Windows 3.0之后&#xff0c;Windows操作系统受到越来越多的人的青睐。但是不久&#xff0c;开发人员开发撰写Windows 应用程序是重复&#xff0c;厌烦的过程&#xff0c;而且效率极低。因为每一个窗口都需…

Vim撤消和重做操作

While editing text files with vim we can make some little mistakes or want to revert to the previous states. In Microsoft Word there is features rich undo and revert functions. The similar undo and revert functionalities provided by vim too. 在用vim编辑文本…

idea如何使用git指令

&#xff08;1&#xff09;、打开setting,直接搜git (2)、点一下text 如果显示成功就不用管了&#xff0c;但如果失败就要重新设置一下目录&#xff1a; &#xff08;3&#xff09;、找到自己设置gitee ssh目录&#xff1a; 这里我们是不需要用.git对.idea进行管理的&#xff…

idea操作git流程(图文教程)

idea是jetbrain的一款java编辑器&#xff0c;jetbrain全家桶的编辑器都很好用&#xff0c;接下来就以图文的方式介绍&#xff0c;idea如何操作git 1. 首先你需要在自己电脑上安装一个Git&#xff0c;安装git的流程网上应该很多了&#xff0c;这里就跳过了&#xff0c;后续操作…

IDEA中使用Git的教程

&&前期准备工作 &配置git &配置Github 1.远程创建好GitHub仓库 2.打开Terminal窗口 3.创建README.md和.gitignore文件 $touch README.md $touch .gitignore xml .gitignore内容如下: *.class package files *.war *.ear kdiff3 ignore target/ ec…

在Idea中使用Git

一.在Idea中配置Git 安装好IntelliJ IDEA后&#xff0c;如果Git安装在默认路径下&#xff0c;那么idea会自动找到git的位置&#xff0c;如果更改了Git的安 装位置则需要手动配置下Git的路径。选择File→Settings打开设置窗口&#xff0c;找到Version Control下的git选 项&…

Git的理解以及在IDEA中的使用

目录 什么是版本控制 什么是Git 什么是GitHub Git、GitHub、Gitee的区别 git与GitHub GitHub和Gitee 下载安装Git IDEA中配置Git ​编辑 Gitee的使用 IDEA中使用 添加Gitee账号&#xff1a; 分享项目 设置仓库名字 更新项目 小组团队开发 成员拉取项目 数据库…

IDEA 中 Git的使用

1、Git简介 Git是目前流行的分布式版本管理系统。它拥有两套版本库&#xff0c;本地库和远程库&#xff0c;在不进行合并和删除之类的操作时这两套版本库互不影响。也因此其近乎所有的操作都是本地执行&#xff0c;所以在断网的情况下任然可以提交代码&#xff0c;切换分支。Gi…

IntelliJ IDEA 之 Git 使用

文章目录 1. 本地安装 Git2. IDEA 配置 Git3. 首次检出项目4. 项目分支创建5. 项目分支切换6. 项目刷新分支7. 分支代码提交8. 开发分支合并主分支代码9. 主分支合并开发分支代码10. 代码提交记录进行合并操作11. 常用操作的快捷方式12. 开发分支部分合并到主分支13. 主分支被强…

IDEA中项目集成git提交代码详细步骤

简介&#xff1a;在团队协作开发的过程中&#xff0c;好的代码管理能更加有效的使日常开发的过程中对各个开发人员提高开发速度。下面将详细介绍在IDEA中使用git提交代码的过程&#xff1a; IDEA中使用git提交代码 一&#xff1a;pull代码更新的结果&#xff1a;没有代码需要更…

关于idea使用git的简单说明

一、工具 1、安装git 2、idea 3、使用gitblit搭建服务器 可以参考这个文章&#xff1a;http://blog.csdn.net/u010690828/article/details/53735508 二、idea简单配置 首先idea需要设置git&#xff0c;按一下面步骤走 选择你安装的git, 注意&#xff1a;图上有两个选项&a…

如何在IDEA中使用Git

目录 01.在IDEA中配置Git02.在IDEA中使用Git将文件添加到暂存区03.在IDEA中使用Git将文件推送到远程仓库3.1.项目第一次推送至远程仓库报错问题解决&#xff1a; Push rejected: Push to origin/master was rejected 04.在IDEA中使用Git克隆远程仓库05.在IDEA中使用Git从远程仓…

在 IDEA 中使用 Git

1. 在IDEA中配置Git 点击 settings 找到 Version Control 下的 Git &#xff0c;并把 git.exe 的路径&#xff08;默认&#xff09;选入 在IDEA中使用Git&#xff0c;本质上还是使用的本地安装的Git软件&#xff0c;所以需要在IDEA中配置Git 然后点击 Test &#xff0c;出现版…

如何在IntelliJ IDEA中使用git

0.前言 本文主要讲述在IntelliJ IDEA中使用git的方法&#xff0c;git的原理、命令行使用及可视化图形工具的使用请听下回分解。 首先安装IntelliJ IDEA2018.2以及git 2.28.0 1.在IDEA中配置git 在File–>Settings–>Version Control中找到Git&#xff0c;或者直接搜索…