非模态对话框不能创建多个

flyinskylo 2012-10-31 10:48:04

void CBusConDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult)
{


CStationMonitorDlg*pDlg = new CStationMonitorDlg();
pDlg->Create(IDD_STATION_MONITOR);
pDlg->ShowWindow(SW_SHOW);
}

在CStationMonitorDlg.cpp中添加void CStationMonitorDlg::OnCancel()
{
// TODO: 在此添加专用代码和/或调用基类
DestroyWindow();
}


void CStationMonitorDlg::PostNcDestroy()
{
// TODO: 在此添加专用代码和/或调用基类

CDialog::PostNcDestroy();
delete this;
}
我需要双击击每一个单元格都要出CStationMonitorDlg,但是双击了以后出现一个,关闭后再出没问题,出第二个就出错
断点在 pDlg->Create(IDD_STATION_MONITOR);
跟踪到wincore.cpp
void AFXAPI AfxHookWindowCreate(CWnd* pWnd)
{
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
if (pThreadState->m_pWndInit == pWnd)
return;

if (pThreadState->m_hHookOldCbtFilter == NULL)
{
pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,
_AfxCbtFilterHook, NULL, ::GetCurrentThreadId());
if (pThreadState->m_hHookOldCbtFilter == NULL)
AfxThrowMemoryException();
}
ASSERT(pThreadState->m_hHookOldCbtFilter != NULL);
ASSERT(pWnd != NULL);
ASSERT(pWnd->m_hWnd == NULL); // only do once 在此处
ASSERT(pThreadState->m_pWndInit == NULL); // hook not already in progress
pThreadState->m_pWndInit = pWnd;
}
这个错误应该是指针关联的窗口对象只能是一个吧!,我想弹出多个该怎么处理呢?求大家帮帮忙
...全文
289 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyinskylo 2012-11-07
  • 打赏
  • 举报
回复
感谢大家的帮助,我学到了很多,仔细查了下代码,我发现这个不是非模态对话框创建的错误, 是非模态对话框中包含了一个Tab控件里面有两个对话框: 以m_xxxDlg.Create(IDD_BUS_CONDITON,&m_tab_base);的形式创建的, 其中m_xxxDlg是在.cpp中定义的全局变量。 我想应该是m_xxxDlg.Create(IDD_BUS_CONDITON,&m_tab_base);只能做一次吧 YI_RIVER_LOVE 和schlafenhamster 说的很好。 此贴结了吧,非对话框的创建删除的问题解决了,另外Tab控件解决方法我还没有想到, 各位前辈帮我一下
若风09 2012-11-02
  • 打赏
  • 举报
回复
你在每次new之前都赋为NULL
m_pDlg = NULL;
m_pDlg = new CStationMonitorDlg();
若风09 2012-11-02
  • 打赏
  • 举报
回复
这方法我都用了N遍了,没见出错,到你那就不行,奇了~
flyinskylo 2012-11-02
  • 打赏
  • 举报
回复
主要不是在销毁时候出的问题,是在create的时候出来个
ASSERT(pWnd->m_hWnd == NULL); // only do once
中断
schlafenhamster 2012-11-02
  • 打赏
  • 举报
回复
如果是 多个 m_pDlg 那么 这个 m_pDlg 应该是个数组。(或 CPPtrArray)
CXxxxxDlg *m_apDlg[MAX];
new时:
m_apDlg【id】=new CXxxxxDlg;

不要时:

for(int kk=0;kk< Now;kk ++)
{
if(m_apDlg[kk]->IsWindow())
{
m_apDlg[kk]->DestroyWindow();
}

delete [] m_apDlg;

}
schlafenhamster 2012-11-02
  • 打赏
  • 举报
回复
ASSERT(pWnd->m_hWnd == NULL); // only do once
意思就是pWnd已经有窗口了。

