C++ MFC 学习笔记+小型通讯录系统实现(一)

简介: C++ MFC 学习笔记+小型通讯录系统实现(一)

MFC 最详细入门教程

[MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html

[C++ & MFC]https://www.cnblogs.com/gaohongchen01/p/4176963.html

[MFC入门(一)]https://www.cnblogs.com/yangyuqing/p/10283641.html

[MFC快速入门]https://www.cnblogs.com/sea520/p/12582780.html

MFC教程(Visual C++ 6.0)|合集

https://blog.csdn.net/w_lin_jie/article/details/106601523?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168388113516782425197660%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168388113516782425197660&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-2-106601523-null-null.142v87insert_down28v1,239v2insert_chatgpt&utm_term=vc%2B%2B6.0mfc&spm=1018.2226.3001.4187

MFC简介以及基础使用(小白级别入门讲解)

https://blog.csdn.net/qq_45549336/article/details/109008192?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168414038016800215071583%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168414038016800215071583&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-1-109008192-null-null.142v87insert_down28v1,239v2insert_chatgpt&utm_term=mfc&spm=1018.2226.3001.4187

C++是一种静态数据类型检查的、支持多重编程范式的程序设计语言,支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等泛型程序设计的多种程序设计风格。

MFC(Microsoft Foundation Classes),是一个微软公司提供的类库,以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量,同VCL类似,是一种应用程序框架。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。

由于它的易用性,初学者常误认为VC++开发必须使用MFC,这种想法是错误的。作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。

从C到C++

计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序。

世界上第一种计算机高级语言诞生于1954年,它是FORTRAN语言。

BASIC语言是1964年在FORTRAN语言的基础上简化而成的。

C语言是1972年由美国贝尔实验室的D.M.Ritchie研制成功的。

C++是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的,C++保留了C语言原有的所有优点,增加了面向对象的机制。

面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。学习C++,既要会利用C++进行面向过程的结构化程序设计,也要会利用C++进行面向对象的程序设计。

如果要用C++创建窗口,我们需要使用到系统API或者使用封装了这些API的一些库,前者如Win32程序设计,后者如MFC、wxWidgets。

其实我认为学习C++的初期当然是熟悉C++的语法,中期是学习STL等库、系统API以及熟悉C++的面向对象的思想和一般的设计方法;后期是伴随着你C++生涯的一生的,因为它没有终点的,这时候除了要继续加深对C++的理解之外,还需要去学习各种各样的基于C++的库,因为你需要在这些库的帮助下使用C++去实现更具体的东西,比如一些GUI库如MFC、QT、wxWidgets,一些游戏引擎如Ogre、Unreal、Bigworld等,一些网络库如ASIO、RakNet、ACE等。这些库大多有一个特点就是它们都是基于C++,封装了底层的API使得我们可以不必每次都去使用繁杂的API来实现我们想要的功能。当然,你也可以用C++去封装这些API,让自己成为一个库作者,方便他人。

C++发展历史

C++语言发展大概可以分为三个阶段:

第一阶段

从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;

第二阶段

从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;

第三阶段

从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

MFC是什么

MFC,也称为Microsoft Foundation Class Library,是微软公司提供的一组用于编写Windows应用程序的C++类库。它是为了简化Windows应用程序开发而创建的,包括用户界面、窗口管理、消息处理、绘图设备、打印、文件系统、多媒体等方面的功能。MFC库由一组C++类和函数组成,使得开发者可以更加轻松地构建复杂的GUI界面、处理消息、调用Windows API函数等操作。MFC被广泛应用于Windows桌面应用程序的开发,例如Microsoft Office Suite等。

MFC还提供了丰富的控件和对话框,包括按钮、编辑框、列表框、组合框、树形视图、选项卡等常见组件,并支持自定义控件。通过继承MFC的框架类,开发者可以快速构建自己的应用程序界面。此外,MFC还提供了一些高级功能,如多线程支持、ATL COM技术、数据库访问等。目前,MFC虽然相对于现代的UI框架来说有些过时,但仍然是许多旧有Windows软件的主要代码库之一,对于一些需要兼容老系统或保持稳定性的项目来说,仍具有很高的价值。

MFC特点

编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现。

最后要明白MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建、销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等。学习中最应花费时间的是消息和设备环境,对C++和MFC。

MFC编程优势

C++语言应用极为广泛。尤其在底层编程和系统级编程上更是C++的传统优势应用。在数据库和多媒体方面,C++又以其卓越的稳定性而赢得了荣誉。

面对底层程序,它能很轻松的与Windows API或驱动程序结合,就是在自己的代码中直接使用API函数,而API和驱动程序的资料都是以C语言为基础的,这使得VC程序员能够更轻松的使用Windows API。这样造成了一个很有意思的现象,即入门时VC程序员要付出更多的努力来学习,但是一旦掌握后,开发其他领域的程序或使用第三方软件时,如工业控制类的程序,由于底层的程序都是用C语言编写,反倒是VC程序员能够更快的掌握该领域的编程技术。而很多其他的编程语言甚至找不到相关的资料。这就说明VC(MFC)实际上是一种入门困难,但是扩展学习却很轻松的语言框架。如果局限于某一领域的话VC毫无优势可言,但是如果开发一个新的领域的应用程序或者该程序涉及多个应用领域的话,可减少重复学习的频率和难度,VC(MFC)的优势会立刻显现出来。

MFC相关

MFC使用“Afx”作为所有的全局函数和全局变量的前缀。因为在MFC的早期开发阶段它叫“Application Framework Extensions”缩写为“AFX”。AFX提供了对Windows API的高度抽象,建立了全新的面向对象的AFX API,但它对于新手来说太复杂了,所以AFX小组不得不重新开始。后来他们创建了一组C++类,这就是MFC。MFC这个名字被采用得太晚了以至于没来得及修改这些引用。

在免费的Express版本的Visual Studio 2005/2008中没有包含MFC。

MFC作为一个强有力的竞争对手,为Borland的Turbo C++编译器设计OWL(Object Windows Library)在同一时间也发布了。但最后,Borland停止了对OWL的继续开发并且不久就从Microsoft那里购买了MFC头文件,动态链接库等的授权,微软没有提供完整的MFC的集成支持。之后Borland发布了VCL(Visual Component Library)来替换OWL框架。

MFC扩展DLL

每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。

Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。

MFC学习笔记

版权声明:本文为CSDN博主「鲨鱼小猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_45549336/article/details/109008192

一、Windows消息机制

1.1窗口

一个Windows应用程序中至少有一个窗口,称为主窗口。我们在客户区进行图案的绘制。

1.2句柄

一个Windows应用程序是包含图标、光标等许多部件(资源),系统在为这些部件(资源)分配内存后会返回他们的标识号,也就是所谓的句柄。比如在Windows应用程序中,使用窗口句柄来标识每一个窗口。对窗口进行操作时候,首先就是得到这个窗口的标识。

1.3消息与消息队列

Windows是事件驱动方式的程序设计,当一个Windows应用程序开始执行的时候,系统会产生一个消息队列,用于保存这个窗口的消息。eg:当你自己在一个窗口中按下键盘时候(事件),系统会收集到这个按下键盘事情(事件),然后包装成消息,放到这个窗口的消息队列中(窗口过程)。因为队列的先进先出的特点,这时候窗口会一个一个的读取消息,然后进行相应的执行处理。

1.4WinMain函数

控制台DOS中的入口是mian函数,而WinMain函数就是Windows程序的入口函数。启动一个应用程序时候就开始先调用WinMain函数

1.5Windows编程模型

一个应用程序的功能是:创建一个窗口,然后响应键盘或者鼠标消息。

WinMain函数的定义

创建窗口
消息循环
窗口过程

MFC程序入口

//mfc头文件
#include<afxwin.h>
//1、应用程序类CWinApp,MyAPP派生类
class MyApp : public CWinApp{
public:
    //父类的虚函数,需要派生类进行重写
    //也是MFC函数的入口函数
    virtual BOOL InitInstance();
};
//2、框架类CFrameWnd,MyFrame派生类
class MyFrame : public CFrameWnd{
public:
    //构造函数
    MyFrame();
}

MFC.cpp

//对应类的头文件
#include "mfc.h"
//有且只有一个的全局应用程序类的对象
MyApp app;
//程序入口
BOOL MyApp::InitInstance(){
    //1、创建类框架
    MyFrame *frame = new MyFrame;
    //2、显示窗口
    frame -> ShowWindow(SW_SHOWNORMAL);
    //3、更新窗口
    frame -> UpdateWindow();
    //4、保存框架类对象指针
    m_pMainWnd = frame;
    return TRUE;
}
//重写构造函数
MyFrame::MyFrame(){
    //创建窗口
    Create(NULL,TEXT("mfc"));
}

2.3MFC的消息映射

消息映射就是将消息和成员函数相互关联的表。比如,Windows将一个鼠标左击消息放到一个框架窗口消息队列中,然后这个窗口取到这个消息时候,MFC将搜索该窗口的消息映射,如果存在一个处理鼠标左击消息(WM_LBUTTONDOWN)的处理程序,就调用。

下面是如何在一个类中编写一个消息映射

在操作的类中声明消息宏

通过放置标识消息的宏来执行消息映射,相应的类将对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息

mfc.h

class MyFrame : public CFrameWnd{
public:
    MyFrame();
    //声明消息宏
    DECLARE_MESSAGE_MAP()
}
//定义消息宏,在类中实现(派生类,父类)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()
//重写构造函数
MyFrame::MyFrame(){
    //创建窗口
    Create(NULL,TEXT("mfc"));
}

对应的处理函数分别在类中声明,类外定义

//框架类CFrameWnd,MyFrame派生类
class MyFrame : public CFrameWnd{
public:
    //构造函数
    MyFrame();
    //声明消息宏
    DECLARE_MESSAGE_MAP()
    //函数声明
    dfx_msg void OnLButtonDown(UINT,CPoint);
}
//定义消息宏,在类中实现(派生类,父类)
BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN
END_MESSAGE_MAP()
//重写构造函数
MyFrame::MyFrame(){
    //创建窗口
    Create(NULL,TEXT("mfc"));
}
//定义具体函数的实现
void OnLButtonDown(UINT,CPoint){
    .......
    .......
}

C++MFC是Microsoft Foundation Classes的缩写,是一种用于Windows操作系统的C++应用程序框架。它提供了一组类和函数,使得开发者可以使用面向对象的方法创建Windows GUI应用程序。

MFC主要包含以下几个部分:

  1. 应用程序类(CWinApp):处理应用程序的初始化、消息循环等操作。
  2. 窗口类(CWnd):封装了Windows窗口的基本行为,如位置、大小、可见性等。
  3. 对话框类(CDialog):用于创建对话框界面。
  4. 控件类:如按钮、文本框、列表框等,用于与用户交互。
  5. 消息映射机制:将Windows消息与类成员函数关联起来,实现事件响应功能。

MFC在Windows桌面应用程序开发中得到广泛应用,特别是当需要调用Win32 API时,MFC的封装能够简化代码,提高开发效率。但随着移动端和Web应用的兴起,MFC的应用范围逐渐收缩。

在这里插入图片描述

MFC(Microsoft Foundation Classes)是微软公司开发的一组类库,用于在Windows操作系统上开发C++应用程序。其中包括对话框类,可以基于对话框进行编程。

目录
相关文章
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
92 0
|
4月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
42 0
|
3月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
57 3
|
3月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
4月前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
72 1
|
4月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
46 1
|
4月前
|
存储 数据可视化 C++
【C++】C++-学生考试题库管理系统(源码)
本系统设计了一个选题管理流程,包括读取题目信息、随机抽取题目、保存及查询选题结果等功能。使用 `readProjects` 从文件读取题目信息,`drawProject` 随机抽取未选中的题目,`saveSelection` 保存选题结果至文件,`querySelection` 查询并显示所有选题结果。主函数提供菜单界面,支持学生信息输入、抽题及结果查询。关注【测试开发自动化】公众号,回复“题库”获取源码。
41 0
|
4月前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
97 0
|
4月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
63 0
|
4月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
55 0