非模态对话框的关闭

类A里有非模态对话框类C的指针pDialog;类C创建后,我想在类A里有个函数CloseC(),可以让非模态对话框关闭,要怎么做?我现在是voidA::CloseC(){... 类A里有非模态对话框类C的指针pDialog;
类C创建后,
我想在类A里有个函数CloseC(),可以让非模态对话框关闭,要怎么做?
我现在是
void A::CloseC()
{
if(pDialog)
{
pDialog->DestroyWindow();
pDialog=NULL;
}
}

这种做法在debug下会在pDialog->DestroyWindow()行报错

有没有其他做法关闭C,
或者怎么解决报错?
报错函数:BOOL CWnd::DestroyWindow(){
if (m_hWnd == NULL)
return FALSE;

CHandleMap* pMap = afxMapHWND(); ASSERT(pMap != NULL);
CWnd* pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);
#ifdef _DEBUG
HWND hWndOrig = m_hWnd;
#endif

#ifdef _AFX_NO_OCC_SUPPORT BOOL bResult = ::DestroyWindow(m_hWnd);
#else //_AFX_NO_OCC_SUPPORT
BOOL bResult;
if (m_pCtrlSite == NULL)
bResult = ::DestroyWindow(m_hWnd);
else
bResult = m_pCtrlSite->DestroyControl();
#endif //_AFX_NO_OCC_SUPPORT

// Note that 'this' may have been deleted at this point, // (but only if pWnd != NULL)
if (pWnd != NULL)
{
// Should have been detached by OnNcDestroy
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL); //报错行
#endif
}

.....
}
展开
 我来答
百度网友5722492f7
推荐于2016-11-21 · TA获得超过725个赞
知道小有建树答主
回答量:594
采纳率:0%
帮助的人:480万
展开全部
使用了指向全局的DoModal对话框类,并在线程中试图销毁对话框对象,有可能导致,最好改成局部的。如果是派生类,在析构函数里设置m_hWnd=NULL;
更多追问追答
追问
不知所云
追答
非模态窗口一般都要使用close来关闭,而不是销毁,两者意义不同。
因为销毁的话,线程中可能出现问题。
pDialog->CloseWindow();
delete pDialog;//如果要再次使用就要重新new,或者不加这句delete
窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。
所以一般要先关闭窗口之后,才能destroy掉。
destroywindow中删除对象后会自己设置指针为空,所以你不必做这个操作pDialog=NULL;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
七鑫易维信息技术
2024-09-02 广告
Play Video 七鑫易维是致力于机器视觉和人工智能领域的高新科技企业,迄今已专注眼球追踪技术的研发、创新与应用超过14年,拥有完全自主知识产权,全球专利总量655余项。 作为眼球追踪技术领域的全球知名品牌,七鑫易维的产品体系覆盖眼动分... 点击进入详情页
本回答由七鑫易维信息技术提供
zhaobangyuHI
2013-04-17
知道答主
回答量:37
采纳率:0%
帮助的人:19.9万
展开全部
Debug与Relese的区别在于,Debug包含调试信息,报的什么错,把错贴出来或者自己调试下,不然别人怎么帮你解决报错。
更多追问追答
追问
已经补充了,麻烦看一下
追答

这是我写的,与你的处理方式应该是一样的,08编译,试试是不是你要的效果,

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_whales
2013-04-18 · TA获得超过2280个赞
知道大有可为答主
回答量:1814
采纳率:85%
帮助的人:514万
展开全部
pDialog->ShowWindow(SW_HIDE);
不要这么做:pDialog=NULL;
更多追问追答
追问
你是说只隐藏不关闭是吗?
追答
对呀!非模态对话框,不需要主动关闭的,什么时候不需要了隐藏就是了!需要就显示它!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cooke1234
2013-04-17 · TA获得超过6861个赞
知道大有可为答主
回答量:4617
采纳率:72%
帮助的人:3629万
展开全部
在DestroyWindows之前,先ShowWindow(SW_HIDE),让窗体不可见。
更多追问追答
追问
就算不可见了 DestroyWindow()那一行也会报错的吧
追答
1. 你这么问,好像你没有试验过一样。建议你先去试验一下。你的作业不是我的,我可以不做试验,你得做。做了试验就知道结果了。(其实如果我不继续回答,你一样还要去试验的)

2. 应该不是报错,是ASSERT吧(因为你没有具体说明错误现象,所以我推测)。如果是ASSERT,你最好看看ASSERT的参数是什么就知道了。如果不知道ASSERT是什么东西,请打开MSDN的XXXX页。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式