删除对话框 另一个对话框对象的m_hWnd为空?

chengj2012 2016-10-19 04:13:21
一个对话框类创建了多个对象
当删除其中一个对象时,有时候好的。有时候其它对象的窗口m_hwnd会为空,也被删除了。

部分代码如下
//创建对象
CDlgInfoItem* pItemNew = new CDlgInfoItem;
pItemNew->m_nDlgIndex = nDlgIndex;
pItemNew->m_pDlgVideo = new CDlgVideo(nDlgIndex);
pItemNew->m_pDlgVideo->Create(IDD_DIALOG_VIDEO, NULL);
CString strMsg;
strMsg.Format(_T("视频%d"), nDlgIndex);
pItemNew->m_pDlgVideo->SetWindowText(strMsg);
pItemNew->m_pDlgVideo->ShowWindow(SW_SHOW);

g_DlgInfoList.AddTail(pItemNew);

//删除对象
POSITION pos = g_DlgInfoList.GetHeadPosition();
POSITION posPre = pos;
while (pos != NULL)
{
CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos);
DisConnect(pItem->m_nDlgIndex);
if (pItem->m_pDlgVideo)//该对话框指针对象不为空
{
pItem->m_pDlgVideo->DestroyWindow();//销毁窗口,在销毁窗口时会把其它对象的窗口也销毁
delete pItem->m_pDlgVideo;//删除对象
pItem->m_pDlgVideo = NULL;//释放指针
}
delete g_DlgInfoList.GetAt(posPre);//释放链表数据指针
g_DlgInfoList.RemoveAt(posPre);//移除链表数据
posPre = pos;
}
...全文
524 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengj2012 2016-10-24
  • 打赏
  • 举报
回复
谢谢大家了,最后只能不删除对话框了,要删除的时候改成隐藏,要用的时候再显示。在程序退出再销毁对话框。也算是一种另类的解决办法了。 但是这个问题我还是想解决的,暂时不结帖了。
chengj2012 2016-10-20
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
主要还是看其他变量是否被删除的时候影响了。
我也这么想的,但是我就是 链表对象前删除了 对话框的对象 delete pItem->m_pDlgVideo;//删除对象 pItem->m_pDlgVideo = NULL;//释放指针 然后把链表中这个位置创建的类的对象释放和移除。 delete g_DlgInfoList.GetAt(posPre);//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 链表中其它对象的对话框按理不应该受到影响。但是实际运行偶尔其它对象的对话框也会被销毁。 我后面代码跟进去发现pItem->m_pDlgVideo.m_hwnd变成了NULL,当然,这个PItem,不是我已经删除了的对象
chengj2012 2016-10-20
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
有没有公用的变量? 试试 从头删除或从尾删除 while ( gList.GetCount() > 0) { tType * p = gList.GetHead(); …… delete p; gList.RemoveHead(); }
这个不行,我不确定删除哪个对象先的,整个链表中的任意对象都有可能先删除的
chengj2012 2016-10-20
  • 打赏
  • 举报
回复
引用 1 楼 boylafong 的回复:
其它对象的窗口是什么,哪里定义的
创建了多个结构体对象CDlgInfoItem* pItemNew = new CDlgInfoItem; 该对象里的指针m_pDlgVideo是对话框类的对象,这里面就是对话框的窗口,根据对话框的编号进行对话框的创建 pItemNew->m_pDlgVideo = new CDlgVideo(nDlgIndex);
worldy 2016-10-20
  • 打赏
  • 举报
回复
//删除对象 POSITION pos = g_DlgInfoList.GetHeadPosition(); POSITION posPre = pos; while (pos != NULL) { CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); DisConnect(pItem->m_nDlgIndex); if (pItem->m_pDlgVideo)//该对话框指针对象不为空 //按照你创建的逻辑pDlgVideo都为真 { pItem->m_pDlgVideo->DestroyWindow();//销毁窗口,在销毁窗口时会把其它对象的窗口也销毁 delete pItem->m_pDlgVideo;//删除对象 //上面两句,你自己删除了了所有创建的对象 pItem->m_pDlgVideo = NULL;//释放指针 } delete g_DlgInfoList.GetAt(posPre);//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 posPre = pos; } 更多 0
oyljerry 2016-10-20
  • 打赏
  • 举报
回复
主要还是看其他变量是否被删除的时候影响了。
zgl7903 2016-10-20
  • 打赏
  • 举报
回复
有没有公用的变量? 试试 从头删除或从尾删除 while ( gList.GetCount() > 0) { tType * p = gList.GetHead(); …… delete p; gList.RemoveHead(); }
boylafong 2016-10-20
  • 打赏
  • 举报
回复
其它对象的窗口是什么,哪里定义的
chengj2012 2016-10-20
  • 打赏
  • 举报
