MFC:微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++ 开发工具发布。作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。

本次主要以Windows下Visual Studio 2019环境下如何搭建MFC应用开发环境,创建MFC项目以及实例程序来对C++ MFC应用程序开发来做一个归纳整理。

一、搭建开发环境

由于Visual Studio 2019在导入.NET 桌面程序开发工具和依赖的时候默认没有勾选MFC应用程序开发所需的“适用于最新v142 生成工具的C++ MFC(包括用于开发MFC应用程序的标头和库,包含多字节字符集)”,所以在新建项目时无法创建MFC应用程序。如下:

在勾选了“适用于最新v142 生成工具的C++ MFC”之后,重新启动Visual Studio 2019;满足MFC开发的条件,便可新建MFC 应用程序。如下:

至此,Windows下基于Visual Studio 2019的C++ MFC应用开发所需的环境基本配置完毕。

二、创建MFC程序

输入项目名称、选择项目存放位置,点击“确定”按钮。出现“MFC 应用程序 应用程序类型选项”对话框,选择“基于对话框”应用程序类型,这样,一个简单的MFC 对话框应用程序开发项目就已经建好。

三、MFC编程实例

(1)在窗体添加控件

右键点击窗体,选择添加变量,如下:

比如添加一个按钮(Button):

(2)修改属性以及添加对应函数

在添加完一个控件(按钮)之后,右键点击按钮选择属性,便可以编辑它的属性;双击按钮可以自动生成按钮的点击时间处理函数(没有定义按钮点击事件处理函数之前)。如下:

(3)程序文件说明

  1)头文件***Dlg.h (***指项目名,下同)

  主要定义和声明了对话框ID和主要的函数。

#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MULTITHREAD_DIALOG };
#endif

public:
    afx_msg void OnBnClickedButtonS();
    afx_msg void OnBnClickedButtonM();
    afx_msg void OnBnClickedButton3();
  };

  2)源文件***Dlg.cpp

  主要实现了头文件中定义的函数,以及控件对应的事假处理函数。

void CMultiThreadDlg::OnBnClickedButtonM()
{
// TODO: 在此添加控件通知处理程序代码
//DWORD startTime = GetTickCount();//计时开始 GetDlgItem(IDC_BUTTON_S)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_M)->EnableWindow(FALSE); CDC* dc = GetDC();
CRect rt;
GetClientRect(rt);
dc->FillSolidRect(0, 0, rt.Width(), rt.Height() - 70, RGB(240, 240, 240));//刷新背景
dc->TextOut(97, 290, TEXT("Thread 1"));
dc->TextOut(277, 290, TEXT("Thread 2"));
dc->TextOut(457, 290, TEXT("Thread 3")); //初始化线程的参数
Info[0].hWnd = Info[1].hWnd = Info[2].hWnd = GetSafeHwnd();
Info[0].nOffset = 10; Info[1].nOffset = 190; Info[2].nOffset = 370;
Info[0].clrRGB = RGB(255, 0, 0); Info[1].clrRGB = RGB(0, 255, 0); Info[2].clrRGB = RGB(0, 0, 255);
//创建线程
for (int i = 0; i < 3; i++)
{
hThead[i] = CreateThread(NULL, 0, ThreadProc, &Info[i], 0, &dwThreadID[i]);
}
ReleaseDC(dc); //DWORD endTime = GetTickCount();//计时结束
//CString sTime;
//sTime.Format(_T("The run time is: %d 毫秒"), endTime - startTime);
//MessageBox(sTime); //使能按钮
GetDlgItem(IDC_BUTTON_S)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_M)->EnableWindow(TRUE);
} void CMultiThreadDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CRect rectDlg;
GetClientRect(rectDlg); // 得到客户区的位置和大小
//GetWindowRect(rectDlg);//获得窗体在屏幕上的位置大小
ScreenToClient(rectDlg); CRect rectS, rectM;
GetDlgItem(IDC_BUTTON_S)->GetWindowRect(&rectS);//获取控件相对于屏幕的位置
ScreenToClient(rectS);//转化为对话框上的相对位置
GetDlgItem(IDC_BUTTON_M)->GetWindowRect(&rectM);//获取控件相对于屏幕的位置
ScreenToClient(rectM);//转化为对话框上的相对位置
}

  3)资源文件***.rc下的Dialog文件夹下的IDD_***_DIALOG,即对话框(关掉对话框后双击这个文件就可以重新打开了)。

(4)运行效果

最后,整个项目我已经打包上传至个人gitlab:https://gitlab.com/JC_peng/mfc-demo;需要的自行下载。

