class MyDlg: public CDialog
{
enum{IDD=IDD1};
//enum{IDD=IDD2};
......
};
如果不使用条件编译,怎么实现动态加载,即不同条件IDD取不同的值?
enum{IDD=IDD1};这条语句可不可以放在*.cpp文件中处理?

解决方案 »

  1.   

    不同的dlg只是create的时候可以选IDD,但是类还是要用固定IDD来处理的,也就是一个IDD对应一个类来处理这个IDD对应的对话框的信息...........
      

  2.   

    个人感觉IDD是个枚举类型变量,在Create之前应该可以修改。
      

  3.   

    可以在初始化基类构造函数初始化时修改:

    class CMyDialog : public CDialog
    {
    // Construction
    public:
    CMyDialog (UINT MyIDD = IDD, CWnd* pParent = NULL);   // standard constructor
            
    }CMyDialog ::CMyDialog (UINT MyIDD , CWnd* pParent /*=NULL*/)
    : CDialog(MyIDD, pParent)
    {
    }CMyDialog MyDlg(IDD1);
    CMyDialog MyDlg(IDD2);
      

  4.   

    可以改变的,在初始化的时候付给对应的IDD就行啦
      

  5.   

    谢谢各位!
    我目前用的方法是在类的构造函数中用Create,根据不同的条件,调用Create时传入不同的参数,因为两个IDD都是固定的,所以只写一次就可以了。如下:CMyDlg::CMyDlg(CWnd *parent)
    {
        if(...)
        {
            Create(IDD1,parent);
        }
        else
        {
            Create(IDD2,parent);
        }
        ...
    }不知用Create和在构造函数中传参,实现的效果有什么区别?
      

  6.   

    模态对话框在调用CDialog构造函数时指定资源模板,非模态对话框在调用Create函数时指定。
      

  7.   

    谢谢各位!
    在实际操作时,出了个问题,找了好久才发现原因,在这里说一下。
    在用Create的时候,要先创建一个CDialog类型的对象,再用这个对象调用Create函数CMyDlg::CMyDlg(CWnd *parent)
            :CDialog() //这句很重要,没有的话会出错
    {
        if(...)
        {
            Create(IDD1,parent);
        }
        else
        {
            Create(IDD2,parent);
        }
        ...
    }11楼说的很有道理,我开始就是因为没有去判断Create成功没有才会出错,其实只要判断一下返回值就知道创建是否成功了,当初之所以偏向于用Create就是因为两个IDD的应用场合是固定的,在构造函数中一次判断就行了,不然,以后每调用一次就得判断一下要用哪个,觉得有点冗余,而且以后其他人修改代码,也不必去理会这个类的实现细节,直接调用构造函数就行了。对于10楼说的模态与非模态的问题,我试了一下,用CDialog两种对话框中都可以正常表示,但在模态对话框中用Create会出错。
    所以具体用哪种方法,还要看实际情况。