if(pWnd->IsWindow())
{
pWnd->DestroyWindow();
..

实际:
你在每次new之前:

if(m_pDlg->IsWindow()) m_pDlg->DestroyWindow();
m_pDlg = new CStationMonitorDlg();
若风09 2012-11-01
  • 打赏
  • 举报
回复
析构函数加个判断:判断vector是否为空
CBusConDlg::~CBusConDlg()
{
if(!m_vec_Dlg.empty())
{
m_pDlg = NULL;
for (vector<CStationMonitorDlg*>::iterator iter = m_vec_Dlg.begin();iter!= m_vec_Dlg.end();iter++)
{
m_pDlg = *iter;
delete m_pDlg;
}
}
}
flyinskylo 2012-11-01
  • 打赏
  • 举报
回复
不是,我需要的是可以开几个非模态对话框CStationMonitorDlg,现在开第二个就报错
raymonzhao 2012-11-01
  • 打赏
  • 举报
回复
OnCancle不要做销毁。
raymonzhao 2012-11-01
  • 打赏
  • 举报
回复
你的需求是不是要这个对话框在ONCANCLE以后,然后还可以再SHOW出来?对话框里是否有状态需要保存?
如果这样的话,不用都加到VECTOR里。
void CBusConDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult)
{

if(NULL != m_pDlg)
{
m_pDlg = new CStationMonitorDlg();
m_pDlg->Create(IDD_STATION_MONITOR);
}
m_pDlg->ShowWindow(SW_SHOW);
}

析构的时候删这一个就可以了。注意在CBusConDlg构造的时候 m_pDlg = NULL;
flyinskylo 2012-11-01
  • 打赏
  • 举报
回复
按5楼说的,还是不行,release模式下忽略错误,但是有重叠部分灰色背景变白问题
flyinskylo 2012-11-01
  • 打赏
  • 举报
回复
帖子不要沉啊,谁能帮我想想办法,非模态对话框我要开多个,我尝试用CArray管理指针但是还是在create的时候提示那个只能做一次绑定的中断。我见别人在单文档模式下,可以开很多,我想这个应该不难吧。release下也能开多个,但是debug老报错,还是方法不对
flyinskylo 2012-10-31
  • 打赏
  • 举报
回复
CStationMonitorDlg*pDlg
改在CBusConDlg.h 中申明了还是第二个对话框出现失败
flyinskylo 2012-10-31
  • 打赏
  • 举报
回复
CStationMonitorDlg

这个类就是个对话框的界面
great_kevin 2012-10-31
  • 打赏
  • 举报
回复
void CBusConDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult)
{


CStationMonitorDlg*pDlg = new CStationMonitorDlg();
pDlg->Create(IDD_STATION_MONITOR);
pDlg->ShowWindow(SW_SHOW);
}
不要这样写,因为pDlg可能会作为函数中的局部指针变量,除了函数作用域,出现什么情况就不好控制了。
pDlg最好作为类CBusConDlg的成员变量提前插入声明下,然后在这个OnGridDblClick函数中再new出来,
shen_wei 2012-10-31
  • 打赏
  • 举报
回复
CStationMonitorDlg

你的这个是怎么写的??
flyinskylo 2012-10-31
  • 打赏
  • 举报
回复
删了这段,暂时行了,好像不太安全。有没有其他的方法,vector我不太熟,我熟悉熟悉,多个窗口时还会出现对话框重叠部分灰色背景变白的问题,是不是应该相应下CStationMonitorDlg的鼠标点击消息,让对话框重绘
flyinskylo 2012-10-31
  • 打赏
  • 举报
回复
按5楼说的做了,
退出时未出现错误,但是有个提示
CBusConDlg::~CBusConDlg()
{
m_pDlg = NULL;
这里 for (vector<CStationMonitorDlg*>::iterator iter = m_vec_pDlg.begin();iter!= m_vec_pDlg.end();iter++)
{
m_pDlg = *iter;
delete m_pDlg;
}

}
monitor.exe 中的 0x00000000 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
若风09 2012-10-31
  • 打赏
  • 举报
回复
CStationMonitorDlg * m_Dlg;
和这里
for (vector<CStationMonitorDlg*>::iterator iter = m_vec_Dlg.begin();iter!= m_vec_Dlg.end();iter++)
应该是m_pDlg和m_vec_pDlg,写掉了~
若风09 2012-10-31
  • 打赏
  • 举报
回复
这样:
在CBusConDlg.h中这样声明
CStationMonitorDlg * m_Dlg;
vector<CStationMonitorDlg*> m_vec_pDlg;

然后,在CBusConDlg的构造函数中,初始化m_Dlg = NULL;
void CBusConDlg::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT* pResult)
{


m_pDlg = new CStationMonitorDlg();
m_pDlg->Create(IDD_STATION_MONITOR);
m_pDlg->ShowWindow(SW_SHOW);
m_vec_pDlg.push_back(m_pDlg);
}
在析构函数中

CBusConDlg::~CBusConDlg()
{
m_pDlg = NULL;
for (vector<CStationMonitorDlg*>::iterator iter = m_vec_Dlg.begin();iter!= m_vec_Dlg.end();iter++)
{
m_pDlg = *iter;
delete m_pDlg;
}
}

15,978

社区成员

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

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