MFC编程入门级教程

1 MFC是什么

  • MFC (Microsoft Foundation Classes) 是微软公司专门为C++开发者设计的一套应用程序框架和类库。它通过C++类的形式对Windows API进行了高度封装,简化了Windows应用程序的开发过程。MFC提供了一系列预定义的类,这些类对应于Windows编程中的各种基本元素,如窗口、菜单、对话框、控件等,同时也包含了应用程序框架的支持,如文档/视图体系结构、命令路由、消息映射机制等。
  • 使用MFC进行开发时,程序员可以利用面向对象的编程技术更高效地创建桌面GUI应用程序,而不必直接处理复杂的Windows消息循环和资源管理等底层细节。通过MFC,开发人员能够更快捷地构建功能丰富的Windows应用,同时享受到C++语言带来的灵活性和强大的面向对象特性。

2 MFC程序结构

  • 这一章节主要介绍了MFC程序的结构,实际上进行MFC编程,是直接用MFC向导来创建。但通过这个章节我们可以看到MFC程序的基本结构和对消息的处理流程,这对理解MFC程序是非常有用的。

2.1 使用Win32创建MFC程序

  • 先创建一个Win32程序,对MFC程序结构进行下说明
  • mfc.h
    •   #pragma once
        
        // MFC头文件
        #include <afxwin.h>
        
        // 应用程序类 CWinApp
        class MyApp :public CWinApp {
        public:
        	
        	// MFC程序入口地址
        	virtual BOOL InitInstance();
        };
        
        // 框架类(窗口类)
        class MyFrame :public CFrameWnd {
        public:
        	MyFrame();
        };
      
  • mfc.cpp
    •   #include "mfc.h"
        
        // 有且只要一个全局的应用程序类对象
        MyApp theApp;
        
        // MFC程序入口地址
        BOOL MyApp::InitInstance() {
        	// 创建框架类对象
        	MyFrame *frame = new MyFrame;
        	// 显示窗口
        	frame->ShowWindow(SW_SHOWNORMAL);
        	// 更新窗口
        	frame->UpdateWindow();
        
        	// 保存框架类对象指针(指向应用程序主窗口的指针)
        	m_pMainWnd = frame;
        
        	return TRUE;
        }
        
        MyFrame::MyFrame() {
        	Create(NULL, TEXT("MFC"));
        }
      
  • 在项目属性中找到常规->MFC的使用改为在共享DLL中使用MFC,就可以编译运行了。使用以上程序,可以直接生成一个窗口。可以看到,MFC比 Windows编程基础 这篇文章中介绍的使用Windows API去创建窗口要简单很多。
  • MFC程序的入口地址是 InitInstance() 。很多初学者创建一个MFC程序后,习惯性的去找main函数,那在MFC程序中是没有main函数的,MFC将main函数进行了封装,对开发者来说,入口函数就是 InitInstance()

