在CDialog类中IDD为常量,为什么还能赋予另一个ID呢?

时间:2022-09-29 19:46:15
class CDialog1:public Cdialog
{
public:
enum{IDD=IDD_DIALOG1};
}

class CDialog2:public Cdialog
{
public:
enum{IDD=IDD_DIALOG2};
}

void main()
{
CDialog1 m_page1;
CDialog2 m_page2;

m_page1.Creat(IDD_DIALOG2);//在CDialog类中IDD为常量,为什么还能赋予另一个ID呢?
m_page1.ShowWindow(SW_SHOW);//为什么仍然能显示IDD_DIALOG2资源对话框?
}

7 个解决方案

#1



m_page1.Creat(IDD_DIALOG2);//在CDialog类中IDD为常量,为什么还能赋予另一个ID呢?

OK,这里应该这么理解,你建立了一个CDialog1 继承了 CDialog
你用的Create是CDialog的东西,这个CDialog是继承CWnd的,因此,你用一个标准的MFC库上的接口生成了一个窗口,在生成的时候赋予它一个参数表示他创建用的资源,一切都是那么正藏。

m_page1.ShowWindow(SW_SHOW);//为什么仍然能显示IDD_DIALOG2资源对话框?
你创建的是什么,显示的就是什么

以上是对你做的后面的事情的解析

//-----------------------------------------
enum{IDD=IDD_DIALOG1};
这句只是MFC用于标记你的这个Dialog所描述的默认的窗口创建的模板,但并不是说最后就不能修改。

CDialog1 m_page1;
m_page1.DoModal();

这样就会用你的默认的模板去进行UI的创建了显示了。
OK,如果你觉得不行。可以简单点用其他代码来理解你现在的代码,以表示这不是你的问题。

Step1:
CDialog dlg;
dlg.DoModal();

Step2:
CDialog dlg;
dlg.Create(IDD_XXX);  //IDD_XXX自己会填了吧。。。
dlg.ShowWindow(SW_SHOW);

#2


enum{IDD=IDD_DIALOG1};
这里的IDD_DIALOG1可以理解成IDD的缺省值,也可以称做默认值。

正如C++函数重载概念一样,这个值也是可以重新赋予的。

#3


CDialog1 m_page1;
CDialog2 m_page2;

m_page1.Create(IDD_DIALOG2);//

CDialog1类的实例m_page1,建立窗口时,加载的是IDD_DIALOG2模板的对话框。
如这个实例中有操作非IDD_DIALOG2模板中的控件,将非法。
一般不要这样做,除非有特殊要求。

#4


引用 2 楼 fight_in_dl 的回复:
enum{IDD=IDD_DIALOG1};
这里的IDD_DIALOG1可以理解成IDD的缺省值,也可以称做默认值。

正如C++函数重载概念一样,这个值也是可以重新赋予的。
枚举不是常量么,怎么还可以重新赋值?

#5


枚举的开始值可以不同啊!

#6


引用 4 楼 xzj1987125 的回复:
枚举不是常量么,怎么还可以重新赋值?


enum points{ one,two,three}//定义类型
points a;//定义变量
a = one;

#7


引用 4 楼 xzj1987125 的回复:
引用 2 楼 fight_in_dl 的回复:
enum{IDD=IDD_DIALOG1};
这里的IDD_DIALOG1可以理解成IDD的缺省值,也可以称做默认值。

正如C++函数重载概念一样,这个值也是可以重新赋予的。
枚举不是常量么,怎么还可以重新赋值?

和枚举不枚举没关系,程序也可以运行比如
 class CDialog1:public Cdialog
{
public:
}