C++ MFC应用程序开发实例的更多相关文章

  1. MFC Windows程序开发究竟是什么?

    MFC Windows程序开发究竟是什么? MFC是一个Application Framework.他是一个完整的程序模型. 什么是MFC?MFC是微软公司出品一个Application Framew ...

  2. Servlet程序开发--实例操作:MVC设计模式应用

    以前做过一个登录程序,是用JSP+JavaBean完成的,最大的问题,JSP文件内容太多了. 1. VO 2. DBC 3. DAO 3.1 impl 3.2 proxy 4. Factory 5. ...

  3. MFC应用程序编写实例—完整版(原创)

    前段时间,将近花了一周至两周上班和上班后的闲余时间,做了一个用于调试和测试工作项目的应用软件,下面将实现软件的重要步骤及主要功能讲解一遍,方便日后查阅. 程序开始后,提示登录框,输入用户名,密码后,登 ...

  4. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)

    如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...

  5. Unity游戏设计与实现 南梦宫一线程序员的开发实例

    图灵程序设计丛书 Unity游戏设计与实现:南梦宫一线程序员的开发实例(修订版)     加藤政树 (作者) 罗水东 (译者)  c# 游戏 unity   <内容提要>本书的作者是日本知 ...

  6. 第六章 “我要点爆”微信小程序云开发实例之爆文详情页制作

    爆文详情页制作 从首页中数据列表打开相应详情页面的方法: 给数据列表中每个数据项加一个点击事件,同时将当前数据项的id暂时记录在本地,然后跳转到详情页面detail goopen: function ...

  7. MFC应用程序框架入门(转)

    1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...

  8. 推荐几本WinCE 6程序开发的书

    因为学校期中考试和课程设计的原因,winCE6的项目开发耽误了一个多月的时间,现在学校没什么事情了,公司这边杂事也差不多办完了,可以专心的搞开发了,同时这也成了我的毕业设计,我不得不上心喽. 今天在卓 ...

  9. 第3章 MFC框架程序剖析

    参考: https://blog.csdn.net/u014162133/article/details/46573873 1. 2.MFC简介:MFC(Microsoft Foundation Cl ...

随机推荐

  1. ELK技术栈之-Logstash详解

    ELK技术栈之-Logstash详解   前言 在第九章节中,我们已经安装好Logstash组件了,并且启动实例测试它的数据输入和输出,但是用的是最简单的控制台标准输入和标准输出,那这节我们就来深入的 ...

  2. (最新)VS2015安装以及卸载过程——踩坑实录

    前言 Visual Studio (简称VS)是微软公司旗下最重要的软件集成开发工具产品.是目前最流行的 Windows 平台应用程序开发环境,也是无数人学习编程的入门软件之一.Visual Stud ...

  3. Django(59)验证和授权

    验证和授权概述   Django有一个内置的授权系统.他用来处理用户.分组.权限以及基于cookie的会话系统.Django的授权系统包括验证和授权两个部分.验证是验证这个用户是否是他声称的人(比如用 ...

  4. go 技巧: 实现一个无限 buffer 的 channel

    前言 总所周知,go 里面只有两种 channel,一种是 unbuffered channel, 其声明方式为 ch := make(chan interface{}) 另一种是 buffered ...

  5. Netty 框架学习 —— 传输

    概述 流经网络的数据总是具有相同的类型:字节,这些字节如何传输主要取决于我们所说的网络传输.用户并不关心传输的细节,只在乎字节是否被可靠地发送和接收 如果使用 Java 网络编程,你会发现,某些时候当 ...

  6. 【工具解析】瑞士军刀bettercap2.X_解析_第二期_内网钓鱼(嗅探)工具编写

    /文章作者:Kali_MG1937 CNBLOG博客:ALDYS4 QQ:3496925334/ 第一期: https://www.cnblogs.com/aldys4/p/14877783.html ...

  7. 【NX二次开发】不健全的双击按钮。

    为什么说不健全,是因为 双击按钮时会先运行单击事件,这个后面再解决.但是模仿某公司的图层操作工具是没有问题了,因为这个工具运行双击事件时本来就需要运行单击事件,不仔细看容易被唬住. 图层操作工具(双击 ...

  8. java并发编程JUC第十篇:CyclicBarrier线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  9. 教你用python搭建一个「生活常识解答」机器人

    今天教大家如何用Python爬虫去搭建一个「生活常识解答」机器人. 思路:这个机器人主要是依托于"阿里达摩院发布的语言模型PLUG",通过爬虫的方式,发送post请求(提问),然后 ...

  10. 详解Redis主从复制原理

    文章首发于公众号 "蘑菇睡不着" 前言 Redis 的主从复制和 MySQL 差不多,主要起着 数据备份,读写分离等作用.所以说主从复制对 Redis 来说非常重要,而无论是面试还 ...