MFC入门笔记

MFC入门

新建一个MFC程序

1.安装好VS 2017后并打开,点击文件---->新建---->项目

在这里插入图片描述

2.在弹出的对话框中的侧边栏,看到跨平台这个选项,点击展开选择MFC/ATL,选择MFC应用(如果找不到MFC应用只有ATL项目参考这篇文章:(VS2017 新建项目没有MFC项目选项_一只小_小菜鸟的博客-CSDN博客_vs2017没有mfc项目);在名称处对项目进行命名(最好是用英文命名),在位置中选择要保存的路径,点击确定。

在这里插入图片描述

3.1在应用对话框的下拉菜单选择“基于多个对话框”;

在这里插入图片描述

3.2在使用MFC的下拉菜单中选择"在共享DLL中使用MFC",点击下一步

共享DLL与静态库两者的区别:

“在共享DLL中使用MFC” 选项生成的程序可执行文件比较小,但是要求目标机器必须装有必要的库文件。
“在静态库中使用MFC” 选项生成的程序可执行文件几乎所有的Windows都可以执行,但是程序较大一些,其中包含必要的库文件,可以基本保证在别的机器上正常运行。

(参考文章:MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC_AlbertS的博客-CSDN博客

在这里插入图片描述

4.此处继续勾选最小化框,是为了可以缩小创建的窗口。一直点击下一步,直到完成。

最大化&最小化:选择了会使得创建的窗口直接最大化或者最小化

在这里插入图片描述

5.等待创建完成后,选择资源视图,点击项目名称旁边的小三角,展开至Dialog,会看到2个小标签,IDD_ABOUTBOX和IDD_CACUL_DIALOG,分别双击打开会看到是两个小窗口。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.在上方工具栏的调试中,选择"开始执行(不调试)",会弹出当前创建的这个MFC窗口;

如果不需要窗口中的小组件可以选中后按DEL键删除;窗口也可以自由的放大缩小。
在这里插入图片描述
在这里插入图片描述

7.如果需要添加组件可以找到侧边的工具箱,将想要的组件选中,再点一下窗口即可创建完成。

如果想要更改组件名称,选中组件,直接输入名称即可。

在这里插入图片描述

添加点击事件

1.双击组件,VS 会跳转至对应代码的地方
在这里插入图片描述

进入后可以添加代码实现相应的功能;

2.创建按钮的点击事件

MessageBox()

此函数一般需要写入3个参数,最少可以只写1个

int MessageBox( HWND hWnd, LPCTSTR lpText, LPCSTR lpCaption,UINT uStyle );
/*
消息框函数有4个参数:
hwnd: 父窗口的句柄,为NULL,说明消息框没有父窗口,大多数情况下可以省略不写
lpText: 指向要显示字符串的指针,对话框上显示的信息
lpCaption: 消息框的标题,即提示框上部分显示的内容
uStyle: 消息框的内容和形为(即该消息框有几个按钮、文本对齐等状态,可以在20多个属性值中进行组合)
*/

_T()

_T(“Hello”)是一个宏,他的作用是让你的程序支持Unicode编码,因为Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。

void CcaculDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	MessageBox(_T("欢迎"), _T("标题"));
}

运行后结果:点击hello按钮,回弹出小对话框,显示“欢迎”文本,标题处显示“标题”。

在这里插入图片描述

3.定义&获取文本框中的文字

Cstring类用法:

//五种方法,以换行分割,请忽略变量名重名。
CString str;  //最简单的无参构造

CString str("ABCDE"); //带内容的构造
CString buf(str);  //类的拷贝构造
//buf输出:ABCDE

CString str("ABCDEFGH",3);
//str输出:ABC

CString str('a',5);
//str输出:aaaaa

wchar_t s[]=L"abcdef";
CString str(s);
//str输出:abcdef

/* 或许有人会问,你全用英文,那中文的呢?  OK,他来了,请看*/
CString str = _T("我是小猪");
CString buf(str,4);
//buf输出: 我是  ~~~~~~为啥没有小猪,因为小猪被我吃了(开玩笑)
//因为:英文我们一般用1个字节就够了,但是中文字符,一个中文占2个字节,编译器不一样,或许也不一样,想知道你的是多少,可以用下面要说的GetLength方法查看
//参考文章:https://blog.csdn.net/m0_43458204/article/details/119026654

GetDlgItemText:获取给定控件的文本

CString str_id(_T(""));
GetDlgItemText(IDC_EDIT_ID, str_id);//获取帐号
	
CString str_password(_T(""));
GetDlgItemText(IDC_EDIT_PASSWORD, str_password);//获取密码
/*
nID:控件的标识符,也就是控件的ID。
lpStr:与控件文本的指针,也就是控件文本中的内容,你需要获取的东西。
nMaxCount:在字符指定最大长度,要复制的,该字符串就缓冲区指向由 lpStr。如果该字符串的长度超过限制,字符串被截断。
*/

在工具箱中双击edit control,将文本框拉成想要的大小

在这里插入图片描述

首先需要找到文本框的ID,鼠标右键选择属性,打开属性面板,下拉找到ID选项并复制,回到hello按钮的函数中

在这里插入图片描述

添加代码:

void CcaculDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
    CString cs;
	GetDlgItemText(IDC_EDIT1,cs);
	MessageBox(cs, _T("标题"));
}