回复
谢谢各位大哥细心看,前面的代码可能不够清楚,小弟我重新整理了下。 问题描述:当删除其中一个链表对象的对话框指针时,有时候好的。有时候其它对象的对话框指针指向的m_hwnd会为空,其对应的对话框也莫名其妙的被删除了。链表的对象和对话框指针本身还是存在的。 这些是动态库里面的代码,我主程序就是调用了创建对话框和删除对话框 为了方便查找问题,视频连接和断开连接部分的操作全都屏蔽掉了。 创建对话框是多线程发消息PostMessage(传递的参数是new出来的,消息处理完了才释放)到主线程,由主线程去操作调用动态库创建对话框的接口。 删除对话框相同方法处理。 另外我也用SendMessage测试过(也不行) 以上通过获取线程编号测试过,不存在多线程的问题了。 真的头大了,怎么看都没问题。 另外我专门做了个测试程序,不通过消息,直接调用创建,那是可以的,删除哪个就是哪个。 //对话框信息类 class CDlgInfoItem : public CObject { public: int m_nDlgIndex;//对话框编号 CDlgVideo* m_pDlgVideo;//对话框指针对象 CDlgInfoItem() { m_nDlgIndex = 0; m_pDlgVideo = NULL; }; }; CTypedPtrList <CObList,CDlgInfoItem*> g_DlgInfoList;//对话框信息链表 //创建对象 void CXXApp::DlgCreate(int nDlgIndex) { CDlgInfoItem* pItemNew = new CDlgInfoItem;;//创建类的对象 pItemNew->m_nDlgIndex = nDlgIndex;//给该对象指定对话框编号 //给该对象的对话框指针创建对话框 pItemNew->m_pDlgVideo = new CDlgVideo(nDlgIndex); pItemNew->m_pDlgVideo->Create(IDD_DIALOG_VIDEO, NULL); //设置对话框标题,编号显示 CString strMsg; strMsg.Format(_T("视频%d"), nDlgIndex); pItemNew->m_pDlgVideo->SetWindowText(strMsg); pItemNew->m_pDlgVideo->ShowWindow(SW_SHOW);//显示对话框 g_DlgInfoList.AddTail(pItemNew);//将对象插入链表 } 删除链表对象和其对话框 void CXXApp::DlgDelete(int nDlgIndex) { POSITION posPre = NULL; POSITION pos = g_DlgInfoList.GetHeadPosition(); while (pos != NULL) { posPre = pos; CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); if (pItem->m_nDlgIndex == nDlgIndex)//找到对应对话框下标 { //DisConnect(nDlgIndex);//断开视频 if (pItem->m_pDlgVideo)//该对话框指针对象不为空 { pItem->m_pDlgVideo->DestroyWindow();//销毁窗口 delete pItem->m_pDlgVideo;//删除对象 pItem->m_pDlgVideo = NULL;//释放指针 } delete pItem;//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 break;//跳出循环 } } }
chengj2012 2016-10-20
  • 打赏
  • 举报
回复
引用 12 楼 worldy 的回复:
[quote=引用 10 楼 chengj2012 的回复:] [quote=引用 4 楼 worldy 的回复:] //删除对象 POSITION pos = g_DlgInfoList.GetHeadPosition(); POSITION posPre = pos; while (pos != NULL) { CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); DisConnect(pItem->m_nDlgIndex); if (pItem->m_pDlgVideo)//该对话框指针对象不为空 //按照你创建的逻辑pDlgVideo都为真 { pItem->m_pDlgVideo->DestroyWindow();//销毁窗口,在销毁窗口时会把其它对象的窗口也销毁 delete pItem->m_pDlgVideo;//删除对象 //上面两句,你自己删除了了所有创建的对象 pItem->m_pDlgVideo = NULL;//释放指针 } delete g_DlgInfoList.GetAt(posPre);//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 posPre = pos; } 更多 0
上面我应该有两层对象的,第一层是 类CDlgInfoItem的对象 CDlgInfoItem* pItemNew = new CDlgInfoItem; 第二层是 类的对象里一个指针指向对话框的对象 pItemNew->m_pDlgVideo = new CDlgVideo(nDlgIndex); 我删除的是这个类的对象下的对话框对象 但是这个类其它对象下的对话框也被删除了,这些对话框都是同一各对话框类的不同对象创建的[/quote] 我想我应该明白你的意思了。你应该由后往前删除,或者,在CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); 后,加入pos = g_DlgInfoList.GetHeadPosition();
CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos);
pos = g_DlgInfoList.GetHeadPosition();
[/quote] 是我代码贴错了,这个删除只是删一个的,删除其中一个链表对象,删除后就break跳出了,不会执行下去了。
worldy 2016-10-20
  • 打赏
  • 举报
