enum { IDD = IDD_DIALOG1 }问题

wumin940590725 2014-01-10 11:09:46
enum { IDD = IDD_DIALOG1 };这个为什么要这么写?我直接用UNIT IDD=IDD_DIALOG1不就好了嘛?枚举有什么好处吗?在resource.h中也只是将#define IDD_DIALOG1 196.
希望有人能解惑,谢谢
...全文
725 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumin940590725 2014-01-18
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
找到出处了。 “Thinking in C++, 2nd , 8. constants” 这个叫 enum hack 就是 解决 static const 的 问题。
谢谢
schlafenhamster 2014-01-17
  • 打赏
  • 举报
回复
找到出处了。 “Thinking in C++, 2nd , 8. constants” 这个叫 enum hack 就是 解决 static const 的 问题。
schlafenhamster 2014-01-17
  • 打赏
  • 举报
回复
这与 C++ 的 常数 表示 有关, 早期 的MFC 是 使用 enum { IDD = IDD_DIALOG1 }; 来 表示 常数 即 const (-ant), 那时 使用 const IDD = IDD_DIALOG1 会有问题。
wumin940590725 2014-01-11
  • 打赏
  • 举报
回复
引用 11 楼 VisualEleven 的回复:
#define IDD_SMARTPOINTER_DIALOG 102 #define IDS_DISPLAYCHANGEHINT 102 #define IDD_SMARTPOINTER 102 创建对话框需要资源ID这个我知道,但是如上,都是102难道不会出错吗? 我自定义消息的时候如果wm_user+2在一个类中,我如果在另外一个类中整数还是用2,那么就会出错。而上面是微软自定义的,却不会出错,很奇怪。我本来以为是默认枚举的问题,现在貌似好像还是不对。 create中还是没有说明,问题有点怪,见谅 Call Create to create a modeless dialog box using a dialog-box template from a resource. 复制 virtual BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); virtual BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
yifuzhiming 2014-01-11
  • 打赏
  • 举报
回复
可能是MFC框架的设计需要这样做
xiaohuh421 2014-01-11
  • 打赏
  • 举报
回复
这是为了好写对话框的架构. 因为不同的对话框可以使用相同的类, 不同的对话框资源. 而不同的资源又要是相同的代码. enum { IDD = IDD_DIALOG1 }这个就能起作用了. 只要基类代码中使用IDD就能得到对话框资源的ID号,而不用写其它的代码要设置. 如果你删除掉这句, 你就可以看到使用IDD的原因了. 你要定义成变量的话, 你就需要自己修改代码了. : CDialog(CTestDlg::IDD, pParent) //基类构造函数的调用需要修改. IDD是变量的话, 就需要调用这个基类构造前赋值, 并且修改成不要CTestDlg:: 类似于这样: CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/) :IDD(IDD_TEST_DIALOG) //变量初始化 , CDialog(IDD, pParent) //构造函数 {
Eleven 2014-01-10
  • 打赏
  • 举报
回复
引用 10 楼 wumin940590725 的回复:
引用 9 楼 VisualEleven 的回复:
因为一个对话框类可以关联多个对话框模板~
能详细说下或者给个范围不,谢谢
CDialog::Create()函数,有一个参数就是对话框模板的资源ID,你可以在资源编辑器中创建多个对话框的资源
wumin940590725 2014-01-10
  • 打赏
  • 举报
回复
引用 9 楼 VisualEleven 的回复:
因为一个对话框类可以关联多个对话框模板~
能详细说下或者给个范围不,谢谢
Eleven 2014-01-10
  • 打赏
  • 举报
回复
因为一个对话框类可以关联多个对话框模板~
worldy 2014-01-10
  • 打赏
  • 举报
回复
引用 楼主 wumin940590725 的回复:
enum { IDD = IDD_DIALOG1 };这个为什么要这么写?我直接用UNIT IDD=IDD_DIALOG1不就好了嘛?枚举有什么好处吗?在resource.h中也只是将#define IDD_DIALOG1 196. 希望有人能解惑,谢谢
一个是常熟,一个变量, 个人感觉使用常数在效率上会好 点,因为常熟是包含在指令中,变量要获得值需要进行内存访问
wumin940590725 2014-01-10
  • 打赏
  • 举报
回复
如果不是因为在resource.h中有相关的定义估计我也不会想到这个问题,运行代码遇到说未定义IDD,然后去resource.h中定义了就好了,看到下面这种定义就有重复所以顿时就糊涂了 #define IDS_ABOUTBOX 101 #define IDD_PPT 101 #define IDD_SMARTPOINTER_DIALOG 102 #define IDS_DISPLAYCHANGEHINT 102 #define IDD_SMARTPOINTER 102
wumin940590725 2014-01-10
  • 打赏
  • 举报
