简易入门MFC

2023-05-16

工作需要用到MFC,需要能快速上手,中间碰到不懂的简单的看了下源码,参考了些资料。

目标:做一个简单的计算器,代码就不考虑了,主要强调如何上手MFC,和简单了解MFC的框架。
1.如何创建一个MFC工程项目
创建MFC的过程如下:(visual studio 2012)
1>.新建->项目:选择MFC应用程序,名称这里用test(随意,和后面代码那里一致)。然后点确定。
2>.出现MFC生成向导:这里选择基于对话框,其他默认。
2.界面设计方式
2.1.拖拉控件及修改空间属性
1>.界面设计主要是在这个资源文件中修改。
2>.控件在工具箱中拖拽出来放到界面上。
3>.修改控件属性
单击控件后,可以在属性中修改控件的属性。
常用的属性
Caption 标题
ID 控件标识
2.2.修改控件布局
这个没查资料,感觉可以设置布局。
界面的左边和上方能控制水平和垂直方向上的自动对齐。
可以在设置好位置后,将控件移动对齐到这个方向的位置,后面拖动这个位置的坐标就可以进行整体对齐移动了。
3.控件的事件回调函数处理
双击控件,可自动跳转到点击控件的事件回调处理函数。
可以在跳转到的函数回调上编写处理代码:
void CtestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString str = NULL;
GetDlgItemText(IDC_EDIT1, str);
SetDlgItemText(IDC_EDIT1, str+_T("1"));
}
这里在界面上除自身的代码外比较常用的就是这些属性相关(设置和获取)的函数。
这部分可以通过搜索引擎或者MSDN解决。
4.粗略分析自动生成的代码
4.1.关于自动生成的几个类
这里可能涉及到框架的部分程序了,这里做简单的了解。
首先最简单的Dialog中间有这几个类:CAboutDlg,CtestApp,CtestDlg。
其中CAboutDlg类和CtestDlg类被放到了testDlg.cpp中实现。
1>.CAboutDlg
CAboutDlg是用于应用程序“关于”菜单项的 CAboutDlg 对话框。估计是这个关于的对话框。在.rc的资源中的dialog中的IDD_ABOUTBOX中可修改。。
这部分是CAboutDlg的代码,可以看出一个简单的对话框窗口:
1.继承CDialogEx类;
2.有自己的映射关系;
3.DoDataExchange函数;这个函数在MFC框架中的UpdateData会调用。
参见: https://baike.baidu.com/item/DoDataExchange/4417615?fr=aladdin
4.类中声明的IDD枚举???
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX };// 对话框数据
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
2>.CtestDlg
所以CtestDlg应该是主界面的代码。结构和上述类似。只是增加了几个消息回调函数。但中间有结果回调函数比较特殊。应该是和后面几个消息回调连着的,可能不需要给用户自定义,连名字都省略了= =
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
注:afx_msg 是个标识,来表示MFC的消息处理
OnQueryDragIcon从注释上意思:当用户拖动最小化窗口时系统调用此函数取得光标
OnPaint从注释上意思:来绘制该图标。对于使用文档/视图模型的 MFC 应用程序。在初始化后会向窗口发送WM_PAINT消息,然后框架自动回调。这部分的代码也是由框架封装好的CDialogEx::OnPaint(),可以跳转进去看看,用来绘制图形的。
OnSysCommand不详。。。
另外:BOOL CtestDlg::OnInitDialog()是初始化消息的回调函数。用来初始化窗口。
3>.CtestApp
CtestApp类在test.h/test.c中,继承了CWinApp,定义应用程序的类行为,且有唯一一个对象theApp,在一开始就会被构造。
这个类中的构造函数添加了支持重新启动管理器的flag。
另一个方法是初始化实例InitInstance。
这里需要提到MFC框架的入口和初始化过程:
theApp在一开始就被构造,初始化了一些变量,然后将当前应用指到本身。
MFC的入口在源代码的APPMODUL.CPP文件中的_tWinMain函数中。_tWinMain中调用了AfxWinMain函数。
AfxWinMain为一个MFC框架的 全局函数 。在这个函数中模仿了WIN32的创建一个应用的过程:
1.获得一个CWinThread和app的指针(CWinApp也是继承CWinThread的,通过宏可知这两个指针一样。)
2.通过APP指针初始化应用(InitApplication),初始化CWinThread指针的实例(InitInstance方法)。
InitApplication做框架的内部管理工作。
这里InitInstance方法就调用CtestApp重写的部分(这部分代码其实也是系统自动生成的)。这个函数完成了窗口CtestDlg创建,显示,并向窗口发送WM_PAINT消息的功能。
注:这里好像不同的写法(使用方式)中间的调用过程也不大一样。如果是前面那种方式在DoModal里就调用了DoDataExchange函数来加载资源??
3.运行theApp
4.2.关于函数回调部分的代码
前面说双击回调后,会自动跳转生成的代码。这里自动生成的部分主要有:
回调处理函数:
void CtestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
}
关系映射:
BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CtestDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CtestDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CtestDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CtestDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CtestDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, &CtestDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON7, &CtestDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON8, &CtestDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON9, &CtestDlg::OnBnClickedButton9)
ON_BN_CLICKED(IDC_BUTTON10, &CtestDlg::OnBnClickedButton10)
END_MESSAGE_MAP()
声明:
afx_msg void OnEnChangeEdit1();
调到宏里面看看原理:(截取了一段button的)
// User Button Notification Codes
#define ON_BN_CLICKED(id, memberFxn) \
ON_CONTROL(BN_CLICKED, id, memberFxn)
#define ON_BN_DOUBLECLICKED(id, memberFxn) \
ON_CONTROL(BN_DOUBLECLICKED, id, memberFxn)
#define ON_BN_SETFOCUS(id, memberFxn) \
ON_CONTROL(BN_SETFOCUS, id, memberFxn)
#define ON_BN_KILLFOCUS(id, memberFxn) \
ON_CONTROL(BN_KILLFOCUS, id, memberFxn)
定义了几种动作的宏(每种控件间会有差异),将控件标识和对应的动作类型和对应的响应回调函数连接起来。宏里面的结构如下,看上去像一个表的形式。
// for general controls
#define ON_CONTROL(wNotifyCode, id, memberFxn) \
{ WM_COMMAND, (WORD)wNotifyCode, (WORD)id, (WORD)id, AfxSigCmd_v, \
(static_cast< AFX_PMSG > (memberFxn)) },
5.其他注意事项
5.1.关于命名的问题
命名的规则:
5.2.MFC自定义的类型
第一次用MFC中,出现了一些类型,比如CString,可以在afx.h头文件中查看它的定义。另外使用MSDN可以查看。
另外:这里要注意字符集的问题。可以用_T("XXXX")来统一字符集。
5.3.窗口中定义的控件
拖进界面生成的控件的资源被,按照一定的组织格式放在了test.rc这个文件中。MFC框架中在CtestApp::InitInstance()里就加载这个.rc的文件的部分并进行了显示。
注*:这里的控件也可在窗口创建的回调函数中创建。只不过这里的方法不同。
5.4.关于一些辅助的宏
看到了随便加进来一下:
①. TRACE
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
追踪路径,先看TRACE的定义:
#define TRACE ATLTRACE
#define ATLTRACE ATL::CTraceFileAndLineInfo(__FILE__, __LINE__)
void __cdecl operator()(
_In_ DWORD_PTR dwCategory,
_In_ UINT nLevel,
_In_z_ const char *pszFmt,
...) const
{
va_list ptr; va_start(ptr, pszFmt);
ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
va_end(ptr);
}
再往下好像封装进去了,大概可以通过这个宏,可以把追踪信息文件,行数,必要的提示,警告等级之类的都显示下来。
TRACE宏只对Debug 版本的工程产生作用。
参考: https://blog.csdn.net/ghevinn/article/details/17550707
②.ASSERT
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是 异常处理 的一种高级形式。断言表示为一些 布尔表达式 ,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证, 因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
参考: https://baike.baidu.com/item/assert/10931289?fr=aladdin
看看MFC中的ASSERT。
#define ASSERT(f) DEBUG_ONLY((void) ((f) || !::AfxAssertFailedLine(THIS_FILE, __LINE__) || (AfxDebugBreak(), 0)))
#define DEBUG_ONLY(f) (f)
相当于DEBUG模式下,直接判断ASSERT中的表达式f是否满足条件。如果满足表达式满足,就会调用AfxAssertFailedLine,然后中断退出。
6.相关参考
VC++深入讲解
参考: https://blog.csdn.net/nodeman/article/details/43565921
7.总结
在大致看完之后,MFC其实就是Windows下的API进行进一步的封装。如果直接在.rc文件中设计,只需添加对应的回调函数再加处理即可。这样比较快。
另外一种是对MFC提供出来的框架的部分进行重写(根据自己需求),但大体上也是封装Windows的API的过程,这样会相对麻烦一些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简易入门MFC 的相关文章

  • curl断点续载

    curl断点续传 xff0c 下载过程中关闭控制台 xff0c 然后重新启动 xff0c 又会接着下载 include 34 stdafx h 34 include lt io h gt include 34 curl curl h 34
  • curl多线程下载实现

    其实libcurl自带一个应用 xff0c 很高大上 xff0c 但是作为范例参考怎么使用libcurl觉得不大适合 xff01 还是写一些helloworl的程序的 xff0c 一目了然 include 34 stdafx h 34 in
  • arduino实现tts

    淘宝上查了一下 xff0c 目前的几款tts模块貌似指令格式类似 Blink Turns on an LED on for one second then off for one second repeatedly This example
  • openwrt编译error: ext4_allocate_best_fit_partial: failed to allocate 13 blocks, out of space?

    编译openwrt时候报如下错误 xff1a Creating filesystem with parameters Size 50331648 Block size 4096 Blocks per group 32768 Inodes p
  • 在mac上创建鼠标双击可执行的shell脚本

    总是觉得mac权限管理好严格 xff0c 要创建向在window上执行bat那样的脚本需要如下操作 首先创建测试脚本 touch clickexe sh open e clickexe sh 在脚本中输入内容 echo 34 hello w
  • rm: cannot remove Permission denied 问题解决方法

    今天编译openwrt系统的时候 xff0c 碰到这样的问题 rm cannot remove xxx Permission denied 但是又不允许用root用户执行 xff0c 所以就要用root用户去修改权限 chmod 777 如
  • Arduino 舵机驱动板编程

    需要下载Adafruit的arduino库 xff0c 这个网上搜索一下很多 我的驱动板是16路基于I2C接口通信 xff0c 这个arduino库底层都做好了 xff0c 精度是12位 xff08 4096 xff09 设置非常简单 xf
  • 3d图形引擎结构

    其实3d引擎结构基本上都是类似的 xff0c 差别也只是细节的上的差别 xff0c 如jme引擎的结构如下 xff1a 首先是viewport xff0c 这个就像2d图层一样 xff0c 每个viewport开始渲染的时候都可以清除缓冲区
  • 树莓派开机启动frpc

    直接在 rc local里启动frpc失败 xff0c 原因是网络好像连接失败 所以写了个shell脚本 xff0c 通过sleep延时一下 xff0c 就启动成功了 首先建立startfrp sh bin bash cd home pi
  • esp32 arduino psram使用

    esp32 arduino固件是已经支持psram了的 xff0c 是模式2 xff0c 所以要使用heap caps malloc来分配 注意选择wrover modelus xff0c 其他的可能驱动不支持 示例代码 xff1a inc
  • 事件驱动框架(二)——状态机

    事件驱动框架 xff08 二 xff09 说明 本篇接上一篇事件驱动框架之后 xff0c 介绍状态机的原理相关的 xff0c 以及事件驱动框架下事件处理状态机的实现 因为代码大多还是参照QP源码 xff0c 所以仅供学习使用 有限状态机介绍
  • 小米10如何安装google play商店

    查了一下网上说可以安装gmail 小米商店就会自动安装google play的 xff0c 但是发现gmail在小米商店已经提示说 因为软件本身问题不能给安装 34 xff0c 查了一无果 xff0c 于是用之前华为安装google的apk
  • php 上传目录权限问题导致无法上传

    php除了有大小严格限制导致失败 xff0c 还有就是上传目录权限问题导致失败 xff0c 如果权限问题执行以下命令即可 sudo chown R www data www data Users George Desktop uploads
  • KeilC STM32添加.c .h文件的方法

    嵌入式初学者添加 c h文件是可能会出现 h头文件无法生效的问题 xff0c 在此将本人经历总结如下 xff0c 供大家参考 1 xff0c 把所需添加的文件 xff0c 放到这个文件夹下 项目名称 Core Src 2 xff0c 右击此
  • 传感器——ATGM332D 北斗定位模块

    NO 8 模型用GPS测速仪 xff08 已完成 xff09 xff08 更新第二版本 xff09 这个是用显示屏显示的 定位精度2 5m GPS模块VCC Arduino的5v GPS模块GND Arduino的GND GPS模块TXD
  • stm32f10--- 学习日志2021-07-10

    不知道标题是啥 xff0c 学到什么记录什么 寄存器占四个字节 偏移地址 xff1a 0x04 基地址 xff1a 0x4001 1000叫做GPIOC的基地址 APB2外设时钟使能寄存器 0x4002 1018 单片机认为它只是一个数值
  • 【unp】unix网络编程卷1-->环境搭建(ubuntu14.04)

    学习unp网络编程 xff0c 树上的例子均存在 include 34 unp h 34 xff0c 故需要对环境进行配置 1 到资源页下载unpv13e 2 解压并将unpv13e 移动到相应的文件夹下 3 编译 gt cd unpv13
  • 北醒激光雷达模组 资料汇总

    目录 1 文档说明1 1 北醒单点系列雷达激光模组相关资料1 2 北醒面阵系列雷达激光模组相关资料1 2 1 产品基本介绍1 2 2 Benewake 北醒 短距 TF LC02 2m资料整理1 2 3 Benewake 北醒 短距 TF
  • TFmini Plus在开源飞控PX4上的应用

    TFmini Plus在开源飞控PX4上的应用 PX4有着自己独特的优势 xff0c 受到广大爱好者的喜爱 TFmini Plus是北醒公司推出的性价比极高的激光雷达 xff0c 受到广大爱好者的追捧 本文介绍TFmini Plus和PX4
  • Benewake TFmini-S\TFmimi Plus\TFluna\TF02-Pro 串口版本雷达在STM32的例程

    目录 文档说明北醒串口标准通讯协议硬件接线Lidar通讯代码1 初始化USART1 2 开启USART1的空闲中断 3 USART2 IRQHandler增加中断判断4 中断处理函数 xff0c 用于接收雷达数据 协议处理注 xff1a 换