2.2 消息映射

  • 消息映射是一个将消息和成员函数相互关联的表。类似于QT中的信号槽,将信号槽进行绑定。这样当有消息发生时,就会自动执行对应的成员函数。
  • 消息映射编程步骤
    • 所操作的类中,声明消息映射宏
      •   DECLARE_MESSAGE_MAP()
        
    • 对应的源文件中定义宏
      •   // 定义消息宏
          BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) // 开始
          	ON_WM_LBUTTONDOWN() // 鼠标左键按下消息
          	ON_WM_CHAR()        // 键盘按下消息
          END_MESSAGE_MAP() //结束
        
    • 在所操作类中,声明消息处理函数
      •   	//函数声明
          afx_msg void OnLButtonDown(UINT, CPoint);
          afx_msg void OnChar(UINT, UINT, UINT);
        
    • 对应源文件中消息处理函数实现
      •   // 鼠标按下消息处理程序
          void MyFrame::OnLButtonDown(UINT, CPoint point) {
          	TCHAR tBuf[1024] = { 0 };
          
          	wsprintf(tBuf, TEXT("x = %d, y = %d\n"), point.x, point.y);
          
          	MessageBox(tBuf);
          }
        
          // 键盘按下消息处理程序
          void MyFrame::OnChar(UINT key, UINT, UINT) {
          	CString str;
          	str.Format(TEXT("按下了 %c 键"), key);
          
          	MessageBox(str);
          }
        
  • 完整代码
  • mfc.h
    •   #pragma once
      
        // MFC头文件
        #include <afxwin.h>
        
        // 应用程序类 CWinApp
        class MyApp :public CWinApp {
        public:
        	
        	// MFC程序入口地址
        	virtual BOOL InitInstance();
        };
        
        // 框架类(窗口类)
        class MyFrame :public CFrameWnd {
        public:
        	MyFrame();
        
        	// 声明消息映射
        	DECLARE_MESSAGE_MAP()
        
        	//函数声明
        	afx_msg void OnLButtonDown(UINT, CPoint);
        	afx_msg void OnChar(UINT, UINT, UINT);
        };
      
  • mfc.cpp
    •   #include "mfc.h"
        
        // 有且只要一个全局的应用程序类对象
        MyApp theApp;
        
        // MFC程序入口地址
        BOOL MyApp::InitInstance() {
        	// 创建框架类对象
        	MyFrame *frame = new MyFrame;
        	// 显示窗口
        	frame->ShowWindow(SW_SHOWNORMAL);
        	// 更新窗口
        	frame->UpdateWindow();
        
        	// 保存框架类对象指针(指向应用程序主窗口的指针)
        	m_pMainWnd = frame;
        
        	return TRUE;
        }
        
        // 定义消息宏
        BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) // 开始
        	ON_WM_LBUTTONDOWN() // 鼠标左键按下消息
        	ON_WM_CHAR()        // 键盘按下消息
        END_MESSAGE_MAP() //结束
        
        MyFrame::MyFrame() {
        	Create(NULL, TEXT("MFC"));
        }
        
        // 鼠标按下消息处理程序
        void MyFrame::OnLButtonDown(UINT, CPoint point) {
        	TCHAR tBuf[1024] = { 0 };
        
        	wsprintf(tBuf, TEXT("x = %d, y = %d\n"), point.x, point.y);
        
        	MessageBox(tBuf);
        }
        
        // 键盘按下消息处理程序
        void MyFrame::OnChar(UINT key, UINT, UINT) {
        	CString str;
        	str.Format(TEXT("按下了 %c 键"), key);
        
        	MessageBox(str);
        }
      

3 MFC编程

  • 以上章节是为了让我们理解MFC程序的结构,接下来就真正进入到MFC编程中。

3.1 创建MFC工程

  • 进行MFC编程时,不需要再创建Win32程序了。直接创建一个MFC程序,创建一个项目,选择MFC->MFC应用程序。
    在这里插入图片描述

  • 这里选择单个文档和MFC标准
    在这里插入图片描述

  • 其他没有需要特别设置的,直接下一步直到完成即可。

  • 创建成功后,会生成以下文件
    在这里插入图片描述

  • 什么代码都不用写,直接运行,就可以生成一个窗口
    在这里插入图片描述

3.2 MFC工程介绍

  • 进行MFC编程,一般在类视图中进行操作
    在这里插入图片描述
  • 类视图中会显示都有哪些类,点击对应的类可以看到类中都有哪些函数。基于单个文档创建的MFC程序,主要包含四个类:框架类(CMainFrame), 应用程序类(CxxxApp),文档类(CxxxDoc),视图类(CxxxView)。

3.3 应用程序类 CxxxApp

  • MFC应用程序框架的核心类,每个MFC应用程序都有一个CWinApp派生类的对象实例,用于管理整个应用程序的生命周期。它负责应用程序的初始化、运行期间的服务和退出清理等工作。
  • CxxxApp类有一个 InitInstance 函数,这是MFC程序的入口地址。

3.4 框架类 CMainFrame

  • CMainFrame通常是从CFrameWnd派生的,代表应用程序的主窗口框架。它定义并实现了应用程序窗口框架的整体结构和行为,为用户提供了一个与程序交互的可视化环境,并且协调文档、视图和其他界面元素的工作。

3.5 视图类 CxxxView

  • CxxxView类主要负责应用程序数据的可视化呈现、用户交互以及数据更新等功能。是实现用户界面与数据模型之间桥梁的关键部件,它将底层的数据转换为直观的视觉表现,并确保用户操作能够及时反映到数据模型中去。如果把框架类看作是相框,视图类就是相片。

3.6 文档类 CxxxDoc

  • CxxxDoc类主要用于管理和维护应用程序的数据逻辑,承担了数据存储、加载、序列化以及数据更改通知等任务。

