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资源对话框?
}

解决方案 »

  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.   


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

  5.   

    和枚举不枚举没关系,程序也可以运行比如
     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