在线等高手批点

时间:2022-02-18 17:32:20
在Dlg上放了一个按钮B,点击B后弹出Dlg1,在Dlg1上有个按钮B1,点击B1后销毁Dlg1,这是问题的简单说明,
我现在是在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


引用楼主 hgy605 的回复:
m_Dlg1.Create(CDlg1::IDD)之后会出现堆栈错误,前一个帖有的朋友说可以在点击B1时隐藏m_Dlg1,可我做的B按钮是一个 “新建”按钮,如果我在Dlg1上放一个Edit,再输入文字,如果窗口只是隐藏,那再次点新建时,明显文字会存在,
你可以重新更新一下对话框控件的文本啊。使用SetWindowText
我想肯定是B1中没有彻底把 m_Dlg1 create出来的对话框m_Dlg1彻底销毁,不然不会再次create就报错,求高手指点,指针new也试过,同样的问题。

#3


非模态对话框的关闭不等于销毁,关闭只是隐藏了而已
而且,你判断窗口是否存在的方法也不对应该是这样
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; //删除对象本身
}

#6


http://www.vckbase.com/document/viewdoc/?id=794

无模式对话框的创建与使用


里面可以解决楼主的问题

#7


引用 3 楼 jackson35296 的回复:
非模态对话框的关闭不等于销毁,关闭只是隐藏了而已
而且,你判断窗口是否存在的方法也不对应该是这样
if( !::IsWindow( m_Dlg1.GetSafeHwnd() ) )
{
  m_Dlg1.Create(CDlg1::IDD)
  m_Dlg1.ShowWindow(SW_SHOW);
}
在B1中加上了PostMessage( WM_DESTROY );

刚试过了,PostMessage( WM_DESTROY );关闭不了对话框

#8


在按钮B1的处理中直接调用CDialog::DestroyWindow();不要调用OnCancel(),也不要发送CLOSE消息

如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this

#9


引用 8 楼 antheus 的回复:
在按钮B1的处理中直接调用CDialog::DestroyWindow()不要调用OnCancel(),也不要发送CLOSE消息

如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this


如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this,放在CDialog::PostNcDestroy()后面。
如果对话框声明的不是指针就不用重载这个

#10


对话框m_Dlg1是在Dlg作为成员变量声明的CDlg1 m_Dlg1,DestoryWindow后再次点B时,直接堆栈错误

#11


我在刚才那个帖子里已经回答你了啊!
按那个肯定可以的……

您怎么还在纠结这个问题……

#12


引用 9 楼 antheus 的回复:
引用 8 楼 antheus 的回复:
在按钮B1的处理中直接调用CDialog::DestroyWindow()不要调用OnCancel(),也不要发送CLOSE消息

如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this


如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestr……

都试过了,无效,只有动态分配能解决这个问题了,看来

#13


Dlg1是模式还是非模式

#14


非模态,不是纠结,我就是想知道是不是除了new外,还有没有别的方法,

#15


B1改用DestoryWindow()时发现第二次点击B时,到了m_Dlg1.Create(CDlg1::IDD)之后会出现堆栈错误

这个不应该啊,调用DestroyWindow是可以销毁对话框的,我经常这么用啊。

#16


引用 10 楼 hgy605 的回复:
对话框m_Dlg1是在Dlg作为成员变量声明的CDlg1 m_Dlg1,DestoryWindow后再次点B时,直接堆栈错误


那是因为你做了别的处理。只调用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


引用楼主 hgy605 的回复:
m_Dlg1.Create(CDlg1::IDD)之后会出现堆栈错误,前一个帖有的朋友说可以在点击B1时隐藏m_Dlg1,可我做的B按钮是一个 “新建”按钮,如果我在Dlg1上放一个Edit,再输入文字,如果窗口只是隐藏,那再次点新建时,明显文字会存在,
你可以重新更新一下对话框控件的文本啊。使用SetWindowText
我想肯定是B1中没有彻底把 m_Dlg1 create出来的对话框m_Dlg1彻底销毁,不然不会再次create就报错,求高手指点,指针new也试过,同样的问题。

#3


非模态对话框的关闭不等于销毁,关闭只是隐藏了而已
而且,你判断窗口是否存在的方法也不对应该是这样
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; //删除对象本身
}

#6


http://www.vckbase.com/document/viewdoc/?id=794

无模式对话框的创建与使用


里面可以解决楼主的问题

#7


引用 3 楼 jackson35296 的回复:
非模态对话框的关闭不等于销毁,关闭只是隐藏了而已
而且,你判断窗口是否存在的方法也不对应该是这样
if( !::IsWindow( m_Dlg1.GetSafeHwnd() ) )
{
  m_Dlg1.Create(CDlg1::IDD)
  m_Dlg1.ShowWindow(SW_SHOW);
}
在B1中加上了PostMessage( WM_DESTROY );

刚试过了,PostMessage( WM_DESTROY );关闭不了对话框

#8


在按钮B1的处理中直接调用CDialog::DestroyWindow();不要调用OnCancel(),也不要发送CLOSE消息

如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this

#9


引用 8 楼 antheus 的回复:
在按钮B1的处理中直接调用CDialog::DestroyWindow()不要调用OnCancel(),也不要发送CLOSE消息

如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this


如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this,放在CDialog::PostNcDestroy()后面。
如果对话框声明的不是指针就不用重载这个

#10


对话框m_Dlg1是在Dlg作为成员变量声明的CDlg1 m_Dlg1,DestoryWindow后再次点B时,直接堆栈错误

#11


我在刚才那个帖子里已经回答你了啊!
按那个肯定可以的……

您怎么还在纠结这个问题……

#12


引用 9 楼 antheus 的回复:
引用 8 楼 antheus 的回复:
在按钮B1的处理中直接调用CDialog::DestroyWindow()不要调用OnCancel(),也不要发送CLOSE消息

如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestroy(),在里面delete this


如果你的对话框是声明的指针,而且用new创建,那你需要重载虚函数PostNcDestr……

都试过了,无效,只有动态分配能解决这个问题了,看来

#13


Dlg1是模式还是非模式

#14


非模态,不是纠结,我就是想知道是不是除了new外,还有没有别的方法,

#15


B1改用DestoryWindow()时发现第二次点击B时,到了m_Dlg1.Create(CDlg1::IDD)之后会出现堆栈错误

这个不应该啊,调用DestroyWindow是可以销毁对话框的,我经常这么用啊。

#16


引用 10 楼 hgy605 的回复:
对话框m_Dlg1是在Dlg作为成员变量声明的CDlg1 m_Dlg1,DestoryWindow后再次点B时,直接堆栈错误


那是因为你做了别的处理。只调用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();
}

注意头文件