小师妹教我用MFC写了一个应用小程序...

摘要:前两天一个学妹问我,说她想做串口调试助手当做毕业设计,老师告诉她说用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

Qt是跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,它可以运行在Windows、MacOS、Linux这类嵌入式系统中,是完全面向对象的。

关于qt我在前面已经写过好几篇文章了,今天是学妹教我MFC,是第一篇文章。

她给我列了一个大纲,看着还挺详细的。

然后就是打开Visual Studio来新建项目,编写代码了。会不会不知道,反正废话不多说,开干!

一、创建基于对话框

程序的创建过程:

  • 选择“文件 | 新建 | 项目”菜单;
  • 在“新建项目”对话框中,选择“ MFC 应用程序 ”,输入工程名称,选择“确定”。

  • 选择“ 基于对话框”,即创建基于对话框的应用程序,选择“完成”。

  • 一直下一步

新建完成后如下图所示

二、对话框应用程序框架介绍

1、资源视图

用 AppWizard 创建基于对话框的应用程序框架(假定工程名为 Dialog )后,项目工作区上增加了一个“资源视图”选项卡。

或者,通过视图找到“资源视图”选项卡:

在 MFC中,与用户进行交互的对话框界面被认为是一种资源。展开“Dialog”,可以看到有一个ID为IDD_ DIALOG _DIALOG(中间部分(DIALOG)与项目名称相同)的资源,对应中间的对话框设计界面。不管在何时,只要双击对话框资源的ID,对话框设计界面就会显示在中间。

2、类视图

在类视图中,可以看到生成了3 个类:CAboutDlgCDialogAppCDialogDlg

  • CAboutDlg:对应生成的版本信息对话框。
  • CDialogApp:应用程序类,从 CWinApp 继承过来,封装了初始化、运行、终止该程序的代码。
  • CDialogDlg:对话框类,从CdialogEx继承过来的,在程序运行时看到的对话框就是它的一个具体对象。
  • DoDataExchange函数:该函数主要完成对话框数据的交换和校验。
  • OnInitDialog函数:相当于对对话框进行初始化处理。

3、设计界面和工具箱

1、模态对话框

1)当模态对话框显示时,程序会暂停执行,直到关闭这个模态对话框之后,才能执行程序中的其他任务。

1、在对画框中右键点击Button不放,直接拖拽到界面上,这是界面就会添加一个Button1这个按钮。

2、可以修改这个Button1按钮的属性,右键->属性。

3、修改Caption可以改变按钮的名称。

4、双击此按钮即可跳转到按钮处理函数:

void CMFC01Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
}

2)资源视图 -> Dialog -> 右击 -> 插入 Dialog:

3)修改对话框ID:

4)点击对话框模板 -> 右击 -> 添加类:

5)类视图中多了一个自定义类:

6)按钮处理函数创建对话框,以模态方式运行。
1、先在MFCXXDlg.cpp中添加刚刚先见的那个对话框的头文件。

2、在MFCXXDlg.cpp中的OnBnClickedButton1函数中写对应的操作。
实现模态对话框的创建需要调用CDialog类的成员函数CDialog::DoModel,该函数的功能就是创建并显示一个对话框:

//启动模拟对话框按钮
void CMFC01Dlg::OnBnClickedButton1()
{
	// 需要包含头文件 #include "DlgExec.h"
	CDlgExec dlg;
	dlg.DoModal();
}

之后重新生成解决方案,再调试,结果如下:

2、非模态对话框

当非模态对话框显示时,运行转而执行程序中的其他任务,而不用关闭这个对话框。

图形界面操作过程和模态对话框一样,只是,非模态对话框实现方式不一样,先创建(CDialog::Create)一次,然后再显示(CWnd::ShowWindow)。

//启动非模拟对话框按钮
void CMFC01Dlg::OnBnClickedButton2()
{
	//需要在MEC01Dlg.cpp开头包含头文件 #include "DlgShow.h"
	//弹出非模态对话框
	CDlgShow dlg;
	//创建
	dlg.Create(IDD_DIALOG_SHOW);
	//显示
	dlg.ShowWindow(SW_SHOWNORMAL);
}

注意:头文件不可少

之后重新生成解决方案,再调试,结果如下:

3、静态文本框CStatic

静态文本框是最简单的控件,它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。

静态文本框的重要属性有:

  • ID:所有静态文本框的缺省ID都是IDC_STATIC,静态ID,不响应任何消息(事件)
  • Caption:修改显示的内容
接口功能
CWnd::SetWindowText设置控件内容
CWnd::GetWindowText获取控件内容
CStatic::SetBitmap设置位图(后缀为bmp的图片)

关联控件变量:

由于XXX_STATIC静态ID是不能关联变量,故需把ID修改后,再关联变量:

实例:

  • 点击Button1按钮让哈哈变成呵呵
  • 点击Button2按钮获取文本中的内容 并且弹出

代码如下

//点击按钮让哈哈变成呵呵
void CMFC02Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	m_text.SetWindowTextW(TEXT("呵呵"));
}

//点击按钮获取文本中的内容 并且弹出
void CMFC02Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str;
	m_text.GetWindowTextW(str);
	MessageBox(str);
}

还可以在对话框添加一张图片

在主对话框类OnInitDialog()中,完成相应接口测试:

//设置静态控件窗口风格为位图居中显示
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()));

调试结果如下:

4、普通按钮CButton

按钮是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个按钮后就会执行相应的消息处理函数。

按钮的主要属性是Caption,来设置在按钮上显示的文本。

命令按钮处理的最多的消息是:BN_CLICKED。双击按钮即可跳转到处理函数。或者,通过按钮属性 -> 控制事件 -> 选择所需事件,添加处理函数:

常用接口:

接口功能
CWnd::SetWindowText设置控件内容
CWnd::GetWindowText获取控件内容
CWnd::EnableWindow设置控件是否变灰

关联控件变量:

在主对话框类OnInitDialog()中,完成相应接口测试:

//获取按钮的内容
	CString str;
	m_button.GetWindowText(str);
	MessageBox(str);

	//设置按钮内容
	m_button.SetWindowText(TEXT("^_^"));

	//设置按钮状态为灰色
	m_button.EnableWindow(FALSE);
	m_button.EnableWindow(TRUE);

实际效果如下:

好了,最后就是做了这么一个应用小程序,看着确实是入门级别的小程序,感觉还可以。听学妹说要想用MFC来写串口程序,还要下载MSComm控件,这玩意在我的电脑还不能运行。算了,MFC可能就学到这里了,我还是老老实实的用我的QT吧,毕业设计我可能也帮不上什么忙了!

  • 38
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果果小师弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值