MFC编程入门级教程

MFC编程入门级教程MFC MicrosoftFou 是微软公司专门为 C 开发者设计的一套应用程序框架和类库

大家好,欢迎来到IT知识分享网。

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常用控件使用

  • MFC常用控件使用(文本框、编辑框、下拉框、列表控件、树控件)
  • MFC标签页 Tab Control控件介绍

6 帮助

  • MFC参考文档

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121361.html

(0)
上一篇 2025-10-24 08:10
下一篇 2025-10-24 08:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信