一个关于创建非模态对话框的问题

voidCDialogDlg::OnButton2(){//TODO:AddyourcontrolnotificationhandlercodehereCD2dlg;dl... void CDialogDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CD2 dlg;
dlg.Create(IDD_DIALOG2,this);
dlg.ShowWindow(SW_SHOW);
dlg.Detach();
}
这样为什么不行呢?谢谢!
展开
 我来答
zhccsd
2012-06-10 · TA获得超过4042个赞
知道大有可为答主
回答量:1347
采纳率:66%
帮助的人:949万
展开全部
首先要把CD2 dlg;写成全局,因为button这个函数是一次性运行,运行完CD2 dlg这个资源就销毁了,导致点击以后对话框一闪而过,可以写在cpp的include的下面
其次if(!dlg.m_hWnd) 的情况下才dlg.Create(IDD_DIALOG2,this);
否则第一次可以正常弹出,第二次点的时候必然报错,因为不能重复create
最后不需要dlg.Detach();
据我所知这个函数用来切断对象和窗口的关系,所以,不合适吧
最后总结下代码应该是这样的
CD2 dlg;放全局
if(!dlg.m_hWnd)
{dlg.Create(IDD_DIALOG2,this);}
dlg.ShowWindow(SW_SHOW);
另外再啰嗦几句,非模态跟模态有这很大的区别,模态对话框的话dlg.Domodal();运行到这里主对话框会停下,运行弹出对话框,直到弹出的对话框结束,主对话框再继续,所以模态对话框的对象不需要全局,放在按钮相应函数里就可以了,另外后面加dlg.Detach();也可以,只是没必要,它自己就会执行
但是非模态对话框就不一样了,走到dlg.ShowWindow(SW_SHOW);这里弹出对话框的同时主对话框也继续运行,后面跟着dlg.Detach();的话就直接非法操作。而如果dlg.ShowWindow(SW_SHOW);后面没跟任何语句,那么这个按钮消息运行完,释放对象,这就是为什么不能在按钮函数里面局部定义对象
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式