电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
零基础教你使用MFC写一个应用小程序
分 享
扫描二维码分享
零基础教你使用MFC写一个应用小程序
MFC
Qt
果果小师弟
关注
发布时间: 2021-11-30
丨
阅读: 746
**摘要**:前两天一个学妹问我,说她想做串口调试助手当做毕业设计,老师告诉她说用MFC去做,还给了他相关的代码。问我知道MFC吗?(我只知道KFC)然后我跟她说你老师为啥要让你用MFC,你学过C++,直接用QT不可以吗?我这里有关于QT的相关代码,你直接拿过去改一改,美化一下,就可以当做毕设了。 然后过了两天,她又告诉我,说她老师不太了解QT,只用过MFC。确实,有一些年纪比较大的老师可能在工作时用的就是MFC,QT毕竟是最近几年才兴起的技术(零几年之后)。 # MFC是啥? MFC(微软基础类库)是专门为windows设计的一个用于开发图形用户界面的类库。MFC使用了面向对象的方法包装了Win32的API,正因如此,这些API有时是C++,有时是C,甚至是C和C++的混合体。使用的编辑器就是`Visual Studio`。 ![ Visual Studio 2017](https://img-blog.csdnimg.cn/054988aa4cb646d2a0b6862b206f356b.png) Qt是跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,它可以运行在Windows、MacOS、Linux这类嵌入式系统中,是完全面向对象的。 关于qt我在前面已经写过好几篇文章了,今天是学妹教我MFC,是第一篇文章。 她给我列了一个大纲,看着还挺详细的。 ![](https://img-blog.csdnimg.cn/20201224125518718.png) 然后就是打开Visual Studio来新建项目,编写代码了。会不会不知道,反正废话不多说,开干! # 一、创建基于对话框 程序的创建过程: * 选择“文件 | 新建 | 项目”菜单; * 在“新建项目”对话框中,选择“ MFC 应用程序 ”,输入工程名称,选择“确定”。 ![ ](https://img-blog.csdnimg.cn/20201224125958530.png) * 选择“ 基于对话框”,即创建基于对话框的应用程序,选择“完成”。 ![ ](https://img-blog.csdnimg.cn/20201224130039841.png) * 一直下一步 ![ ](https://img-blog.csdnimg.cn/20201224130051139.png) ![ ](https://img-blog.csdnimg.cn/20201224130100872.png) ![ ](https://img-blog.csdnimg.cn/20201224130111663.png) 新建完成后如下图所示 ![ ](https://img-blog.csdnimg.cn/20201224130440101.png) # 二、对话框应用程序框架介绍 ## 1、资源视图 用 AppWizard 创建基于对话框的应用程序框架(假定工程名为 Dialog )后,项目工作区上增加了一个“资源视图”选项卡。 ![ ](https://img-blog.csdnimg.cn/2020122413061516.png) 或者,通过视图找到“==资源视图==”选项卡: ![ ](https://img-blog.csdnimg.cn/2020122413071650.png) 在 MFC中,与用户进行交互的对话框界面被认为是一种资源。展开“Dialog”,可以看到有一个ID为IDD_ DIALOG _DIALOG(中间部分(DIALOG)与项目名称相同)的资源,对应中间的对话框设计界面。不管在何时,只要双击对话框资源的ID,对话框设计界面就会显示在中间。 ![ ](https://img-blog.csdnimg.cn/20201224130813800.png) ## 2、类视图 在类视图中,可以看到生成了3 个类:`CAboutDlg`、`CDialogApp`和`CDialogDlg`。 ![ ](https://img-blog.csdnimg.cn/2020122413094886.png) * CAboutDlg:对应生成的版本信息对话框。 * CDialogApp:应用程序类,从 CWinApp 继承过来,封装了初始化、运行、终止该程序的代码。 * CDialogDlg:对话框类,从CdialogEx继承过来的,在程序运行时看到的对话框就是它的一个具体对象。 * DoDataExchange函数:该函数主要完成对话框数据的交换和校验。 * OnInitDialog函数:相当于对对话框进行初始化处理。 ## 3、设计界面和工具箱 ![ ](https://img-blog.csdnimg.cn/20201224131122328.png#pic_center) ### 1、模态对话框 1)当模态对话框显示时,程序会暂停执行,直到关闭这个模态对话框之后,才能执行程序中的其他任务。 1、在对画框中右键点击`Button`不放,直接拖拽到界面上,这是界面就会添加一个`Button1`这个按钮。 ![ ](https://img-blog.csdnimg.cn/20201224131354450.png) 2、可以修改这个`Button1`按钮的属性,右键->属性。 ![ ](https://img-blog.csdnimg.cn/20201224131414855.png) 3、修改`Caption`可以改变按钮的名称。 ![ ](https://img-blog.csdnimg.cn/20201224131524924.png) 4、双击此按钮即可跳转到按钮处理函数: ![ ](https://img-blog.csdnimg.cn/20201224131952447.png) ```c void CMFC01Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 } ``` 2)资源视图 -> Dialog -> 右击 -> 插入 Dialog: ![ ](https://img-blog.csdnimg.cn/20201224132119411.png) ![ ](https://img-blog.csdnimg.cn/20201224132215536.png) 3)修改对话框ID: ![ ](https://img-blog.csdnimg.cn/20201224132536890.png) 4)点击对话框模板 -> 右击 -> 添加类: ![ ](https://img-blog.csdnimg.cn/20201224132614539.png) ![ ](https://img-blog.csdnimg.cn/20201224132726579.png) 5)类视图中多了一个自定义类: ![ ](https://img-blog.csdnimg.cn/20201224132834378.png) 6)按钮处理函数创建对话框,以模态方式运行。 1、先在MFCXXDlg.cpp中添加刚刚先见的那个对话框的头文件。 ![ ](https://img-blog.csdnimg.cn/20201224133048720.png) 2、在MFCXXDlg.cpp中的OnBnClickedButton1函数中写对应的操作。 实现模态对话框的创建需要调用CDialog类的成员函数==CDialog::DoModel==,该函数的功能就是创建并显示一个对话框: ![ ](https://img-blog.csdnimg.cn/20201224133623467.png#pic_center =380x150) ```c //启动模拟对话框按钮 void CMFC01Dlg::OnBnClickedButton1() { // 需要包含头文件 #include "DlgExec.h" CDlgExec dlg; dlg.DoModal(); } ``` 之后重新生成解决方案,再调试,结果如下: ![ ](https://img-blog.csdnimg.cn/20201224133955385.gif) ### 2、非模态对话框 当非模态对话框显示时,运行转而执行程序中的其他任务,而不用关闭这个对话框。 图形界面操作过程和模态对话框一样,只是,非模态对话框实现方式不一样,先创建(CDialog::Create)一次,然后再显示(CWnd::ShowWindow)。 ![ ](https://img-blog.csdnimg.cn/20201224141029867.png) ```c //启动非模拟对话框按钮 void CMFC01Dlg::OnBnClickedButton2() { //需要在MEC01Dlg.cpp开头包含头文件 #include "DlgShow.h" //弹出非模态对话框 CDlgShow dlg; //创建 dlg.Create(IDD_DIALOG_SHOW); //显示 dlg.ShowWindow(SW_SHOWNORMAL); } ``` 注意:头文件不可少 ![ ](https://img-blog.csdnimg.cn/20201224141124924.png) 之后重新生成解决方案,再调试,结果如下: ![ ](https://img-blog.csdnimg.cn/20201224142033294.gif) ### 3、静态文本框CStatic 静态文本框是最简单的控件,它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。 静态文本框的重要属性有: * ID:所有静态文本框的缺省ID都是IDC_STATIC,静态ID,不响应任何消息(事件) * Caption:修改显示的内容 |接口| 功能 | |--|--| |CWnd::SetWindowText | 设置控件内容 | |CWnd::GetWindowText |获取控件内容 | |CStatic::SetBitmap |设置位图(后缀为bmp的图片) | ![ ](https://img-blog.csdnimg.cn/20201224151130874.png) 关联控件变量: 由于XXX_STATIC静态ID是不能关联变量,故需把ID修改后,再关联变量: ![ ](https://img-blog.csdnimg.cn/20201224151230583.png) ![ ](https://img-blog.csdnimg.cn/20201224151454594.png) ![ ](https://img-blog.csdnimg.cn/20201224151648218.png) 实例: * 点击`Button1`按钮让哈哈变成呵呵 * 点击`Button2`按钮获取文本中的内容 并且弹出 代码如下 ```c //点击按钮让哈哈变成呵呵 void CMFC02Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 m_text.SetWindowTextW(TEXT("呵呵")); } //点击按钮获取文本中的内容 并且弹出 void CMFC02Dlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CString str; m_text.GetWindowTextW(str); MessageBox(str); } ``` 还可以在对话框添加一张图片 ![ ](https://img-blog.csdnimg.cn/20201224153314450.png) ![ ](https://img-blog.csdnimg.cn/20201224153732188.png) 在主对话框类`OnInitDialog()`中,完成相应接口测试: ```c //设置静态控件窗口风格为位图居中显示 m_pic.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE); //通过路径获取bitmap句柄 #define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION) //宽高设置应该按照控件的大小设置 CRect rect; m_pic.GetWindowRect(rect); //静态控件设置bitmap m_pic.SetBitmap(HBMP(TEXT("./ly.bmp"), rect.Width(),rect.Height())); ``` ![ ](https://img-blog.csdnimg.cn/2020122415483010.png) 调试结果如下: ![ ](https://img-blog.csdnimg.cn/20201224154638238.png) ### 4、普通按钮CButton 按钮是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个按钮后就会执行相应的消息处理函数。 **按钮的主要属性是Caption,来设置在按钮上显示的文本。** 命令按钮处理的最多的消息是:BN_CLICKED。双击按钮即可跳转到处理函数。或者,通过按钮属性 -> 控制事件 -> 选择所需事件,添加处理函数: ![ ](https://img-blog.csdnimg.cn/20201224180254160.png) 常用接口: |接口 | 功能 | |--|--| | CWnd::SetWindowText |设置控件内容 | |CWnd::GetWindowText|获取控件内容| |CWnd::EnableWindow|设置控件是否变灰| 关联控件变量: ![ ](https://img-blog.csdnimg.cn/20201224180542788.png) 在主对话框类`OnInitDialog()`中,完成相应接口测试: ![ ](https://img-blog.csdnimg.cn/20201224181610491.png) ```c //获取按钮的内容 CString str; m_button.GetWindowText(str); MessageBox(str); //设置按钮内容 m_button.SetWindowText(TEXT("^_^")); //设置按钮状态为灰色 m_button.EnableWindow(FALSE); m_button.EnableWindow(TRUE); ``` 实际效果如下: ![ ](https://img-blog.csdnimg.cn/20201224181532815.gif) 好了,最后就是做了这么一个应用小程序,看着确实是入门级别的小程序,感觉还可以。听学妹说要想用MFC来写小程序,还要下载MSComm控件,这玩意在我的电脑还不能运行,算了,MFC可能就学到这里了,我还是老老实实的用我的QT吧,毕业设计我可能也帮不上什么忙了!
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
果果小师弟
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交