回复
引用 5 楼 oyljerry 的回复:
可以添加其他对话框ID,添加多个
那个就是我IDD申明了对话框,那么对话框中IDC的控件哪里设置?不用设置我调用的时候又怎么确定调用哪一个?如果自动设定了,在resource.h中有很多的IDD,IDC的设定,请问这些又是怎么回事(因为据说设定的整数是不能重复的)其实我最大的疑惑就在这里,整数不能重复我每个对话框中的enmu中的参数如何保证不重复?微软会帮我解决吗,那么我在各个类中设置自定义消息的时候只要遵循如下的表格不就行了吗?为什么类之间的数值禁止重复?
oyljerry 2014-01-10
  • 打赏
  • 举报
回复
可以添加其他对话框ID,添加多个
wumin940590725 2014-01-10
  • 打赏
  • 举报
回复
引用 2 楼 bluesky_ql 的回复:
这跟MFC框架设计的思路有关,除非你去思考MFC框架设计,不然没有必要深究
只是对微软的消息机制还是有疑惑,应该还不能说是MFC框架的问题吧
wumin940590725 2014-01-10
  • 打赏
  • 举报
回复
http://tieba.baidu.com/p/674430962这个我觉得说的挺好,但是我仍然有一个疑问: 那个就是我IDD申明了对话框,那么对话框中IDC的控件哪里设置?不用设置我调用的时候又怎么确定调用哪一个?如果自动设定了,在resource.h中有很多的IDD,IDC的设定,请问这些又是怎么回事(因为据说设定的整数是不能重复的)其实我最大的疑惑就在这里,整数不能重复我每个对话框中的enmu中的参数如何保证不重复?微软会帮我解决吗,那么我在各个类中设置自定义消息的时候只要遵循如下的表格不就行了吗?为什么类之间的数值禁止重复? The following are the ranges of message numbers. Range Meaning 0 through WM_USER–1 Messages reserved for use by the system. WM_USER through 0x7FFF Integer messages for use by private window classes. WM_APP through 0xBFFF Messages available for use by applications. 0xC000 through 0xFFFF String messages for use by applications. Greater than 0xFFFF Reserved by the system. ----------------------------------------------------------------------------------- VC++基于对话框的程序中,在基于CDialog类的类头文件中,在类的成员变量声明部分,总会有类似enum { IDD = IDD_AAAAA }的声明, 作用: enum在这里的作用就是相当于类里面定义的常量,此常量用来唯一标识此对话框类对应的对话框,也就是此对话框的ID号. 疑问: 为什么要采用如此常量的定义方式,而不是其它关键字呢?比如const? 解惑: 首先我们应该对enum这种枚举型的优点,或其存在的意义有所了解才能真正弄清此问题, 枚举类型: C语言或C++的一种构造类型,它用于声明一组命名的常数。  (1)枚举的声明:枚举声明用于声明新的枚举类型。   访问修辞符 enum 枚举名:基础类型   {   枚举成员   }   基础类型必须能够表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。   (2)枚举成员   枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。   示例:   public enum TimeofDay:uint   {   Morning=-3,   Afternoon=-2,   Evening=-1   }   产生编译时错误,原因是常数值 -1、-2 和 –3 不在基础整型 uint 的范围内。 枚举类型的优点: 1.它将使程序更容易编写,阅读和维护 2.它是强类型的,不能将一个枚举做为另一个枚举值来使用 3枚举类型定义的符号是常量值,编译器一旦发现代码引用了一个枚举型的符号,在编译时就会用数值替换该符号 4.直观,易于理解,加强可读性 性别、月份、星期几、颜色、单位名、学历、职业等,都不是数值数据...如果用一个数值来代表某一状态,这种处理方法不直观,易读性差...如果能在程序中用自然语言中有相应含义的单词来代表某一状态,则程序就很容易阅读和理解...也就是说,事先考虑到某一变量可能取的值,尽量用自然语言中含义清楚的单词来表示它的每一个值,这种方法称为枚举方法,用这种方法定义的类型称枚举类型。 结论: 关于VC中使用enum { IDD = IDD_ABOUTBOX }来声明对话框ID的用法(以本人理解)是基于程序更其易于理解,加强程序的可读性方面考虑的。
bluesky_ql 2014-01-10
  • 打赏
  • 举报
回复
这跟MFC框架设计的思路有关,除非你去思考MFC框架设计,不然没有必要深究
wumin940590725 2014-01-10
  • 打赏
  • 举报
回复
没有人知道吗? 求顶啊,谢谢

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