智果芯
服务于百万大学生和电子工程师!

零基础教你用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吧,毕业设计我可能也帮不上什么忙了!

赞(1) 打赏
未经允许不得转载:智果芯 » 零基础教你用MFC写一个应用小程序

评论 16

  1. #0

    Very energetic article, I enjoyed that a lot. Will there be
    a part 2?

    Also visit my web blog … tracfone special coupon 2022

    匿名1年前 (2022-12-01)回复
  2. #0

    Thankfulness to my father who shared with me on the topic of this
    weblog, this website is truly awesome.

    Look into my homepage – coupon

    匿名1年前 (2022-11-29)回复
  3. #0

    Aute mi ut suspendisse velit leo, vel risus ac. Amet dui dignissim fermentum malesuada auctor volutpat, vestibulum ipsum nulla. Gregory Sussex

    passwords2年前 (2022-09-07)回复
  4. #0

    I think this is a real great article. Really looking forward to read more. Keep writing. Cliff Highberger

  5. #0

    Its not my first time to go to see this site, i am browsing this web page dailly and obtain pleasant information from here daily. Blake Steakley

  6. #0

    Rattling nice style and fantastic written content , practically nothing else we require : D. Huey Hulsman

    freespin2年前 (2022-09-06)回复
  7. #0

    I got what you mean,saved to favorites, very decent web site. Wilton Silton

    hidden cam2年前 (2022-09-04)回复
  8. #0

    Pretty! This was an extremely wonderful article. Thank you for providing this info. Sammie Inmon

    freespin2年前 (2022-09-02)回复
  9. #0

    Perfect work you have done, this web site is really cool with great information. Austin Swancey

    freespin2年前 (2022-08-28)回复
  10. #0

    Hey, thanks for the article post. Really looking forward to read more. Keep writing. Lanny Butkovich

    liseli2年前 (2022-08-28)回复
  11. #0

    We came across a cool web page that you just may appreciate. Take a search should you want. Marcel Cuervo

    porno2年前 (2022-08-23)回复
  12. #0

    No matter if some one searches for his vital thing, therefore he/she needs to be available that in detail, thus that thing is maintained over here. Hoyt Vitolo

    bahis oyna2年前 (2022-08-23)回复
  13. #0

    Way cool! Some extremely valid points! I appreciate you penning this post and also the rest of the site is extremely good. Elijah Voytek

    bahis2年前 (2022-08-20)回复
  14. #0

    No pressure. Just write a wonderful, witty comment on a fantastic site to a guy who just threw down the definitive guide to commenting. I got this. Trinidad Concilio

    erotik2年前 (2022-08-20)回复
  15. #0

    If you would like to get a great deal from this post then you have to apply these strategies to your won webpage. Gilbertine Griffith Vescuso

    bahis oyna2年前 (2022-08-20)回复
  16. #0

    Hi mates, nice piece of writing and good urging commented here, I am really enjoying by these. Sonny Enis

    freespin2年前 (2022-08-19)回复

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