我现在是在Dlg中声明了成员变量CDlg1 m_Dlg1,在按钮B中,加上了
if(!m_Dlg1.m_hWnd)
m_Dlg1.Create(CDlg1::IDD)
m_Dlg1.ShowWindow(SW_SHOW);
....
在B1中加上了PostMessage(WM_SYSCOMMAND,SC_CLOSE,0);
发现B1并没有把m_Dlg1销毁掉,B1改用DestoryWindow()时发现第二次点击B时,到了m_Dlg1.Create(CDlg1::IDD)之后会出现堆栈错误,前一个帖有的朋友说可以在点击B1时隐藏m_Dlg1,可我做的B按钮是一个“新建”按钮,如果我在Dlg1上放一个Edit,再输入文字,如果窗口只是隐藏,那再次点新建时,明显文字会存在,
我想肯定是B1中没有彻底把m_Dlg1 create出来的对话框m_Dlg1彻底销毁,不然不会再次create就报错,求高手指点,指针new也试过,同样的问题。
22 个解决方案
#1
看的头晕了
#2
#3
非模态对话框的关闭不等于销毁,关闭只是隐藏了而已
而且,你判断窗口是否存在的方法也不对应该是这样
if( !::IsWindow( m_Dlg1.GetSafeHwnd() ) )
{
m_Dlg1.Create(CDlg1::IDD)
m_Dlg1.ShowWindow(SW_SHOW);
}
在B1中加上了PostMessage( WM_DESTROY );
而且,你判断窗口是否存在的方法也不对应该是这样
if( !::IsWindow( m_Dlg1.GetSafeHwnd() ) )
{
m_Dlg1.Create(CDlg1::IDD)
m_Dlg1.ShowWindow(SW_SHOW);
}
在B1中加上了PostMessage( WM_DESTROY );
#4
new可以解决这个问题,难道非得用动态分配!,有没有别的方法
#5
非模态对话框建议在堆上创建
先在dlg上定义Cdlg1* pd;
然后在点击B时:
pd=new Cdlg1(m_hwnd); //堆分配非模态对话框内存空间,
//Cdlg1(CWnd* pParent=NULL)为构造函数
pd->Create(IDD_MYDIALOG,pWnd);
pd->ShowWindow(SW_SHOW);
关闭pd时使用CWnd::DestroyWindow
同时处理下面的虚函数
void Cdlg1::PostNcDestroy
{
delete this; //删除对象本身
}
先在dlg上定义Cdlg1* pd;
然后在点击B时:
pd=new Cdlg1(m_hwnd); //堆分配非模态对话框内存空间,
//Cdlg1(CWnd* pParent=NULL)为构造函数
pd->Create(IDD_MYDIALOG,pWnd);
pd->ShowWindow(SW_SHOW);
关闭pd时使用CWnd::DestroyWindow
同时处理下面的虚函数
void Cdlg1::PostNcDestroy
{
delete this; //删除对象本身
}
#7
刚试过了,PostMessage( WM_DESTROY );关闭不了对话框
#8
在按钮B1的处理中直接调用CDialog::DestroyWindow();不要调用OnCancel(),也不要发送CLOSE消息
如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this
如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this
#9
如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this,放在CDialog::PostNcDestroy()后面。
如果对话框声明的不是指针就不用重载这个
#10
对话框m_Dlg1是在Dlg作为成员变量声明的CDlg1 m_Dlg1,DestoryWindow后再次点B时,直接堆栈错误
#11
我在刚才那个帖子里已经回答你了啊!
按那个肯定可以的……
您怎么还在纠结这个问题……
按那个肯定可以的……
您怎么还在纠结这个问题……
#12
都试过了,无效,只有动态分配能解决这个问题了,看来
#13
Dlg1是模式还是非模式
#14
非模态,不是纠结,我就是想知道是不是除了new外,还有没有别的方法,
#15
B1改用DestoryWindow()时发现第二次点击B时,到了m_Dlg1.Create(CDlg1::IDD)之后会出现堆栈错误
这个不应该啊,调用DestroyWindow是可以销毁对话框的,我经常这么用啊。
这个不应该啊,调用DestroyWindow是可以销毁对话框的,我经常这么用啊。
#16
那是因为你做了别的处理。只调用DestoryWindow就可以了
#17
把你的OnBtB()和OnBtB1()贴出来看看,我就不相信了~
#18
在B1按钮的里面写 OnCancel();
#19
事实如此,算了,不纠结了,以后用new就行了。
#20
模式、非模式窗口的创建搞混了
#21
1209871329837
#22
//在.h中CNewDlg *m_pDlg1;
//Dlg上的B的响应
void CCreateDlgDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if( m_pDlg1 != NULL)
{
delete m_pDlg1;
m_pDlg1 = NULL;
}
if(m_pDlg1->GetSafeHwnd() == NULL)
{
m_pDlg1 = new CNewDlg();
if(m_pDlg1 != NULL)
{
BOOL ret = m_pDlg1->Create(IDD_DIALOG1,this);
if(!ret) //Create failed.
AfxMessageBox("Error creating Dialog");
//m_pDlg1->ShowWindow(SW_SHOW);
}
}
}
//ResourceView中添加一个dlg资源,对这个资源创建一个新的class即 dlg1.上面有一个按钮B1
添加B1的消息响应
void CNewDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//ShowWindow(SW_HIDE);
DestroyWindow();
}
注意头文件
#1
看的头晕了
#2
#3
非模态对话框的关闭不等于销毁,关闭只是隐藏了而已
而且,你判断窗口是否存在的方法也不对应该是这样
if( !::IsWindow( m_Dlg1.GetSafeHwnd() ) )
{
m_Dlg1.Create(CDlg1::IDD)
m_Dlg1.ShowWindow(SW_SHOW);
}
在B1中加上了PostMessage( WM_DESTROY );
而且,你判断窗口是否存在的方法也不对应该是这样
if( !::IsWindow( m_Dlg1.GetSafeHwnd() ) )
{
m_Dlg1.Create(CDlg1::IDD)
m_Dlg1.ShowWindow(SW_SHOW);
}
在B1中加上了PostMessage( WM_DESTROY );
#4
new可以解决这个问题,难道非得用动态分配!,有没有别的方法
#5
非模态对话框建议在堆上创建
先在dlg上定义Cdlg1* pd;
然后在点击B时:
pd=new Cdlg1(m_hwnd); //堆分配非模态对话框内存空间,
//Cdlg1(CWnd* pParent=NULL)为构造函数
pd->Create(IDD_MYDIALOG,pWnd);
pd->ShowWindow(SW_SHOW);
关闭pd时使用CWnd::DestroyWindow
同时处理下面的虚函数
void Cdlg1::PostNcDestroy
{
delete this; //删除对象本身
}
先在dlg上定义Cdlg1* pd;
然后在点击B时:
pd=new Cdlg1(m_hwnd); //堆分配非模态对话框内存空间,
//Cdlg1(CWnd* pParent=NULL)为构造函数
pd->Create(IDD_MYDIALOG,pWnd);
pd->ShowWindow(SW_SHOW);
关闭pd时使用CWnd::DestroyWindow
同时处理下面的虚函数
void Cdlg1::PostNcDestroy
{
delete this; //删除对象本身
}
#6
#7
刚试过了,PostMessage( WM_DESTROY );关闭不了对话框
#8
在按钮B1的处理中直接调用CDialog::DestroyWindow();不要调用OnCancel(),也不要发送CLOSE消息
如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this
如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this
#9
如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this,放在CDialog::PostNcDestroy()后面。
如果对话框声明的不是指针就不用重载这个
#10
对话框m_Dlg1是在Dlg作为成员变量声明的CDlg1 m_Dlg1,DestoryWindow后再次点B时,直接堆栈错误
#11
我在刚才那个帖子里已经回答你了啊!
按那个肯定可以的……
您怎么还在纠结这个问题……
按那个肯定可以的……
您怎么还在纠结这个问题……
#12
都试过了,无效,只有动态分配能解决这个问题了,看来
#13
Dlg1是模式还是非模式
#14
非模态,不是纠结,我就是想知道是不是除了new外,还有没有别的方法,
#15
B1改用DestoryWindow()时发现第二次点击B时,到了m_Dlg1.Create(CDlg1::IDD)之后会出现堆栈错误
这个不应该啊,调用DestroyWindow是可以销毁对话框的,我经常这么用啊。
这个不应该啊,调用DestroyWindow是可以销毁对话框的,我经常这么用啊。
#16
那是因为你做了别的处理。只调用DestoryWindow就可以了
#17
把你的OnBtB()和OnBtB1()贴出来看看,我就不相信了~
#18
在B1按钮的里面写 OnCancel();
#19
事实如此,算了,不纠结了,以后用new就行了。
#20
模式、非模式窗口的创建搞混了
#21
1209871329837
#22
//在.h中CNewDlg *m_pDlg1;
//Dlg上的B的响应
void CCreateDlgDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if( m_pDlg1 != NULL)
{
delete m_pDlg1;
m_pDlg1 = NULL;
}
if(m_pDlg1->GetSafeHwnd() == NULL)
{
m_pDlg1 = new CNewDlg();
if(m_pDlg1 != NULL)
{
BOOL ret = m_pDlg1->Create(IDD_DIALOG1,this);
if(!ret) //Create failed.
AfxMessageBox("Error creating Dialog");
//m_pDlg1->ShowWindow(SW_SHOW);
}
}
}
//ResourceView中添加一个dlg资源,对这个资源创建一个新的class即 dlg1.上面有一个按钮B1
添加B1的消息响应
void CNewDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//ShowWindow(SW_HIDE);
DestroyWindow();
}
注意头文件