MFC非模态对话框程序在初始化函数(OnInitDialog)中调用 DestroyWindow() 奔溃,怎么正确销毁该对话框?

cs516623814 2017-09-01 04:11:14
非模态对话框,在OnInitDialog中,因为一些判断不符合条件,而不要展示该对话框,并且销毁掉该对话框的资源。所以我在初始化函数(OnInitDialog)中调用 DestroyWindow() 奔溃,正确的应该怎么做?
注:对话框重载了函数OnCanel,并且在这个函数中调用DestroyWindow 也重载了函数PostNcDestroy,并且在这个函数中delete this
...全文
802 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs516623814 2017-09-04
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
似乎 无效 BOOL CAboutDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here PostMessage(WM_DESTROY,0,0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
PostMessage(WM_CLOSE); 亲测有效 我的重写OnCancel函数里 去DestroyWindow(); 就可以啦
zhllxt 2017-09-04
  • 打赏
  • 举报
回复
我说错了,原来是非模态对话框,EndDialog应该不行。
zhllxt 2017-09-04
  • 打赏
  • 举报
回复
引用 18 楼 cs516623814 的回复:
[quote=引用 17 楼 schlafenhamster 的回复:] 似乎 无效 BOOL CAboutDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here PostMessage(WM_DESTROY,0,0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
PostMessage(WM_CLOSE); 亲测有效 我的重写OnCancel函数里 去DestroyWindow(); 就可以啦[/quote] PostMessage不保证消息一定送达,所以存在关不掉对话框的概率。 我记得在OnInitDialog中用EndDialog(IDCANCEL);就行的。其它的好像会有问题。
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
似乎 无效 BOOL CAboutDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here PostMessage(WM_DESTROY,0,0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
昨夜无风 2017-09-01
  • 打赏
  • 举报
回复
引用 9 楼 cs516623814的回复:
[quote=引用 7 楼 schlafenhamster 的回复:] “对话框被Create后” 能保证 创建 成功 ? if(IsWindow(m_Dlg.m_hWnd)) 就是检查 窗口是否 创建 成功
if(IsWindow(this->m_hWnd)) this->DestroyWindow() ;执行了。并且奔溃[/quote] OnInitDialog中不要直接destroy,用postmessge发消息退出
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
对, 类向导 中 将 对话框 改为 window , 就找到 WM_ACTIVE
cs516623814 2017-09-01
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:

void CAboutDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
	CDialog::OnActivate(nState, pWndOther, bMinimized);
	
	// TODO: Add your message handler code here
	if(::IsWindow(this->m_hWnd)) ::DestroyWindow(this->m_hWnd);	
	
}
大哥,这个代码的意思是把在OnActivate里去DestroyWindow 而不去OnInitDialog ?
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复

void CAboutDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
	CDialog::OnActivate(nState, pWndOther, bMinimized);
	
	// TODO: Add your message handler code here
	if(::IsWindow(this->m_hWnd)) ::DestroyWindow(this->m_hWnd);	
	
}
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
我试了试 的确 不行 问题在 DWORD CWnd::GetStyle() const { ASSERT(::IsWindow(m_hWnd));// 这里 的 m_hWn ==0 if (m_pCtrlSite == NULL) return (DWORD)GetWindowLong(m_hWnd, GWL_STYLE); else return m_pCtrlSite->GetStyle(); }
cs516623814 2017-09-01
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
对话框里的 控件 一个一个 删除 试试。
我觉得问题不是出在控件上,问题在 OnInitDialog 中不能调用 DestroyWindow。OnInitDialog还没执行完,可能有的东西还没有加载完全,我就去调用DestroyWindow,就会导致奔溃。
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
对话框里的 控件 一个一个 删除 试试。
cs516623814 2017-09-01
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
“对话框被Create后” 能保证 创建 成功 ? if(IsWindow(m_Dlg.m_hWnd)) 就是检查 窗口是否 创建 成功
if(IsWindow(this->m_hWnd)) this->DestroyWindow() ;执行了。并且奔溃
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
对话框中 active控件 经常可能创建 不成功。 所以 对话框 有个 属性 “创建失败” 即创建失败 对话框 还可以 显示
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
“对话框被Create后” 能保证 创建 成功 ? if(IsWindow(m_Dlg.m_hWnd)) 就是检查 窗口是否 创建 成功
cs516623814 2017-09-01
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
对话框添加一个类变量, 表示条件不符合, 父窗口中Create后 判断和销毁 销毁自身的话 试试 PostMessage WM_DESTROY, DestroyWindow 中通知父窗口, 不如上面的操作简单
我就是该对话框自销毁的做法。该对话框被Create后,在该对话框的OnInitDialog方法中,我做有判定:不该显示该对话框了。我想自销毁该对话框。调用this->DestroyWindow(); 后奔溃
cs516623814 2017-09-01
  • 打赏
  • 举报
回复
引用 3 楼 smwhotjay 的回复:
检查下资源是否后来删除了,而添加到关联变量没删
该对话框的析构函数执行完毕。就是在OnInitDialog调用 DestroyWindow,程序执行完对话框的析构函数后,奔溃。
zgl7903 2017-09-01
  • 打赏
  • 举报
回复
对话框添加一个类变量, 表示条件不符合, 父窗口中Create后 判断和销毁 销毁自身的话 试试 PostMessage WM_DESTROY, DestroyWindow 中通知父窗口, 不如上面的操作简单
smwhotjay 2017-09-01
  • 打赏
  • 举报
回复
检查下资源是否后来删除了,而添加到关联变量没删
cs516623814 2017-09-01
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
if(IsWindow(this)) DestroyWindow() ; 如 if(IsWindow(m_Dlg.m_hWnd)) m_Dlg.DestroyWindow();
程序奔溃了。 注意 是在OnInitDialog函数中。 比如在重写的OnCane函数中,就是正常的释放。但是在重写的OnInitDialog调用,程序就奔溃啦。
schlafenhamster 2017-09-01
  • 打赏
  • 举报
回复
if(IsWindow(this)) DestroyWindow() ; 如 if(IsWindow(m_Dlg.m_hWnd)) m_Dlg.DestroyWindow();

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