创建非模态对话框出BUG

woneedjob 2009-10-03 03:56:44

整个代码是在一个SDI工程,CTestDialog 是自建的对话框资源类。
OnCreateDialog函数是一个菜单(菜单Caption为:创建对话框)响应函数
用来创建非模态对话框,CSunXinLesson7View是系统view类


CTestDialog dlg;
void CSunXinLesson7View::OnCreateDialog()
{
// TODO: Add your command handler code here
dlg.Create(IDD_DIALOG1,this);
dlg.ShowWindow(SW_SHOW);

}

代码运行后第一次点“创建对话框”会正常显示一个对话框,但关闭再点击“创建对话框”就出问题了
提示:Debug Assertion Failed!
这是怎么回事呢?
...全文
46 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
woneedjob 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cattycat 的回复:]
创建非模态对话框要用指针来操作。

CTestDialog* dlg=new CTestDialog;
dlg->Create(IDD_DIALOG1,this);
dlg->ShowWindow(SW_SHOW);


[/Quote]
而且我把CTestDialog* dlg=new CTestDialog移到OnCreateDialog() 外,出现同样问题
woneedjob 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cattycat 的回复:]
创建非模态对话框要用指针来操作。

CTestDialog* dlg=new CTestDialog;
dlg->Create(IDD_DIALOG1,this);
dlg->ShowWindow(SW_SHOW);


[/Quote]
这样也是对的,我也有这样写,为什么这样对呢
?
感觉很迷惑的,想弄清楚下
karlfixed 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 woneedjob 的回复:]
谢谢回复,我找原因了,和你说的差不多!

我原来是通过响应 CDialog::OnOK 关闭对话框的。CDialog::OnOK 函数

对模态和非模态对话框处理不一样。

MSDN上说的:

If you implement the OK button in a modeless dialog box, you must override the OnOK member function and call DestroyWindow from within it. Don’t call the base-class member function, because it calls EndDialog, which makes the dialog box invisible but does not destroy it.

我就对CTestDialog 重写了OnOK ,里面加入DestroyWindow 。就没出问题了。

说实话,还是不是很明白,原先情况调用OnOk只是使对话框不可见,我再开一次,就应该多开一个

实例啊,是吧。怎么会Debug呢
[/Quote]
应该是windows资源没有释放导致的
woneedjob 2009-10-03
  • 打赏
  • 举报
回复
谢谢回复,我找原因了,和你说的差不多!

我原来是通过响应 CDialog::OnOK 关闭对话框的。CDialog::OnOK 函数

对模态和非模态对话框处理不一样。

MSDN上说的:

If you implement the OK button in a modeless dialog box, you must override the OnOK member function and call DestroyWindow from within it. Don’t call the base-class member function, because it calls EndDialog, which makes the dialog box invisible but does not destroy it.

我就对CTestDialog 重写了OnOK ,里面加入DestroyWindow 。就没出问题了。

说实话,还是不是很明白,原先情况调用OnOk只是使对话框不可见,我再开一次,就应该多开一个

实例啊,是吧。怎么会Debug呢
cattycat 2009-10-03
  • 打赏
  • 举报
回复
创建非模态对话框要用指针来操作。

CTestDialog* dlg=new CTestDialog;
dlg->Create(IDD_DIALOG1,this);
dlg->ShowWindow(SW_SHOW);

  • 打赏
  • 举报
回复
你怎么关闭对话框的?
在关闭的时候得将dlg的一些变量给设置成空。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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