MFC学习记录

文章目录

MFC程序结构

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

使用Win32创建MFC程序

点击下一步 选择空项目

右键项目 选择添加类

删除头文件 和 cpp的所有代码 开始添加下面的代码

mfc.h

cpp 复制代码
  #pragma once
  
  // MFC头文件
  #include <afxwin.h>
  
  // 应用程序类 CWinApp
  class MyApp :public CWinApp {
  public:
  	
  	// MFC程序入口地址
  	virtual BOOL InitInstance();
  };
  
  // 框架类(窗口类)
  class MyFrame :public CFrameWnd {
  public:
  	MyFrame();
  };

mfc.cpp

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()。

消息映射

消息映射是一个将消息和成员函数相互关联的表。类似于QT中的信号槽,将信号槽进行绑定。这样当有消息发生时,就会自动执行对应的成员函数。

消息映射编程步骤

所操作的类中,声明消息映射宏

cpp 复制代码
  DECLARE_MESSAGE_MAP()

对应的源文件中定义宏

cpp 复制代码
  // 定义消息宏
  BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) // 开始
  	ON_WM_LBUTTONDOWN() // 鼠标左键按下消息
  	ON_WM_CHAR()        // 键盘按下消息
  END_MESSAGE_MAP() //结束

在所操作类中,声明消息处理函数

cpp 复制代码
  	//函数声明
  afx_msg void OnLButtonDown(UINT, CPoint);
  afx_msg void OnChar(UINT, UINT, UINT);

对应源文件中消息处理函数实现

cpp 复制代码
  	//函数声明
  afx_msg void OnLButtonDown(UINT, CPoint);
  afx_msg void OnChar(UINT, UINT, UINT);

完整代码

mfc.h

cpp 复制代码
  #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

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);
  }

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

文章来源

相关推荐
寒秋花开曾相惜4 小时前
(学习笔记)第四章 处理器体系结构
linux·网络·数据结构·笔记·学习
故事和你915 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__5 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__5 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
低代码布道师6 小时前
微搭低代码MBA 培训管理系统实战 30——学习卡
学习·低代码·rxjava
南無忘码至尊6 小时前
Unity学习90天 - 第 6天 - 学习协程 Coroutine并实现每隔 2 秒生成一波敌人
学习·unity·c#·游戏引擎
LN花开富贵7 小时前
【ROS】鱼香ROS2学习笔记二
linux·笔记·python·学习·嵌入式
檬柠wan7 小时前
MySQL-数据库增删改查学习
数据库·学习·mysql