实现功能如下:在文本框输入什么数值,点击hello按钮后会返回一样的值

在这里插入图片描述

若要固定文本框所输出的值需要用到SetDlgItemTex

SetDlgItemText:将指定控件的文本,使用在 lpszString包含的文本

/*
nID:控件的标识符。
lpszString:与控件文本的指针。
*/
SetDlgItemText(IDC_EDIT_ID,_T("请输入帐号"));
SetDlgItemText(IDC_EDIT_PASSWORD, _T("请输入密码"));
//参考文章:https://blog.csdn.net/mars_xiaolei/article/details/79081810

制作一个计算器界面

_tstoi()

_tstoi意思是将字符串变量转换为整型变量

Format

Format是CString类的一个成员函数,它通过格式操作使任意类型的数据转换成一个字符串。

有了上述的知识可以搭建一个基础的电脑计算器的界面

1.使用工具箱中的按钮,文本框以及静态文本搭建出雏形

在这里插入图片描述

2.分别查看文本框的属性,按照ID大小排好顺序并将其对齐

3.编辑代码

void CcalculaterDlg::OnBnClickedButton1()
{
	CString CS1;
	CString CS2;
	CString CS3;  //定义三个字符串类型
    
	GetDlgItemText(IDC_EDIT1, CS1);
	GetDlgItemText(IDC_EDIT2, CS2);  //获取输入的数据

	int x = _tstoi(CS1);
	int y = _tstoi(CS2);  //将数据转换为整型
	
	CS3.Format(_T("%d"), x + y);
	SetDlgItemText(IDC_EDIT3, CS3);  //输出结果
}

4.输出结果如下:在前两个框中输入数据,点击计算,会在第3个框中显示前两个数之和。

在这里插入图片描述
参照视频来自B站:BV1pb411L7yq,感谢up的手把手教学