3.7 MFC如何响应鼠标按下消息

  • 在2章节中,为了响应鼠标按下消息,写了很多消息定义和响应函数的实现,那在MFC程序中如何响应鼠标按下消息呢?

  • 上面是在框架类中响应了鼠标按下消息,MFC编程中,对类进行了细分,如果把框架类看作是相框,视图类就是相片。因此需要在视图类中响应鼠标按下消息。如果在框架类中响应鼠标信息是看不到效果的,会被视图类挡住。

  • 点击视图类,右击选择属性
    在这里插入图片描述

  • 点击消息,找到鼠标按下消息,然后添加。
    在这里插入图片描述

  • 会自动生成鼠标按下消息的处理程序,在2.2章节中定义消息宏这些操作都是MFC自动帮我们完成的,我们只需要在消息处理程序中完成鼠标按下消息的响应即可。
    在这里插入图片描述

4 基于对话框编程

  • 上面介绍的是单个文档编程,MFC比较常用的是基于对话框编程,通过控件实现一些UI交互。

4.1 工程创建

  • 同样的先创建MFC工程
    在这里插入图片描述
  • 在这里选择基于对话框,完成即可
    在这里插入图片描述
  • 创建好后直接运行,就可以生成一个对话框窗口
    在这里插入图片描述
  • 基于对话框创建的工程,只有两个基础类,应用程序类和对话框类。
    在这里插入图片描述

4.2 对话框基础属性介绍

  • 如果关闭了对话框界面,可以在资源视图里找到Dialog,下面就是当前工程的所有对话框界面。
    在这里插入图片描述
  • 鼠标右击对话框,打开属性界面
    在这里插入图片描述
  • 属性界面展示的是当前对话框的所有属性。包括对话框标题Caption和ID,ID是和对话框绑定的一个值,程序就是通过这个ID值找到对应的对话框。
    在这里插入图片描述
  • 点击这里的工具箱
    在这里插入图片描述
  • 可以看到非常多的基础控件,包括按钮、编辑框等
    在这里插入图片描述
  • 可以直接将控件拖动到当前对话框上面,实现对应的事件,跟QT类似。
    在这里插入图片描述

4.3 添加一个新的对话框

  • UI编程时,一般需要多个窗口,这里就需要添加新的对话框。

  • 在资源视图界面选择Dialog,右击插入Dialog
    在这里插入图片描述

  • 新建对话框
    在这里插入图片描述

  • 这里就创建了一个新的对话框
    在这里插入图片描述

  • 要操作新添加的对话框,需要给对话框添加一个类。右击对话框,添加类
    在这里插入图片描述

  • 写一个类名,完成即可。
    在这里插入图片描述

  • 类视图可以看到,新添加了一个类。可以在对应类中,对新添加的对话框进行操作。
    在这里插入图片描述

4.4 模态和非模态对话框

  • 模态对话框,在父窗口打开一个子窗口时,如果子窗口不关闭,父窗口无法操作。
  • 非模态对话框,在父窗口打开一个子窗口时,即使不关闭子窗口,父窗口也能操作。
  • 介绍之前需要两个窗口,我们就以默认生成的对话框为父窗口,刚才新建的对话框为子窗口。
  • 在父窗口界面放置一个按钮
    在这里插入图片描述
  • 接下来就是添加按钮的事件处理程序,右击按钮控件,选择添加事件处理程序
    在这里插入图片描述
  • 这里要选择处理按钮的哪个消息,按钮一般选择处理点击消息。
    在这里插入图片描述
  • 在对应的类中,就会生成事件处理函数。
    在这里插入图片描述
  • 或者直接双击按钮控件,也能自动添加一个处理事件。
  • 实现模态对话框时,包含子窗口对应的头文件,然后在父窗口的按钮点击事件处理函数中写入以下代码。通过DoModal就可以弹出模态对话框。
    在这里插入图片描述
  • 看下效果
    在这里插入图片描述
  • 点击按钮后,可以弹出子对话框,并且还可以获取到子对话框点击了确定还是取消。
  • 创建非模态对话框,需要在父窗口类中将子窗口类声明为成员变量
    在这里插入图片描述
  • 在父窗口的初始化函数中创建子窗口
    在这里插入图片描述
  • 在父窗口的按钮点击事件中显示窗口
    在这里插入图片描述
  • 看下效果
    在这里插入图片描述

5 MFC常用控件使用

