CDialog派生类CMyDialog,在程序中要同时创建这类对话框(非模式)若干个,
最多时达10多个,有什么方便、简单的方法?其实功能类似于多文档里的子窗口。

解决方案 »

  1.   

    在需要的地方
    CYourDlg dlg
    dlg.DoModal()
      

  2.   

    非模态的是
    CYourDlg dlg
    dlg.Create(...)
    dlg.ShowWindow(...)
      

  3.   


    不是模式对话框,是要dlg.Create()的,
    而且要同时创建10多个。
      

  4.   

    const int MAX_NUM = 10;
    CYourDlg dlgarray[MAX_DIALOG_NUM];for(int i = 0;i < MAX_DIALOG_NUM;i ++)
    {
        dlgarray[i].Create(...);
        dlgarray[i].ShowWindow(SW_SHOW);
    }
      

  5.   

    大哥,你一定是把CYourDlg dlgarray[MAX_DIALOG_NUM];作为一个局部变量了,非模式对话框是不阻塞的,创建出来后继续执行下面的代码,直到函数结束,当函数结束时你在函数内部定义的变量都被释放了,当然不会成功。你那里是不是对话框一闪而过的?
    解决方法如下:
        1.你可以把CYourDlg dlgarray[MAX_DIALOG_NUM];作为全部变量。
        2.或者你把他作为一个类成员变量。再试一下。
      

  6.   


       要 Create 10个对话框,就要加入10个对话框资源,这10个对话框又
    要分别对应10个CDialog派生类CDialog1、CDialog2...CDialog10,
    再分别调用Create函数,操作起来很不方便。
      如果可以做到像多文档那样,可以新建多个相同的子窗口就方便多了。
      

  7.   

    把你的DialogID设置得有规律一定,如ID0 -- ID9, 用##来实现ID的动态生成。我先试试,如果有问题在通知你。
      

  8.   

    動態創建對話框模板:
    MSDN 查 InitModalIndirect
      

  9.   

    不应该把他作为一个类的成员变量,而是作为全程变量,或放在主程序类(如CProjectDlg.h)的头名件中定义该成员变量CMyDialog Dlg[10];创建时用循环语句创建就可以了。dlg1[i].Create(IDD_DIALOG1,this);
    dlg1[i].ShowWindow(SW_SHOW);可单独写一test试一试。
      

  10.   

    ID资源不一样可以改改资源投文件,把ID改成连续的整数,这样可以做简单的循环
    建议用:CMyDialog * m_pDlgs[10];
    用new 分派内存赋值,然后用Create.
    最后别忘清除内存
    做过这种东西,肯定可以的。
      

  11.   

    我觉得如果十个对话框都不一样的话用数组之类的东西也不行,因为消息映射都不一样,只能一个个建。
    不过,如果只是要求对话框管理方便的话,可以用一个*CDialog 来集中管理,比如平铺之类的。 或者,要求高一点的话,从CDialog派生一个CMyDialog,里边留下一些虚函数做管理接口,然后你所有的对话框都从CMyDialog派生就行了,我说明白了吗?
      

  12.   

    To incaution(不小心) :你说的方法可以,不过很奇怪:为什么在堆栈中创建(new )
    不行呢?
      

  13.   

    To incaution(不小心) :
    for (int i = 0; i < 10; i++)
    {
    CString str; str.Format("No. %d", i);
    dlg[i].Create(IDD_VIDEO_DIALOG, this);
    dlg[i].SetWindowText(str);
    dlg[i].UpdateWindow();
    dlg[i].ShowWindow(SW_SHOW);
    }
      

  14.   

    HWND CreateDialog(
      HINSTANCE hInstance,  // handle to module
      LPCTSTR lpTemplate,   // dialog box template name
      HWND hWndParent,      // handle to owner window
      DLGPROC lpDialogFunc  // dialog box procedure
    );完全可以公有一个消息处理函数,只要在消息处理函数的代码中对各个子窗口加标记的办法来分别处理各自的状态即可。标记怎么加?用SetWindowLong(...)第三个参数可附加自义数据:LONG SetWindowLong(
      HWND hWnd,       // handle to window
      int nIndex,      // offset of value to set
      LONG dwNewLong   // new value
    );怎么获得?用:LONG GetWindowLong(
      HWND hWnd,  // handle to window
      int nIndex  // offset of value to retrieve
    );
      

  15.   

    呵。来晚了。
    netsbull(网牛)“ID资源不一样可以改改资源头文件,把ID改成连续的整数,这样可以做简单的循环”这句有道理,我作过动态生成连续的按钮,标签,绝对没问题的。
    http://www.csdn.net/cnshare/soft/12/12854.shtm
    任务条上的按钮就是用这种方法做的,效果还不错吧?
     
      

  16.   


    To shaohua(美女?我抱!警察?我闪!我是流氓我怕谁):生成按钮之类的是没问题呀。
    但要生成多个同一类的对话框就有问题了。
    不信你试试,如果问题有这么简单就不用这么烦了 ^_^
      

  17.   

    for (int i = 0; i < 10; i++)
    {
      CString str;
      str.Format("No. %d", i);
      dlg[i].Create(IDD_VIDEO_DIALOG, this);
      dlg[i].SetWindowText(str);
      dlg[i].UpdateWindow();
      dlg[i].ShowWindow(SW_SHOW);
    }
      

  18.   

    int ii;
    for (ii=0;ii<10;ii++)
    {
      CString str;
      str.Format("No. %d", ii);
      Dlg[ii].Create(IDD_DIALOG1, this);
      Dlg[ii].SetWindowText(str);
      Dlg[ii].UpdateWindow();
      Dlg[ii].ShowWindow(SW_SHOW);
    }
    在我的机器上编译没问题,10个对话框的标题不一样,从0-9,
    切换到别的程序再切换回来,也是正常的。我是在98和2000下都对的。
      

  19.   


     我现在用MDI解决了问题,谢谢大家的参与。 结帐