回复
引用 10 楼 chengj2012 的回复:
[quote=引用 4 楼 worldy 的回复:] //删除对象 POSITION pos = g_DlgInfoList.GetHeadPosition(); POSITION posPre = pos; while (pos != NULL) { CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); DisConnect(pItem->m_nDlgIndex); if (pItem->m_pDlgVideo)//该对话框指针对象不为空 //按照你创建的逻辑pDlgVideo都为真 { pItem->m_pDlgVideo->DestroyWindow();//销毁窗口,在销毁窗口时会把其它对象的窗口也销毁 delete pItem->m_pDlgVideo;//删除对象 //上面两句,你自己删除了了所有创建的对象 pItem->m_pDlgVideo = NULL;//释放指针 } delete g_DlgInfoList.GetAt(posPre);//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 posPre = pos; } 更多 0
上面我应该有两层对象的,第一层是 类CDlgInfoItem的对象 CDlgInfoItem* pItemNew = new CDlgInfoItem; 第二层是 类的对象里一个指针指向对话框的对象 pItemNew->m_pDlgVideo = new CDlgVideo(nDlgIndex); 我删除的是这个类的对象下的对话框对象 但是这个类其它对象下的对话框也被删除了,这些对话框都是同一各对话框类的不同对象创建的[/quote] 我想我应该明白你的意思了。你应该由后往前删除,或者,在CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); 后,加入pos = g_DlgInfoList.GetHeadPosition();
CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos);
pos = g_DlgInfoList.GetHeadPosition();
chengj2012 2016-10-20
  • 打赏
  • 举报
回复
引用 8 楼 VisualEleven 的回复:
你窗口销毁的时候,它的子窗口以及被它Ownner的窗口也会销毁~
问题我这是两个独立的弹出框,没有任何父子关系,也是两个不同对象创建的窗口,唯一的关系就是用的同一个对话框类创建的对话框。
引用 9 楼 jason_wentzel 的回复:
改成下面的试试 //删除对象 POSITION posPre = NULL; POSITION pos = g_DlgInfoList.GetHeadPosition(); while (pos != NULL) { posPre = pos; CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); DisConnect(pItem->m_nDlgIndex); if (pItem->m_pDlgVideo)//该对话框指针对象不为空 { pItem->m_pDlgVideo->DestroyWindow();//销毁窗口,在销毁窗口时会把其它对象的窗口也销毁 delete pItem->m_pDlgVideo;//删除对象 pItem->m_pDlgVideo = NULL;//释放指针 delete pItem;//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 } }
试了,还是不行,这部分代码没有实质性的改进,不过这样写更加方便阅读,比我原先写法好,O(∩_∩)O哈哈~
chengj2012 2016-10-20
  • 打赏
  • 举报
回复
引用 4 楼 worldy 的回复:
//删除对象 POSITION pos = g_DlgInfoList.GetHeadPosition(); POSITION posPre = pos; while (pos != NULL) { CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); DisConnect(pItem->m_nDlgIndex); if (pItem->m_pDlgVideo)//该对话框指针对象不为空 //按照你创建的逻辑pDlgVideo都为真 { pItem->m_pDlgVideo->DestroyWindow();//销毁窗口,在销毁窗口时会把其它对象的窗口也销毁 delete pItem->m_pDlgVideo;//删除对象 //上面两句,你自己删除了了所有创建的对象 pItem->m_pDlgVideo = NULL;//释放指针 } delete g_DlgInfoList.GetAt(posPre);//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 posPre = pos; } 更多 0
上面我应该有两层对象的,第一层是 类CDlgInfoItem的对象 CDlgInfoItem* pItemNew = new CDlgInfoItem; 第二层是 类的对象里一个指针指向对话框的对象 pItemNew->m_pDlgVideo = new CDlgVideo(nDlgIndex); 我删除的是这个类的对象下的对话框对象 但是这个类其它对象下的对话框也被删除了,这些对话框都是同一各对话框类的不同对象创建的
孤客天涯 2016-10-20
  • 打赏
  • 举报
回复
改成下面的试试 //删除对象 POSITION posPre = NULL; POSITION pos = g_DlgInfoList.GetHeadPosition(); while (pos != NULL) { posPre = pos; CDlgInfoItem *pItem = (CDlgInfoItem*)g_DlgInfoList.GetNext(pos); DisConnect(pItem->m_nDlgIndex); if (pItem->m_pDlgVideo)//该对话框指针对象不为空 { pItem->m_pDlgVideo->DestroyWindow();//销毁窗口,在销毁窗口时会把其它对象的窗口也销毁 delete pItem->m_pDlgVideo;//删除对象 pItem->m_pDlgVideo = NULL;//释放指针 delete pItem;//释放链表数据指针 g_DlgInfoList.RemoveAt(posPre);//移除链表数据 } }
Eleven 2016-10-20
  • 打赏
  • 举报
回复
你窗口销毁的时候,它的子窗口以及被它Ownner的窗口也会销毁~

15,979

社区成员

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

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