6 帮助

  • 17
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS2013 MFC 编程基础,共有19个专题实例,作为VS2013、VC++MFC开发的基础入门资料,对初学者很有帮助!N和weet45厘序量D以量 #目度 M用啊 Mnua ca+程 WICELL 名啊 位 B日经验 进入应用程序向导,一开始会给出默认的项目配置,点击“下一步”即可 MFC应用柱序:Deme 欢使用Mc应用程序向导 鞋速 这些是当前啧自设置: 应用程序典型 送卡式多交检界面O) 无数据斥查持 合文植支持 不持复台交档 文档幔属性 可自定义某单栏和工具栏界面 数据支持 YiYuN studie200应用程序外观 节u$φ项目样式阗有资管理器画格、输出格和属性面格 用户畀击功 ·重新启管理器支持新打开文档,应用程序恢复) 亮功能 在任一画囗中单击“完成”,接受当前设置● 生的疯 项目后请该项目的rtt文件,了解有兴项目功能和所生的文件的 上到『元础 选择“基于对话框”, 可以选择在静态库中使用,或者在共享中使用。一般选择共 亨使用就行,静态库中使用会把所有用到的集成到文件中,最终生成的文件一般可 以直接使用,但占用更大空间。 MFc应用程度肉导Demo 应周程序卖型 成用程岸类 目共 应用程序典型 ◎单个文档巴) 复合文植支持 多个植思 酒管理器) 文档板国性 □选项卡式文档0) 提支 蓝十对话① Orifice Ur 用户卿面功能 □使用对话粗q 视武样式和色①D 亳功能 无略星的控件@ is当本机/认 生的 $个文档①) 口启闻体式切c 团究档/视图持 C的使用 在共享L中使用c 区安全开发生命周期6〕检置c 在静态库中使用cg 资语语言) 中交傳;中国) 选择主框架样式,可以自由选择是否添加最小化框、最大化框。如果觉得没必要“关于″对 话框也可以去掉,对话框标题一般不需要更改 MFC应用序匀导:Demo 用户畀面功能 粗速 主粗样式 命任碳单/工具栏/能区 应用程序英型 框粗架① @便用经肉单 复合文植持 团使用传始停工具栏收 四量大化框 □使用器样到的工具栏 挡板国性 国量小化 O使用单仁和工具栏 量大化g 团用户定义的工具栏和②) 户卿面功 d系统单① 个性化单行为 功能 “关于糕更 回初态栏0D 使用功能区 生欣的 口括分面口) 对话标题 于粗式 子量小化 团子最大化粗( 口子最大化② 上步口产燕 高功能一般默认即可,但如果用不上 控件”可以去掉勾选;如果需要涉及网络 编程就把“ 套接字”选上。不过没选上也不要紧,在程序中可以自己添加部分代码 导入套接字。 MFc应用序向导Dema 高功齬 粗速 功能 色格: 口打印和打印Q □资富度器得窜面格② 应用程序典 自动化 合文植支持 □国性傅面临 交档板国性 口导航面格 据库支持 □标任 用户界面功糙 已L售y) 公控否单思 高其单项显示/蒙活面格吧 幕功能 团支持亚新理器 最近文列离上的文件数① 生邱的 □重新打开以打开的档① 口支应用程岸复0 〈上一步[下-步习□ 最后是自动生成的两个类的头文件和源文件名称,可以修改基类,但一般不用改,默认完成 就行。至此,一个基于对话框的项目就创建好了。 MFc应用序导Dmo 生兩的 生成的 应用程序典型 已E+g 合文植支特 文档吸板国性 数支持 卖名① h交件② 用户界面功糙 Damotlg h 功能 》又件電) 山建 AmalG cpp B温 CDHamlDi aloe 当工1 d经验 jingyan.baidu.com 注意事项 合理的向导设置可以减少后续编程的麻烦 基于对话框编程:项目整体结构 当我们创建好一个项目以后,为了更快速的编程,快速找到需要修改的部分这就得熟悉 开发环境的各个模块的作用,各个模块之间的关系。 工具原料 项目整体结构 创建好一个工程,观察项目界面的布局,上面是菜单栏和工具栏,在设计界面的左 侧可以调出工具箱;右侧是属性栏、类视图、资源视图和资源管理器等;底部是一些显示错 误信息、符号查询结果、项目生成信息的栏目;最下方是状态栏,显示当前开发状态。 应南计断酒 d经验 ingyanbaidu.com 打开解决方案资源管理器,可以看到所有的头文件、源文件以及资源文件都归类排序摆放, 便于快速寻找需要打开的内容。点开头文件前面的三角号可以查看类的成员变量和函数。 解决方案资源铛理器 X 搜素解决方客资源管理器(Ctrl+) 丙解央方案"Demo"(1个项目) Demo 头文件 p画 Demo.h L DemoDlg, h +s CDemoDlg CDemo Dlg(CWnd b e unnamed enum 0005 1 DoData Exchange(CDatal 回 IDD DEMO DIALOG hIc 4. OnInitDialog0 2. OnPaint * OnQueryDraglcon0 4. On Sys Command(UINT, LPAR. p画 Resource. h stdatx. h D targeteer. h p外部依项 源文件 Demo, cpp D * DemoDlg cp + stdafxcpp 资源文件 园 Demo. ico Demo. rc B Demo. rc2 自 ReadMe tBa经验 lingyanbaidu.com 看看资源视图,资源视图包含了应用程序用到的所有资源,包括对话框资源、应用图标、菜 单、字符串、软件信息等等。 资源视图-Demo A图Demo Demo, rc 当 Dialog 国 IDD ABOUT BOX 国 IDD_DEMODIALOG d Icon B IDR MAINFRAME a String Table 回 String Table 向 Version 画 S VERSION INF Baid经驵 jingyan. baiducom 打开版本信息,可以看到自己编写的应用程序的相关信息,比如版本号、公司名称等,自己 觉得需要修改的可以依情况修改。 wwtn lgds kaner 工1 1b aeoutedx 用人系 2贴N人M L01 Ba 经验 jingyan.baidu.com 再看类视图,类视图包含了应用程序用到的所有类,包括自动生成的类以及开发者自己创建 的类。点击类名,在下方会显示该类包含的所有成员变量和函数,不同类型的函数或者变量 都有不同的符号标记。 通过类视图可以快速访问类的头文件和源文件,双击类名打开头文件,点击下方的函数可直 接跳转到对应的函数定义处 类视图 口X ⊙。·年 ≤搜素 pom映射 宏和常量 6全局函数和变量 b t CAboutDIg p CDemoApp 4t CDemoDlg 9 CDemoDlg(CWnd"pArent =NULL) o. Do Data Exchange(CDataExchange'pDX Q@, OnInit Dialog @. On Paint 6. OnQueryDraglcon0 9. OnSys Command(UINT nID, LPARAM IParam a m hIcon Baid经验 jingyanbaidu.com 属性页用来修改和査看对话框中控件(包括对话框本身)的各项属性,毎类控件的属性项都 不一样,需要根据情况修改,当然所有的属性都可以以代码形式实现,但能直接修改最好 方便快捷。
MFC编程(Microsoft Foundation Class)是指使用Microsoft Visual C++开发Windows平台应用程序的一种编程技术。下面是关于MFC编程从入门到精通的回答。 首先,入门MFC编程需要掌握C++语言的基础知识,包括变量、函数、类、面向对象的概念等。同时,需要了解Windows操作系统的基本原理和用户界面的设计与开发。 接下来,学习MFC框架的使用是非常重要的。MFC提供了一套丰富的类库,用于简化Windows应用程序的开发。需要熟悉MFC中的基本类,如CWinApp、CFrameWnd、CDialog等,以及它们的成员函数和消息映射等概念,掌握MFC框架的基本使用方法。 在掌握基本的MFC编程技能后,深入学习MFC的各种功能和扩展,可以提高编程的灵活性和效率。这包括了处理消息、控件的操作、对话框的设计、文件的读写、绘图、多线程编程等高主题。 此外,了解一些高MFC技术和技巧,如自定义控件、自绘界面、多文档界面、打印和预览、国际化支持等,可以让你的应用程序更加专业和用户友好。 要精通MFC编程,则需要不断实践和积累经验。可以通过阅读MFC编程相关的书籍、教程和文档,参加相关的培训和讨论,以及积极参与开发社区的交流,与其他开发者分享经验和技术。 总结起来,MFC编程从入门到精通需要掌握C++语言基础、MFC框架的使用、高技术和扩展,以及不断实践和积累经验。通过不断学习和实践,可以成为一名熟练的MFC开发者,并能够高效地开发出功能丰富、稳定可靠的Windows应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值