我现在主对话框(KLS)上放个按钮,双击按钮创建一个新的对话框(text)。我就是想在KLS.cpp能够判断新的对话框(text)存在与否?我本来是这么做的,在KlsDlg.h里定义一个bool m_btext; KlsDlg.cpp里面创建对话框(text)后把m_btext=true;
在对话框(text)类text.cpp里重载了OnClose() 把:
CKlsDlg * pKls;
Pkls->m_btext=false;
但执行的时候 Pkls->m_btext=false 报未处理异常,****写入异常。
我就瞎加了句:
CKlsDlg * pKls;
pKls= new CKlsDlg ;
Pkls->m_btext=false;
不报错了,但m_btext的值却没有改变~还是true;
不清楚问题出在哪里?我头文件调用 在KlsDlg.h里 #include "Text.h" 。 在text.cpp里#include "KlsDlg.h"
在text.h里#include "KlsDlg.h"的话会报错。
创建text对话框的代码是:
m_pText = new CText(this);
m_pText->Create(IDD_DIALOG5,this);
m_pText->MoveWindow(100,50,1000,600);
m_pText->ShowWindow(SW_SHOW);
m_btext=true;
请高手指点下问题出在哪里,或者其他能判断对话框(text)存在的方法。
在对话框(text)类text.cpp里重载了OnClose() 把:
CKlsDlg * pKls;
Pkls->m_btext=false;
但执行的时候 Pkls->m_btext=false 报未处理异常,****写入异常。
我就瞎加了句:
CKlsDlg * pKls;
pKls= new CKlsDlg ;
Pkls->m_btext=false;
不报错了,但m_btext的值却没有改变~还是true;
不清楚问题出在哪里?我头文件调用 在KlsDlg.h里 #include "Text.h" 。 在text.cpp里#include "KlsDlg.h"
在text.h里#include "KlsDlg.h"的话会报错。
创建text对话框的代码是:
m_pText = new CText(this);
m_pText->Create(IDD_DIALOG5,this);
m_pText->MoveWindow(100,50,1000,600);
m_pText->ShowWindow(SW_SHOW);
m_btext=true;
请高手指点下问题出在哪里,或者其他能判断对话框(text)存在的方法。
怎么得到我新建对话框的句柄hWnd?
m_pText = new CText(this);
m_pText->Create(IDD_DIALOG5,this);
m_pText->MoveWindow(100,50,1000,600);
m_pText->ShowWindow(SW_SHOW);
HWND hWnd = m_pText->GetSafeHwnd();IsWindow(hWnd)你这个
CKlsDlg * pKls;
pKls= new CKlsDlg ;
Pkls->m_btext=false;
有问题。不要用变量来判断。
我简单的设计了一个函数
if(IsWindow(htext))
{
MessageBox("true");
}
else
{
MessageBox("false");
}
没新建对话框的时候 是false, 建立对话框后是true,但把新的对话框关掉后 返回值还是true~
关掉对话框有没有用DestroyWindow?
应该自己重载OnDestroy,在里面调用CDialog::OnDestroy,并delete this
OnClose并没有真正销毁句柄。
如果对话框是new出来就得delete this。当然对话框指针就无效了。
{
// TODO: 在此添加控件通知处理程序代码
m_pText = new Ctext(this);
m_pText->Create(IDD_DIALOG2,this);
m_pText->MoveWindow(100,50,1000,600);
m_pText->ShowWindow(SW_SHOW);
htext = m_pText->GetSafeHwnd();
}void CMyDlg::OnBnClickedButton14()//检测对话框是否存在
{
// TODO: 在此添加控件通知处理程序代码
if(IsWindow(htext))
{
MessageBox("true");
}
else
{
MessageBox("false");
}
}在新的对话框没执行什么操作,重载了ONCLOSE ONDESTROYvoid Ctext::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnClose();
}void Ctext::OnDestroy()
{
CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
delete this;
}
{
DestroyWindow();
//CDialog::OnCancel();
}void Ctext::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this;
CDialog::PostNcDestroy();
}
需要在OnClose里面调用DestroyWindow
重载下
void Ctext::OnCancel()
{
DestroyWindow();
//CDialog::OnCancel();
}就好了,OK了