高手请分析,关于CWnd::Create 的问题!

steven_sina 2003-02-06 06:31:14
我有一个基于对话框的程序,在点击一个按钮时会 DoModal 一个新窗口,在新窗口中,我自己写了一个从CWnd继承的类,在这个类里的如下函数中
virtual BOOL Create(RECT &rect, CWnd * pParentWnd, UINT nID);

有代码:
CString szClassName=AfxRegisterWndClass(....);。。。
CWnd::CreateEx( 0, szClassName, NULL, WS_DLGFRAME|WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect,pParentWnd, nID, NULL))



----------
问题是:
在点击第一次按钮时,可以弹出新窗口,并且里面自己创建的按钮等都无误,但是在关闭这个新窗口后,再点击按钮想弹出那个新窗口时就报错了!错误出自wingdi.cpp的1120行,也就是在下面这个函数里出错:
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
===> ASSERT(m_hObject == NULL); <====错误
if (hObject == NULL)
return FALSE;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE);
ASSERT(pMap != NULL);
pMap->SetPermanent(m_hObject = hObject, this);
return TRUE;
}

------为什么?怎么解决呢? 请指教,谢谢。
...全文
982 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
demetry 2003-02-23
  • 打赏
  • 举报
回复
考虑一下 elvahuang(elva) 的意见^_^
zwvista 2003-02-22
  • 打赏
  • 举报
回复
对话框中创建控件应该在OnInitDialog中,而不是在OnCreate中
BOOL chinese::OnInitDialog()
{
CDialog::OnInitDialog();
m_Car.Create(CRect(5,73, 0, 0), this, IDC_CAR);
return TRUE;
}
另外给对话框类取名最好带Dlg,以符合MFC的习惯
建议改为CChineseDlg, 一目了然
youhun_1 2003-02-17
  • 打赏
  • 举报
回复
1:m_Car.Create(CRect(5,73, 0, 0), this, IDC_CAR);
中的this改成NULL;
2:对话框的DoModal()改为
if(m_set.DoModal()==IDOK)
{
//你想做的操作
}
试试吧
elvahuang 2003-02-17
  • 打赏
  • 举报
回复
明明就是
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
===> ASSERT(m_hObject == NULL); <====错误

GDI的问题啊????????????

是不是用了还没Detach呢?
steven_sina 2003-02-16
  • 打赏
  • 举报
回复
up
steven_sina 2003-02-16
  • 打赏
  • 举报
回复
谢谢 Mackz(在相互) 的关注,我想应该不是吧,我是在Creat()里面出的错阿,说明是CWnd对象没有清除,你认为为什么是GDI对象没有清除呢?
菜牛 2003-02-15
  • 打赏
  • 举报
回复
我又仔细看了你的问题,你的问题是GDI资源没有释放。
steven_sina 2003-02-15
  • 打赏
  • 举报
回复
up,up,up,up,up,up,up,up,up
steven_sina 2003-02-12
  • 打赏
  • 举报
回复
谢谢上面的分析,但还是不行,可以检查到这个窗体还存在,但用了你的方法还是不行。谢谢
菜牛 2003-02-10
  • 打赏
  • 举报
回复
不是重载,而是调用。你可以在每次调用之前检测是否已经有这个窗体,也就是:
if (myWnd.m_hWnd)
{
myWnd.DestroyWindow();
}
Efeis 2003-02-10
  • 打赏
  • 举报
回复
我想你应该在 DoModal 后面就想办法释放窗口。
如果不行,你想想看还有没有另外一种方式去完成这种功能(是不是控制窗体的显示位置?)
steven_sina 2003-02-10
  • 打赏
  • 举报
回复
顶,我顶,大家来看看,拜托了。。。
steven_sina 2003-02-08
  • 打赏
  • 举报
回复
是啊是啊,谢谢大家的提醒,不过我也知道是资源占用着没有释放啊,但是我就是不知道怎样释放掉,所以才来问大家的,请详细指点。

szhelp(蒙面人) ,谢谢你的建议,不过我怎么作都通不过,确实照你的话作的,你试验过吗?如有好的建议还请指教。

Mackz(在相互) ,不可能啦,我早就想过了,重载过啦,根本不行,你还有别的建议吗,谢谢你的提议。
steven_sina 2003-02-08
  • 打赏
  • 举报
回复
顶啊,顶啊~~~~
VC_j 2003-02-07
  • 打赏
  • 举报
回复
上次的资源你还在占用着呀!要先释放才能再调用。
如:你建一个文件。
文件名A:建立/打开
写入东东。
文件名A:建立/关闭(保存)
错误就发生了。因为你上次建的东西没有释放,就又建立一次。系统不会提醒你说是重建了两次。它只会报一个类似于文件建立失败的错误。
不好意思,语文不大好,但也就这个意思。
rainlight 2003-02-07
  • 打赏
  • 举报
回复
上次的资源没销毁,被占用了.
szhelp 2003-02-06
  • 打赏
  • 举报
回复
从CWnd派生的类所建窗口在关闭之前要删除自身。
覆盖重写virtual void PostNcDestroy( );函数
函数体内只添一句:
delete this;

另外 为何要把这窗口销毁,不能把它隐藏吗?需要时再显示。
IceboundRock 2003-02-06
  • 打赏
  • 举报
回复
对阿,你要先销毁上次创建的对话框才行呢
jindayu 2003-02-06
  • 打赏
  • 举报
回复
up
shorrow 2003-02-06
  • 打赏
  • 举报
回复
楼上说得对,如果 steven_sina 还不明白的话参考msdn的例子
加载更多回复(4)

15,979

社区成员

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

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