随机推荐

  • 使用CH341 I2C连接北醒TF系列I2C模式 Python例程

    目录 硬件接线 xff1a 源码结果输出 本文介绍了北醒单点系列雷达IIC模式下使用CH341芯片转接板读取雷达数据的例程 例程下载 xff1a 链接 https pan baidu com s 1KVJ fINxUgKZny2Gdi8T2
  • 蓝牙nrf51822程序的分析(一)

    蓝牙nrf51822程序的分析 一 最近继续用NRF51822开发一个东西 无奈之前没接触过蓝牙 连蓝牙串口模块也没有 所以对蓝牙的基础知识不够 xff0c 后面看了之后接着补充 花了2天时间把提供的NRF51822的程序大致看明白了 xf
  • 常用Arduino板介绍

    目录 NANO板介绍烧录说明 UNO板介绍烧录说明 Pro mini板介绍烧录说明 DUE板介绍烧录说明 NANO板介绍 概述 xff1a Arduino Nano是一款基于ATMega328P xff08 Arduino Nano 3 x
  • Modbus设备在Modbus scan上面的使用方法

    操作教程 参数 xff1a DeviceID xff1a 485从站 寄存器地址 xff1a 查询设备地址表 北醒雷达Dist在0x0000开始 读取寄存器长度 xff1a 雷达数据长度值 格式 xff1a MODBUS RTU 串口协议
  • Raspberry Pi Pico C/C++语言在Windows环境下开发环境搭建 Raspberry Pi Pico C/C++ SDK

    目录 前言Raspberry Pi Pico介绍需要支持的软件软件安装配置及注意事项ARM GCC compiler的安装CMake的安装Git 安装Visual Studio 2019的安装Visual Studio Code的配置Pyt
  • 【LoRa32U4II】介绍以及基于Arduino IDE编译环境搭建及测试

    目录 LoRa 模块LoRa32u4 II介绍LoRa32u4 II 资料下载LoRa32u4 II 规格介绍LoRa32u4 II 脚位说明 编译环境介绍电脑系统编译软件Arduino需求库 编译环境搭建及测试LoRa32u4 II 测试
  • 【Benewake(北醒) 】短距 TF-LC02 2m资料整理

    目录 1 TF LC02简要说明1 1 性能参数1 2产品图片及尺寸 2 运用2 1 在开源板Arduino上的运用2 2 在Python上的应用 1 TF LC02简要说明 1 1 性能参数 1 2产品图片及尺寸 2 运用 2 1 在开源
  • 【Arduino】Benewake(北醒) TF-LC02(TTL)基于Arduino 开发板运用说明

    目录 前言Benewake 北醒 TF LC02产品简要说明Arduino开发板介绍Benewake 北醒 TF LC02 接口及通讯协议说明接口定义串口协议说明通讯协议说明功能码说明 接线示意图例程说明配置软硬串口定义获取TOF数据的结构
  • 【Benewake(北醒) 】中距 TF02-i 40m工业版本CAN/485介绍以及资料整理

    目录 1 前言2 产品介绍3 产品快速测试3 1 产品规格书及使用说明书3 2 通用指令串口助手使用说明3 3 产品快速测试说明 4 基于开源硬件的运用整理4 1 在开源飞控上的运用 5 基于其他的运用整理5 1 在PLC上的运用说明5 2
  • 【ESP32 DEVKIT_V1】基于Arduino IDE环境搭建

    目录 一 前言二 板子介绍三 环境搭建1 Arduino IDE的安装2 在Arduino IDE上添加外包链接3 添加好外包链接后就可以下载对应的板子库文件 测试1 先把开发板接到电脑 xff0c 并在Arduino IDE上选择对应的开
  • 【ESP32 DEVKIT_V1】北醒TF系列雷达在ESP32 DEVKIT_V1开发板上的运用

    目录 前言一 硬件准备二 硬件接线说明串口接线示意图 xff1a I2C接先示意图 三 软件搭建及测试1 使用Arduino IDE编译教程2 使用vsCode 43 Arduino教程2 1 在vsCode上使用Arduino的环境搭建2
  • 【vsCode + Arduino】在Visual Studio Code编译Arduino项目

    目录 前言一 参考文档二 操作步骤2 1 安装Arduino IDE2 2 在vsCode里安装Arduino插件2 3 配置arduino的安装路径2 4 配置好后打开一个Arduino的项目文件夹进行相应的配置 三 目前已知问题 前言
  • 蓝牙:GATT,属性,特性,服务

    接着上一篇 通用属性配置文件 xff08 Generic Attribute Profile xff09 1 GATT简介 通用属性配置文件Generic Attribute Profile简称GATT GATT定义了属性类型并规定了如何使
  • RS232 RS422 RS485详细介绍

    1 RS 232 C RS 232 C是美国电子工业协会EIA xff08 Electronic Industry Association xff09 制定的一种串行物理接口标准 RS是英文 推荐标准 的缩写 xff0c 232为标识号 x
  • stm32串口使用以及串口中断接收不定长度字符串

    开始使用cubemx配置PA9 PA10分别为TX RX端 xff0c 在使能串口中断 之后其余值直接使用默认的就可以了 点击生成代码即可 span class token class name uint8 t span rx buff s
  • STM32-串口通信printf重定向

    前言 xff1a 平时我们进行c语言编程的时候会经常用到printf函数进行打印输出 xff0c 来调试代码 可是这个printf函数C库已经帮我们实现好了 xff0c 通常只需要直接调用即可 xff0c 但是如果在一个新的开发平台 xff
  • FMCW毫米波雷达原理

    Radar系列文章 传感器融合是将多个传感器采集的数据进行融合处理 xff0c 以更好感知周围环境 xff1b 这里首先介绍毫米波雷达的相关内容 xff0c 包括毫米波雷达基本介绍 xff0c 毫米波雷达数据处理方法 xff08 测距测速测
  • VMware虚拟机安装ubuntu16.04系统教程

    对于没有接触过Ubuntu系统的小伙伴来说 xff0c 直接在物理机上安装Ubuntu单系统或者windows Ubuntu双系统一件比较刺激的事情 xff0c 因为一不小心可能就会把电脑整崩溃 xff0c 或者出现各种问题 xff0c 所
  • c#实验五 文件与流

    实验五 文件与流 WPF还不太会 抄STZG的 xff0c 其他自己写的 一 实验目的 掌握文件类的使用 xff1b 掌握文件流的操作 xff1b 掌握二进制数据 文本数据的读写 xff1b 继续应用WPF技术进行界面编程 二 实验内容 要
  • 简易入门MFC

    工作需要用到MFC xff0c 需要能快速上手 xff0c 中间碰到不懂的简单的看了下源码 xff0c 参考了些资料 目标 xff1a 做一个简单的计算器 xff0c 代码就不考虑了 xff0c 主要强调如何上手MFC xff0c 和简单了