class CDialog2:public Cdialog
{
public:
}
  void main()
{
CDialog1 m_page1;
CDialog2 m_page2;

m_page1.Creat(IDD_DIALOG2);// ok
m_page1.ShowWindow(SW_SHOW);// ok
不过这样的一定要传递资源框的id了
比如这样既就不行
 CDialog1 dlg;//不行了

那么枚举enum{IDD=IDD_DIALOG1};
 enum{IDD=IDD_DIALOG2};
在这里的作用就很明显了,为了使得对话框能有个默认构造函数。

枚举不是常量么,怎么还可以重新赋值?
m_page1.Creat(IDD_DIALOG2);// 不是对IDD 重新赋值,而是显式给
create函数传递对话框资源id

#1



m_page1.Creat(IDD_DIALOG2);//在CDialog类中IDD为常量,为什么还能赋予另一个ID呢?

OK,这里应该这么理解,你建立了一个CDialog1 继承了 CDialog
你用的Create是CDialog的东西,这个CDialog是继承CWnd的,因此,你用一个标准的MFC库上的接口生成了一个窗口,在生成的时候赋予它一个参数表示他创建用的资源,一切都是那么正藏。

m_page1.ShowWindow(SW_SHOW);//为什么仍然能显示IDD_DIALOG2资源对话框?
你创建的是什么,显示的就是什么

以上是对你做的后面的事情的解析

//-----------------------------------------
enum{IDD=IDD_DIALOG1};
这句只是MFC用于标记你的这个Dialog所描述的默认的窗口创建的模板,但并不是说最后就不能修改。

CDialog1 m_page1;
m_page1.DoModal();

这样就会用你的默认的模板去进行UI的创建了显示了。
OK,如果你觉得不行。可以简单点用其他代码来理解你现在的代码,以表示这不是你的问题。

Step1:
CDialog dlg;
dlg.DoModal();

Step2:
CDialog dlg;
dlg.Create(IDD_XXX);  //IDD_XXX自己会填了吧。。。
dlg.ShowWindow(SW_SHOW);

#2


enum{IDD=IDD_DIALOG1};
这里的IDD_DIALOG1可以理解成IDD的缺省值,也可以称做默认值。

正如C++函数重载概念一样,这个值也是可以重新赋予的。

#3


CDialog1 m_page1;
CDialog2 m_page2;

m_page1.Create(IDD_DIALOG2);//

CDialog1类的实例m_page1,建立窗口时,加载的是IDD_DIALOG2模板的对话框。
如这个实例中有操作非IDD_DIALOG2模板中的控件,将非法。
一般不要这样做,除非有特殊要求。

#4


引用 2 楼 fight_in_dl 的回复:
enum{IDD=IDD_DIALOG1};
这里的IDD_DIALOG1可以理解成IDD的缺省值,也可以称做默认值。

正如C++函数重载概念一样,这个值也是可以重新赋予的。
枚举不是常量么,怎么还可以重新赋值?

#5


枚举的开始值可以不同啊!

#6


引用 4 楼 xzj1987125 的回复:
枚举不是常量么,怎么还可以重新赋值?


enum points{ one,two,three}//定义类型
points a;//定义变量
a = one;

#7


引用 4 楼 xzj1987125 的回复:
引用 2 楼 fight_in_dl 的回复:
enum{IDD=IDD_DIALOG1};
这里的IDD_DIALOG1可以理解成IDD的缺省值,也可以称做默认值。

正如C++函数重载概念一样,这个值也是可以重新赋予的。
枚举不是常量么,怎么还可以重新赋值?

和枚举不枚举没关系,程序也可以运行比如
 class CDialog1:public Cdialog
{
public:
}

class CDialog2:public Cdialog
{
public:
}
  void main()
{
CDialog1 m_page1;
CDialog2 m_page2;

m_page1.Creat(IDD_DIALOG2);// ok
m_page1.ShowWindow(SW_SHOW);// ok
不过这样的一定要传递资源框的id了
比如这样既就不行
 CDialog1 dlg;//不行了

那么枚举enum{IDD=IDD_DIALOG1};
 enum{IDD=IDD_DIALOG2};
在这里的作用就很明显了,为了使得对话框能有个默认构造函数。

枚举不是常量么,怎么还可以重新赋值?
m_page1.Creat(IDD_DIALOG2);// 不是对IDD 重新赋值,而是显式给
create函数传递对话框资源id