MFC 具有该ID的控价已存在
给每个窗口 编制一个序号: IDC_D4_BUT_SAVE , D4 表示第4个对话框
ID号的值可以重复,ID的名字貌似不能重复
两个不同对话框里的按钮 ID号确实可以相同,但是因为父窗口不同,所以互不影响。
发送消息时候是通过句柄发送的,这个两个按钮的ID号看起来一样,但是实际的句柄并不一样,所以不影响使用。
Windows内部 最关键是句柄。
不同父窗口的子窗口ID是可以重复的……其实就算是同一个父窗口,子窗口ID也是可以重复的,只要你没有啥和ID相关的逻辑,比如IDC_STATIC就是。如果你在同一个对话框上有两个按钮有相同的ID,而且CDialog::GetDefID返回的是这个ID,那么按回车可能不会触发你期望的那个按钮
1
ID的分配是通过头文件控制的。
你看你的resource.h的最后几行(注释是我加的,源文件里没有):
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 2000 // 下一个资源的ID,比如字符串资源,位图资源等
#define _APS_NEXT_COMMAND_VALUE 40001 // 下一个command的ID,这个一般是作为WM_COMMAND消息的参数用的。
#define _APS_NEXT_CONTROL_VALUE 1001 // 下一个控件的ID
#define _APS_NEXT_SYMED_VALUE 101 // 下一个符号的ID
#endif
比如,如果这个时候你用VC的对话框插入一个字符串,那么这个字符串的ID就会自动被分配成2000,同时_APS_NEXT_RESOURCE_VALUE会被改成2001。其他几个值也是以类似方式工作的。
所以其实VC自动分配的ID号,跟你自己定义的是有可能重复的。你必须自己保证没有重复,而不是依赖于VC帮你检查。一个办法是,比如你要新加一个控件,你可以用_APS_NEXT_CONTROL_VALUE的值作为这个控件的ID,然后自己手动把_APS_NEXT_CONTROL_VALUE的值加1,这样就能保持跟VC的ID分配机制一致。
2
MFC中的ID命名规则 .
IDC_:控件的ID命名前缀(Control);
IDM_:菜单的ID命名前缀(Menu);
IDD_:对话框的ID命名前缀(Dialog);
IDR_:资源的ID命名前缀(Resource);
IDS_:字符串的ID命名前缀(String);
IDB_:位图资源的ID命名前缀(Bitmap);
3
如果不操作数据,可以是一个ID,如果要操作数据就不行了,因为没法判断是哪个控件做的动作,除非所有相同的ID的控件都执行同样的动作
一般情况,同进程中不要用相同的ID,当然,你故意要弄成相同,如果不需要区分的话(比如STATIC控件,默认都是一个ID),应该也没什么问题…
没有消息处理的空间就可以设置成一样的名字,例如IDC_STATIC…
同一个工程的窗口、控件、动态创建对象等都有唯一ID。这正是区分或者查找他们的唯一方式。
不可能重复,如果重复的话,编译有可能通过,但是运行的时候,如果牵涉ID查询,那么会出错。 你可以打开当前工程下的 resource.h文件,里面有所有的ID的定义。所有的ID都定义在此,每添加一个控件对象,系统会根据已经添加的ID 来创建一个新的ID,一般情况下是最高的ID号加1成为一个新的ID号!