解决方案 »
- 关于MFC写的桌面程序使用OAuth来登录的问题,求解答
- 老问题,很多人在网上问了,但没有得到解决,VS2010中C++的IntelliSense功能不能使用
- 请问单文档程序中,如何创建模态对话框?
- 如何获取鼠标在屏幕的位置
- 请问如何修改另外某个程序里的CEdit 文本框里的内容?
- vc6技术内幕上的一个问题,关于windowplacement
- 创建了一个DLL,调用DLL中导出的类,那这个类中的变量,或其他没有导出的类的实例能不能行啊
- MFC单文档程序中,自建类中如何同时读取Mainframe和CxxxView类中的成员变量
- 送分,在函数里将指针下移,返回后又恢复原位置了,怎么解决
- DEAR COMRADS ,HELP ME: 怎样得到一台普通拨号上网的电脑的IP地址。
- VC有没有什么编码规则用于传输的
- 求助牛人帮忙指点个思路,小弟利用键盘钩子做个快捷键
{
CStationMonitorDlg*pDlg = new CStationMonitorDlg();
pDlg->Create(IDD_STATION_MONITOR);
pDlg->ShowWindow(SW_SHOW);
}
不要这样写,因为pDlg可能会作为函数中的局部指针变量,除了函数作用域,出现什么情况就不好控制了。
pDlg最好作为类CBusConDlg的成员变量提前插入声明下,然后在这个OnGridDblClick函数中再new出来,
改在CBusConDlg.h 中申明了还是第二个对话框出现失败
在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;
}
}
和这里
for (vector<CStationMonitorDlg*>::iterator iter = m_vec_Dlg.begin();iter!= m_vec_Dlg.end();iter++)
应该是m_pDlg和m_vec_pDlg,写掉了~
退出时未出现错误,但是有个提示
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 时发生访问冲突
如果这样的话,不用都加到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;
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;
}
}
}
ASSERT(pWnd->m_hWnd == NULL); // only do once
中断
m_pDlg = NULL;
m_pDlg = new CStationMonitorDlg();
意思就是pWnd已经有窗口了。if(pWnd->IsWindow())
{
pWnd->DestroyWindow();
..实际:
你在每次new之前:if(m_pDlg->IsWindow()) m_pDlg->DestroyWindow();
m_pDlg = new CStationMonitorDlg();
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;}
是非模态对话框中包含了一个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控件解决方法我还没有想到,
各位前辈帮我一下