
一个关于创建非模态对话框的问题
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();
}
这样为什么不行呢?谢谢! 展开
{
// TODO: Add your control notification handler code here
CD2 dlg;
dlg.Create(IDD_DIALOG2,this);
dlg.ShowWindow(SW_SHOW);
dlg.Detach();
}
这样为什么不行呢?谢谢! 展开
展开全部
首先要把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);后面没跟任何语句,那么这个按钮消息运行完,释放对象,这就是为什么不能在按钮函数里面局部定义对象
其次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);后面没跟任何语句,那么这个按钮消息运行完,释放对象,这就是为什么不能在按钮函数里面局部定义对象
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询