[求助]用CFrameWnd实现的模态(Modal)窗口,在DestroyWindow()时报错

chxy85 2010-04-14 02:49:30
首先
class CMyWnd : public CFrameWnd

然后实现自己的DoModal()如下:

int CMyWnd::DoModal()
{
if (CWinApp* pApp = AfxGetApp())
pApp->EnableModeless(false);

HWND hWndParent = AfxGetMainWnd()->m_hWnd;
CRect rc(0,0,400,400);
CWnd *pParent = CWnd::FromHandle(hWndParent);
DWORD dwStyle=WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_THICKFRAME | WS_VISIBLE | WS_SYSMENU | WS_CAPTION ;
if(!Create(NULL,L"模态文档 ",dwStyle,rc,pParent,NULL))
return FALSE;

BOOL bEnableParent = FALSE;
m_nModalResult = -1;
m_nFlags |= WF_CONTINUEMODAL;

if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent,FALSE);
::EnableWindow(m_hWnd,TRUE);
bEnableParent = TRUE;
}
CenterWindow();


TRY
{
// enter modal loop
DWORD dwFlags = MLF_SHOWONIDLE;
if (GetStyle() & DS_NOIDLEMSG) dwFlags |= MLF_NOIDLEMSG;
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
}
CATCH_ALL(e)
{
DELETE_EXCEPTION(e);
m_nModalResult = -1;
}
END_CATCH_ALL



if (bEnableParent)
::EnableWindow(hWndParent, TRUE);
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
::SetActiveWindow(hWndParent);

// destroy modal window
if (m_hWnd)
{
DestroyWindow();
ASSERT(!m_hWnd);
}

return m_nModalResult;

}


关闭窗口用EndModalLoop(nResult);也执行正常
如果没有
	if (m_hWnd)
{
DestroyWindow();
ASSERT(!m_hWnd);
}

的话,运行正常,但会内存泄露,加上后在执行到时会报错,跟了很久没跟出来问题,请大家帮忙一下。。。
...全文
231 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-04-23
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
shenqiabing 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shenqiabing 的回复:]

引用楼主 chxy85 的回复:
首先
C/C++ code
class CMyWnd : public CFrameWnd

然后实现自己的DoModal()如下:
C/C++ code

int CMyWnd::DoModal()
{
if (CWinApp* pApp = AfxGetApp())
pApp->EnableModeless(false);

HWN……
[/Quote]

在一个编译器提示的内存泄露也不一定是完全正确的
shenqiabing 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 chxy85 的回复:]
首先
C/C++ code
class CMyWnd : public CFrameWnd

然后实现自己的DoModal()如下:
C/C++ code

int CMyWnd::DoModal()
{
if (CWinApp* pApp = AfxGetApp())
pApp->EnableModeless(false);

HWND hWndPare……
[/Quote]

我也经常会遇到这种问题,出现这种问题的原因我是明白的,你父窗口调用Create创建子窗口,当父窗口销毁的时候会给子窗口发送WM_CLOSE 消息这个时候就会调用 DestoryWindow, 而你在程序中调用了DestoryWindow 父窗口关闭时仍会发送WM_CLSOE 消息给父窗口,这个时候就会出现程序崩溃,但是怎么 解决我也没想出来,实在不行就是让他内存泄露,或者换一种设计思路
liumenghappy 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chxy85 的回复:]

修改了下程序,只这样也会报错,看来错误出在create的地方
C/C++ code
int CMyWnd::DoModal()
{
if (CWinApp* pApp = AfxGetApp())
pApp->EnableModeless(false);

HWND hWndParent = AfxGetMainWnd()->m_hWnd;
CRect……
[/Quote]
没看出什么问题啊,你一步一步调试下,看看哪个函数报错,报的什么错也发一下
chxy85 2010-04-15
  • 打赏
  • 举报
回复
顶一下
Eleven 2010-04-14
  • 打赏
  • 举报
回复
你debug下,打开call stack函数那个函数抛出异常。。。
chxy85 2010-04-14
  • 打赏
  • 举报
回复
修改了下程序,只这样也会报错,看来错误出在create的地方
int CMyWnd::DoModal()
{
if (CWinApp* pApp = AfxGetApp())
pApp->EnableModeless(false);

HWND hWndParent = AfxGetMainWnd()->m_hWnd;
CRect rc(0,0,400,400);
CWnd *pParent = CWnd::FromHandle(hWndParent);
DWORD dwStyle=WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_THICKFRAME | WS_VISIBLE | WS_SYSMENU | WS_CAPTION ;
if(!Create(NULL,L"模态文档/试图框架 ",dwStyle,rc,pParent,NULL))
return FALSE;
DestroyWindow();
return m_nModalResult;

}

15,979

社区成员

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

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