To incaution(不小心) :你说的方法可以,不过很奇怪:为什么在堆栈中创建(new ) 不行呢?
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); }
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 );
CYourDlg dlg
dlg.DoModal()
CYourDlg dlg
dlg.Create(...)
dlg.ShowWindow(...)
不是模式对话框,是要dlg.Create()的,
而且要同时创建10多个。
CYourDlg dlgarray[MAX_DIALOG_NUM];for(int i = 0;i < MAX_DIALOG_NUM;i ++)
{
dlgarray[i].Create(...);
dlgarray[i].ShowWindow(SW_SHOW);
}
解决方法如下:
1.你可以把CYourDlg dlgarray[MAX_DIALOG_NUM];作为全部变量。
2.或者你把他作为一个类成员变量。再试一下。
要 Create 10个对话框,就要加入10个对话框资源,这10个对话框又
要分别对应10个CDialog派生类CDialog1、CDialog2...CDialog10,
再分别调用Create函数,操作起来很不方便。
如果可以做到像多文档那样,可以新建多个相同的子窗口就方便多了。
MSDN 查 InitModalIndirect
dlg1[i].ShowWindow(SW_SHOW);可单独写一test试一试。
建议用:CMyDialog * m_pDlgs[10];
用new 分派内存赋值,然后用Create.
最后别忘清除内存
做过这种东西,肯定可以的。
不过,如果只是要求对话框管理方便的话,可以用一个*CDialog 来集中管理,比如平铺之类的。 或者,要求高一点的话,从CDialog派生一个CMyDialog,里边留下一些虚函数做管理接口,然后你所有的对话框都从CMyDialog派生就行了,我说明白了吗?
不行呢?
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);
}
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
);
netsbull(网牛)“ID资源不一样可以改改资源头文件,把ID改成连续的整数,这样可以做简单的循环”这句有道理,我作过动态生成连续的按钮,标签,绝对没问题的。
http://www.csdn.net/cnshare/soft/12/12854.shtm
任务条上的按钮就是用这种方法做的,效果还不错吧?
To shaohua(美女?我抱!警察?我闪!我是流氓我怕谁):生成按钮之类的是没问题呀。
但要生成多个同一类的对话框就有问题了。
不信你试试,如果问题有这么简单就不用这么烦了 ^_^
{
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);
}
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下都对的。
我现在用MDI解决了问题,谢谢大家的参与。 结帐