CAddDlg dlg(this);//对话框
dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(SW_SHOW);
dlg.Detach();切断局部对象和对话框窗口句柄的联系,可不可以让对话框窗口在局部对象销毁后继续存在?
我记得在《VC++深入详解》中有用Detach把局部菜单对象和窗口联系切断而使菜单窗口不被销毁的例子。
还有 用Detach()切断联系后的窗口资源占的内存什么时候释放?

解决方案 »

  1.   

    那你用指针啊new出的对话框就可以完全自己控制啊,不必担心生命周期的限制。
      

  2.   

    new出的指针是在堆上申请内存的,其生命周期等同于整个程序进程。所以用指针new出的对话框话框窗口在局部对象销毁后可以继续存在,就能不必担心生命周期的限制。
      

  3.   

    你是想了解detach还是想了解局部对象延长生存周期?
      

  4.   

    生命周期是基础啊,外加看一下DestoryWindow就可以了
      

  5.   

    先谢谢大家!
    在《VC++深入详解》中有用Detach把局部菜单对象和窗口联系切断而使菜单窗口不被销毁的例子
    我想问一下对对话框这样做可以吗?
    我试了一下程序会报错,我不知道是我没写对,还是对话框不可以这样做?关于Detach能给详细说说吗?
      

  6.   

    你可以试试CWnd::UnsubclassWindow()函数,不过这样以后你的对话框就不能控制了(比如点击关闭按钮不能关闭等)
      

  7.   

    我试了下,程序没报错,Detach确实可以让对话框在局部对象析构后继续存在,不过这样以后对话框就不能用MFC的方式编写代码来控制了
    无模态对话框占用的内存在调用DestoryWindow后释放,当然你的程序退出后系统也会回收的
    Detach源码:HWND CWnd::Detach()
    {
    HWND hWnd = m_hWnd;
    if (hWnd != NULL)
    {
    CHandleMap* pMap = afxMapHWND(); // don't create if not exist
    if (pMap != NULL)
    pMap->RemoveHandle(m_hWnd);
    m_hWnd = NULL;
    }#ifndef _AFX_NO_OCC_SUPPORT
    m_pCtrlSite = NULL;
    #endif return hWnd;
    }