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. CMOS图像传感器同时感知和处理光学图像

    CMOS图像传感器同时感知和处理光学图像 概述 近年来,机器视觉技术有了巨大的飞跃,现在已经成为各种智能系统的一个组成部分,包括自主车辆和机器人.通常,视觉信息由基于帧的摄像机捕获,转换成数字格式,然 ...

  2. cuDNN概述

    cuDNN概述 NVIDIACUDA深度神经网络库(cuDNN)是GPU加速的用于深度神经网络的原语库.cuDNN为标准例程提供了高度优化的实现,例如向前和向后卷积,池化,规范化和激活层. 全球的深度 ...

  3. 实用的jar包加密方案

    前言 jar包相信大家都很熟悉,是通过打包java工程而获得的产物,但是jar包是有一个致命的缺点的,那就是很容易被反编译,只需要使用jd-gui就可以很容易的获取到java源码. 如果你想要防止别人 ...

  4. Postman之newman的安装

    一.newman简介:newman是为Postman而生,专门用来运行Postman编写好的脚本:使用newman,你可以很方便的用命令行来执行postman collections. 二.newma ...

  5. 【Azure 应用服务】Azure Web App的服务(基于Windows 操作系统部署)在被安全漏洞扫描时发现了TCP timestamps漏洞

    问题背景 什么是TCP timestamps(TCP 时间戳)? The remote host implements TCP Timestamps, as defined by RFC1323 (h ...

  6. python取整函数 向上取整 向下取整 四舍五入

    向上取整 >>> import math >>> math.ceil(3.5) 4 >>> math.ceil(3.4) 4 >>&g ...

  7. WizTree——一个扫描快似Everything的硬盘空间分析工具

    虽然我平时用的主要是Linux,但是由于实际环境是win10,对于磁盘资源的控制,我主要是通过Windows自带的文件资源管理器来查看的,但是显然这个工具不够直观.于是,我也被安利过SpaceSnif ...

  8. UF_VEC 向量相关

    Open C UF_VEC2_addUF_VEC2_affine_combUF_VEC2_ask_perpendicularUF_VEC2_componentsUF_VEC2_convex_combU ...

  9. NX二次开发-向量乘矩阵的几何意义

    函数:UF_MTX3_vec_multiply_t() 或者UF_MTX3_vec_multiply().推荐使用UF_MTX3_vec_multiply_t() 函数说明:将向量按照矩阵进行变换:绝 ...

  10. 【SQLite】SQLite文件突然变大怎么办?瘦身办法

    使用VACUUM命令即可: VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件.这消除了空闲页,把表中的数据排列为连续的,另外会清理数 ...