我现在主对话框(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)存在的方法。

解决方案 »

  1.   

    你这里是new的对话框,不要用指针判断,因为对话框销毁的时候如果在OnDestroy里面delete this的话指针就无效了。用IsWindow传入句柄判断。
      

  2.   

    我是用m_btext的值来判断对话框是否存在。就是出现了报错或者值不变的问题。BOOL IsWindow(HWND hWnd); 
    怎么得到我新建对话框的句柄hWnd?
      

  3.   


    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;
    有问题。不要用变量来判断。
      

  4.   

    怎么没用啊~ 我新建窗口后 把新建的窗口关掉了 怎么IsWindow 得到的还是true;
    我简单的设计了一个函数
    if(IsWindow(htext))
    {
    MessageBox("true");
    }
    else
    {
    MessageBox("false");
    }
    没新建对话框的时候 是false, 建立对话框后是true,但把新的对话框关掉后 返回值还是true~
      

  5.   

    m_pText->GetSafeHwnd();得到Hwnd是有效的就可以了。
      

  6.   


    关掉对话框有没有用DestroyWindow?
      

  7.   

    这是系统自己调用的,还是要我来调用的?我就直接点对话框上面的那个X按钮,重载了OnClose()
      

  8.   


    应该自己重载OnDestroy,在里面调用CDialog::OnDestroy,并delete this
    OnClose并没有真正销毁句柄。
      

  9.   

    哦,好,我试试,就是在OnDestroy()函数里,添加句delete this?
      

  10.   


    如果对话框是new出来就得delete this。当然对话框指针就无效了。
      

  11.   

    还是true ,独立的做了个测试程序。void CMyDlg::OnBnClickedButton13()//创建新的对话框
    {
    // 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;
    }
      

  12.   

    void Ctext::OnCancel()
    {
    DestroyWindow();
    //CDialog::OnCancel();
    }void Ctext::PostNcDestroy() 
    {
    // TODO: Add your specialized code here and/or call the base class
    delete this;
    CDialog::PostNcDestroy();
    }
      

  13.   


    需要在OnClose里面调用DestroyWindow
      

  14.   


    重载下
    void Ctext::OnCancel()
    {
        DestroyWindow();
        //CDialog::OnCancel();
    }就好了,OK了
      

  15.   

    你是new, show出来 也就是非模使用。  这个只会在你退出时主动调用DestroyWindow才可以 。 你可以把DestroyWindow放到 析构里 。