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

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;
}
这个错误应该是指针关联的窗口对象只能是一个吧!,我想弹出多个该怎么处理呢?求大家帮帮忙
...全文
298 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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;
}
}
2024 年 Uber 乘车分析数据集 这个综合数据集包含 2024 年 Uber 运营的详细拼车数据,提供了有关预订模式、车辆性能、收入流、取消行为和客户满意度指标的丰富见解。 数据集概述 该数据集捕获了多种车辆类型的 148,770 个总预订,并提供了拼车作的完整视图,包括成功乘车、取消、客户行为和财务指标。 主要统计数据: 总预订量:148.77K 次乘车 成功率:65.96%(93K 完成骑行) 取消率:25%(37.43K 取消预订) 客户取消:19.15%(27K 乘车) 司机取消: 7.45% (10.5K 乘车) 数据模式 数据集包含以下列: 列名称 描述 Date 预订日期 Time 预订时间 Booking ID 每次行程预订的唯一标识符 Booking Status 预订状态(已完成、客户取消、司机取消等) Customer ID 客户的唯一标识符 Vehicle Type 车辆类型(Go Mini、Go Sedan、Auto、eBike/Bike、UberXL、Premier Sedan) Pickup Location 游乐设施的起点 Drop Location 乘车目的地 Avg VTAT 司机到达上车地点的平均时间(以分钟为单位) Avg CTAT 从取件到目的地的平均行程时间(以分钟为单位) Cancelled Rides by Customer 客户发起的取消标志 Reason for cancelling by Customer 客户取消原因 Cancelled Rides by Driver 驱动程序启动的取消标志 Driver Cancellation Reason 司机取消原因 Incomplete Rides 未完成骑行标志 Incomplete Rides Reason 不完整骑行的原因

15,978

社区成员

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

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