第1章 MFC概述 1 1.1 MFC是一个编程框架 1 1.1.1 封装 1 1.1.2 继承 2 1.1.3 虚拟函数和动态约束 2 1.1.4 MFC的宏观框架体系 2 1.2 MDI应用程序的构成 3 1.2.1 构成应用程序的对象 3 1.2.2 构成应用程序的对象之间的关系 5 1.2.3 构成应用程序的文件 5 第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口的销毁 19 2.3 设备描述表 20 2.3.1 设备描述表概述 20 2.3.2 设备描述表在MFC中的实现 22 2.3.3 MFC设备描述表类的使用 24 2.4 GDI对象 25 第3章 CObject类 28 3.1 CObject的结构 28 3.2 CObject类的特性 30 3.3 实现CObject特性的机制 32 3.3.1 DECLARE_DYNAMIC等宏的定义 32 3.3.2 CruntimeClass类的结构与功能 35 3.3.3 动态类信息、动态创建的原理 38 3.3.4 序列化的机制 39 第4章 消息映射的实现 42 4.1 Windows消息概述 42 4.1.1 消息的分类 42 4.1.2 消息结构和消息处理 42 4.2 消息映射的定义和实现 44 4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4.2.3 Windows消息处理函数的调用 62 4.4.2.4 消息映射机制完成虚拟函数功能的原理 63 4.4.3 对命令消息的接收和处理 64 4.4.3.1 MFC标准命令消息的发送 64 4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 72 4.4.4.2 WM_NOTIFY消息及其处理: 73 4.4.4.3 消息反射 74 4.4.5 对更新命令的接收和处理 77 4.4.5.1 实现方法 77 4.4.5.2 状态更新命令消息 78 4.4.5.3 类CCmdUI 79 4.4.5.4 自动更新用户接口对象状态的机制 80 4.5 消息的预处理 82 4.6 MFC消息映射的回顾 83 第5章 MFC对象的创建 85 5.1 MFC对象的关系 85 5.1.1 创建关系 85 5.1.2 交互作用关系 86 5.2 MFC提供的接口 87 5.2.1 虚拟函数接口 87 5.2.2 消息映射方法和标准命令消息 91 5.3 MFC对象的创建过程 94 5.3.1 应用程序中典型对象的结构 94 5.3.1.1 应用程序类的成员变量 95 5.3.1.2 CDocument的成员变量 97 5.3.1.3 文档模板的属性 97 5.3.2 WinMain入口函数 99 5.3.2.1 WinMain流程 99 5.3.2.2 MFC空闲处理 101 5.3.3 SDI应用程序的对象创建 102 5.3.3.1 文档模板的创建 102 5.3.3.2 文件的创建或者打开 103 5.3.3.3 SDI边框窗口的创建 112 5.3.3.4 视的创建 115 5.3.3.5 窗口初始化 116 5.3.3.6 视的初始化 120 5.3.3.7 激活边框窗口(处理WM_ACTIVE) 121 5.3.3.8 SDI流程的回顾 122 5.3.4 MDI程序的对象创建 123 5.3.4.1 有别于SDI的主窗口加载过程 124 5.3.4.2 MDI子窗口、视、文档的创建 125 5.3.4.3 MDI子窗口的初始化和窗口的激活 127 第6章 应用程序的退出 131 6.1 边框窗口对WM_CLOSE的处理 131 6.2 窗口的销毁过程 135 6.2.1 DestroyWindow 135 6.2.2 处理WM_DESTROY消息 136 6.2.3 处理WM_NCDESTROY消息 136 6.3 SDI窗口、MDI主、子窗口的关闭 137 第7章 MFCDLL 139 7.1 DLL的背景知识 139 7.2 调用约定 141 7.2.1 MFCDLL应用程序的类型 142 7.3 DLL的几点说明 143 7.4 输出函数的方法 145 第8章 MFC的进程和线程 148 8.1 Win32的进程和线程概念 148 8.2 Win32的进程处理简介 148 8.2.1 进程的创建 148 8.2.2 进程的终止 149 8.3 Win32的线程 150 8.3.1 线程的创建 150 8.3.2 线程的终止 150 8.3.3 线程局部存储 151 8.4 线程同步 152 8.4.1 同步对象 152 8.4.2 等待函数 153 8.5 MFC的线程处理 154 8.5.1 创建用户界面线程 155 8.5.2 创建工作者线程 155 8.5.3 AfxBeginThread 155 8.5.4 CreateThread和_AfxThreadEntry 157 8.5.5 线程的结束 160 8.5.6 实现线程的消息循环 161 第9章 MFC的状态 163 9.1 模块状态 163 9.2 模块、进程和线程状态的数据结构 164 9.2.1 层次关系 164 9.2.2 CNoTrackObject类 166 9.2.3 AFX_MODULE_STATE类 166 9.2.4 _AFX_BASE_MODULE_STATE 169 9.2.5 _AFX_THREAD_STATE 169 9.2.6 AFX_MODULE_THREAD_STATE 171 9.3 线程局部存储机制和状态的实现 172 9.3.1 CThreadSlotData和_afxThreadData 173 9.3.1.1 CThreadSlotData的定义 173 9.3.1.2 CThreadSlotData的一些数据成员 174 9.3.1.3 _afxThreadData 175 9.3.2 线程状态_afxThreadState 176 9.3.3 进程模块状态afxBaseModuleState 178 9.3.4 状态对象的创建 180 9.3.4.1 状态对象的创建过程 180 9.3.4.2 创建过程所涉及的几个重要函数的算法 183 9.4 管理状态 184 9.4.1 模块状态切换 184 9.4.2 扩展DLL的模块状态 186 9.4.2.1 _AFX_EXTENSION_MODULE 187 9.4.2.2 扩展DLL的初始化函数 188 9.4.3 核心MFC DLL 190 9.4.4 动态链接的规则DLL的模块状态的实现 190 9.5 状态信息的作用 192 9.5.1.1 模块信息的保存和管理 192 9.5.2 MFC资源、运行类信息的查找 193 9.5.3 模块信息的显示 194 9.5.4 模块-线程状态的作用 196 9.5.4.1 只能访问本线程MFC对象的原因 196 9.5.4.2 实现MFC对象和Windows对象之间的映射 196 9.5.4.3 临时对象的处理 199 9.6 状态对象的删除和销毁 199 第10章 内存分配方式和调试机制 202 10.1 M内存分配 202 10.1.1 内存分配函数 202 10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC的文件类 210 11.2.1 CFile的结构 211 11.2.1.1 CFile定义的枚举类型 211 11.2.1.2 CFile的其他一些成员变量 212 11.2.1.3 CFile的成员函数 212 11.2.2 CFile的部分实现 213 11.2.3 CFile的派生类 215 第12章 对话框和对话框类CDialog 217 12.1 模式和无模式对话框 217 12.1.1 模式对话框 217 12.1.2 无模式对话框 218 12.2 对话框的MFC实现 219 12.2.1 CDialog的设计和实现 219 12.2.1.1 CDialog的成员变量 219 12.2.1.2 CDialog的成员函数: 219 12.2.2 MFC模式对话框的实现 220 12.2.2.1 MFC对话框过程 220 12.2.2.2 模式对话框窗口过程 221 12.2.2.3 使用原对话框窗口过程作消息的缺省处理 225 12.2.2.4 Dialog命令消息和控制通知消息的处理 226 12.2.2.5 消息预处理和Dialog消息 228 12.2.2.6 模式对话框的消息循环 229 12.2.3 对话框的数据交换 233 12.2.3.1 数据交换的方法 233 12.2.3.2 CDataExchange 234 12.2.3.3 数据交换和验证函数 236 12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 MFC工具条和状态栏 248 13.1 Windows控制窗口 248 13.2 MFC的工具条和状态栏类 249 13.2.1 控制窗口的创建 251 13.2.1.1 PreCreateWindow 251 13.2.1.2 控制条的窗口创建 253 13.2.2 控制条的销毁 259 13.2.3 处理控制条的位置 259 13.2.3.1 计算控制条位置的过程和算法 259 13.2.3.2 CFrameWnd的虚拟函数RecalcLayout 260 13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 13.2.4.4 Tooltip 275 13.2.4.5 禁止和允许 279 13.2.4.6 显示或者隐藏工具栏和状态栏 285 13.2.5 泊位和漂浮 286 第14章 SOCKET类的设计和实现 288 14.1 WinSock基本知识 288 14.1.1 WinSock API 288 14.1.2 Socket的使用 290 14.2 MFC对WinSockt API的封装 291 14.2.1 CAsyncSocket 291 14.2.2 socket对象的创建和捆绑 292 14.2.3 异步网络事件的处理 296 14.3 CSocket 297 14.4 CSocketFile 299
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值