VC++自动生成的对话框类头文件中的enum {IDD= xxxx}解释
1 MFC中对话框类和对话框资源之间的联系
使用VC++ MFC做开发的时候,经常需要插入对话框资源,然后根据这个资源生成相应的对话框类文件。类文件和对话框资源之间的联系纽带就是对话框控件ID,与其他资源ID一样,也是一个整数而已,只不过VC++开发环境在resource.h文件中增加了一个宏定义来描述这个整数而已。下面是一个对话框类的头文件。
#pragma once// CTestDlg 对话框class CTestDlg : public CDialog
{DECLARE_DYNAMIC(CTestDlg)public:CTestDlg(CWnd* pParent = NULL); // 标准构造函数virtual ~CTestDlg();// 对话框数据enum { IDD = IDD_DIALOG1 };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()
};
其中的 IDD_DIALOG1就是对应的对话框资源的ID,其宏定义可以在resource.h文件中找到,如下所示:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by TestStaticMemberFunction.rc
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_TESTSTATICMEMBERFUNCTION_DIALOG 102
#define IDR_MAINFRAME 128
#define IDD_DIALOG1 129 // 在这里
#define IDC_BUTTON1 1000// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
当然,资源文件(.rc)里也必须使用这个IDD_DIALOG1对使用的对话框资源进行描述,如下所示:
/
//
// Dialog
//IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "关于 TestStaticMemberFunction"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGINICON IDR_MAINFRAME,IDC_STATIC,14,14,21,20LTEXT "TestStaticMemberFunction,1.0 版",IDC_STATIC,42,14,114,8,SS_NOPREFIXLTEXT "Copyright (C) 2014",IDC_STATIC,42,26,114,8DEFPUSHBUTTON "确定",IDOK,113,41,50,14,WS_GROUP
ENDIDD_TESTSTATICMEMBERFUNCTION_DIALOG DIALOGEX 0, 0, 395, 194
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "TestStaticMemberFunction"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGINPUSHBUTTON "Button1",IDC_BUTTON1,72,37,50,14
ENDIDD_DIALOG1 DIALOGEX 0, 0, 316, 182 // 在这里
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGINDEFPUSHBUTTON "确定",IDOK,205,161,50,14PUSHBUTTON "取消",IDCANCEL,259,161,50,14
END
我们知道,在Win32 API中创建一个对话框的函数中有一个必须的参数就是对话框资源ID,MFC是对Win32API的浅薄封装,当然也需要把这个资源ID。我们可以在对话框类的实现文件中看到这个资源ID被当作参数传递给了构造函数。如下所示:
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/): CDialog(CTestDlg::IDD, pParent) // 在这里
{}CTestDlg::~CTestDlg()
{
}
2 enum {IDD= xxxx} 用法的解释
//enum { IDD = IDD_DIALOG1 };static const int IDD = IDD_DIALOG1;
事实证明,这样做确实没有问题,程序编译运行完全一样。
那么这个enum的用法到底是什么含义呢?如此用法,IDD会是静态常量吗?
这样从enum的语法说起,enum的常用方式为 enum 类型名 { 枚举子名1=1, 枚举子名2, ... }; 此后就可以使用 类型名 声明变量了。如果把类型名去掉了,我们得到的是一个无名类型,这个类型也就无法使用,但是其中的枚举子由于具有独立的名字,所以仍然可以直接使用。枚举子的名字有个命名空间的问题,在C中,枚举子命名空间就是全局空间,而在C++中,除了专用的namespace关键字可以建立命名空间,类名本身也是一个命名空间,这样由于enum用到了对话框类的里面,所以其中枚举子的命名空间就是类名了。这样在类外部访问这个枚举子的时候就需要加类名,如 CTestDlg::IDD,当然如果在类的成员函数中进行访问,就没有必要加类名了。
通过分析可见,单从CTestDlg::IDD这个表达式,不能断定IDD到底是CTestDlg类的静态成员变量,因为它还可能是位于CTestDlg这个名字空间里面的枚举子常量,或者其他。
MFC之所以使用枚举子而不是静态成员变量,也许基于如下考虑:(1)语法更简洁,(2)编译器在编译时直接计算出枚举子的值,从而成了字面常量,效率更高。
可是微乳也许没想到,这种用法也给初学者造成了很多困惑。
3 学会在自己的项目中使用enum
其实enum这种用法在其他项目中也很常见,很多是为了替代宏定义,例如如下宏定义
#define MONDAY 1
#define TUESDAY 2
#define WEDNESDAY 3
#define THURSDAY 4
#define FRIDAY 5
#define SATURDAY 6
#define SUNDAY 7
完全可以使用如下枚举子来代替
enum
{MODAY = 1,TUESDAY = 2,WEDNESDAY = 3,THURSDAY = 4,FRIDAY = 5,SATURDAY = 6,SUNDAY = 7
}
大家都知道宏定义会潜在很多问题,而且对调试也不方便,所以多多使用enum吧!
VC++自动生成的对话框类头文件中的enum {IDD= xxxx}解释相关推荐
- 使用maven根据JSON文件自动生成Java POJO类(Java Bean)源文件
根据JSON文件自动生成Java POJO类(Java Bean)源文件 本文介绍使用程序jsonschema2pojo来自动生成Java的POJO类源文件,本文主要使用maven,其他构建工具请参考 ...
- VC自动生成软件版本号
VC自动生成软件版本号 flyfish 目的: 软件的版本有主版本号.子版本号.修正版本号.编译版本号 其中编译版本号与SVN服务器的版本号(Revision)自动同步. 环境 需要在本机安装Tort ...
- 小d课堂mysql_小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类...
笔记 6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类 简介:实战使用IDE根据Mysql自动生成java pojo实体类 1.IDEA连接数据库 菜单View→Tool Window ...
- Mybatis自动生成的Example类的使用与解析
在上篇文章我有讲到mybatis如何自动生成我们所需的dao代码,今天我们把上篇文章遗留的问题给大家讲解一下.个人拙见,欢迎补充. 上篇文章中我有说过利用Mybatis自动生成的Example类可以满 ...
- CVAVR生成的典型USART收发的接口程序(MEGA16只有一个串口所以不用区分是哪个串口的中断相量编号,而MEGA2560多个串口,在头文件中就区分开多个串口的中断相量编号,参考各自头文件)
一般教科书上提供的UART收发的程序往往是一段采用轮循(Polling)方式完成收发的简单代码.但对于高速的AVR来讲,采用这种方式大大降低了MUC的效率.在使用AVR时,应根据芯片本身的特点(片内大 ...
- C语言如何使用其他文件定义的结构体?(C++报错:无法转换到不完整的类【需在头文件中定义结构体??】)
文章目录 20210725 但是,我在使用的时候报错提示:无法转换到不完整的类?? 20210726 这样? 调用时直接加个extern就好,头文件管都不用管? 20210725 但是,我在使用的时候 ...
- 将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中
将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中 写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由 ...
- rf中resourceid_解决VC++ MFC程序resource.h头文件中ID重复问题
解决VC++ MFC程序resource.h头文件中ID重复问题 2018-12-07 一般MFC开发的时候,如果有些资源是从其他工程中移植到本工程的, 而在资源移植的时候都要将对应的资源ID复制到本 ...
- Effective Objective-C 2.0 — 第二条:类的头文件中尽量少引入其他头文件
第二条:类的头文件中尽量少引入其他头文件 使用向前声明(forward declaring) @class EOCEmployer 1, 将引入头文件的实际尽量延后,只在确有需要时才引入,这样就可以减 ...
最新文章
- node编写定时任务,for循环只执行一遍的解决办法
- .NET重构—单元测试的代码重构
- mysql索引列是锁表还是锁行_[转]关于MYSQL Innodb 锁行还是锁表
- 如何通过putty软件远程登录并且控制linux平台
- Go语言爬虫项目将结果写入MySql数据库
- CP-ABE公式推导笔记
- E/MediaPlayer: Should have subtitle controller already set
- 安装教程 | 在谷歌安装印象笔记插件(实用,在谷歌浏览器添加印象笔记插件,整理遇到bug,收藏解决bug的文章)
- Apache HTTP Server 下载,安装,配置,启动手把手教你
- 开发转测试? Yes or No
- 有码变高清!一秒还原马赛克
- 【vue+HT+flyTo】HT图扑软件中的flyTo应用
- html pre 转义,html转义-HTML转义字的转换问题
- px4原生源码学习-(1)
- 对话知道创宇丨如何守住内容安全生命线?
- python简易英文字典_Python爬虫:自制简易词典
- 基于遗传算法优化的BP神经网络算法
- 【考生说】持之以恒才是胜利的推动器、一周时间通过C认证的同学怎么说
- 简单递归——整数划分
- 微信小程序:云开发·初探
热门文章
- 电信、网通南北网络互通互联解决方案
- MyBatis与Spring整合
- 从mysql中日志表查截至时间最后一条记录
- nginx各种代理配置
- Cause: java.sql.SQLSyntaxErrorException: Unknown table ‘argue_backend‘ in field list 使用Mybatis报错
- 数字人民币APP更新后 打不开/闪退 的解决方法
- 白老大的身份鸿蒙之始,冒险王卫斯理白老大真实身份大揭秘 白老大是好人还是坏人?...
- java 区间 判断_java判断多个区间是否有重合
- Beautiful Soup 之 select详解
- 20款 密码破解工具