显示或者隐藏

  当点击CDockablePane上的关闭按钮时,并不能将其关闭,知识将其隐藏了起来,如果需要重新显示或隐藏,则相关命令的响应函数如下:

  1. if(m_Panes.GetSafeHwnd())
  2. {
  3. BOOL flag = !m_Panes.IsVisible();
  4. m_Panes.ShowPane(flag,FALSE,flag);
  5. }

关闭按钮的响应函数

  当点击CDockablePane上的关闭按钮时,主框架会进行响应

  1. //关闭停靠窗口事件,事实上是隐藏窗体,还是占用资源的
  2. BOOL CMainFrame::OnCloseDockingPane(CDockablePane* pWnd) ;
  3. //关闭悬浮窗口事件,事实上液是隐藏窗体,还是占用资源的
  4. BOOL CMainFrame::OnCloseMiniFrame(CPaneFrameWnd* pWnd)

  因此,如果仅仅是重写这两个消息,没做什么处理,那么内存还是消不下去,经过调试,获知如下方式可以真正销毁关闭该Dock窗体:

  //停靠窗体关闭
  BOOL CMainFrame::OnCloseDockingPane(CDockablePane* pWnd)
  {
    //处理关闭事件
      if(pWnd->IsKindOf(RUNTIME_CLASS(CTabbedPane)))

     { //多个窗口
           CTabbedPane* tabpane = (CTabbedPane *)pWnd;
           CMFCBaseTabCtrl* pTabWnd =
tabpane->GetUnderlyingWindow();
           int num = pTabWnd->GetActiveTab();
           if(num >= 0)

        {   //这里仅仅关闭活动的面板
               CDockablePane* pBar =
DYNAMIC_DOWNCAST(CDockablePane, pTabWnd->GetTabWnd(num));
                 if (pBar != NULL)
                 {
                     ASSERT_VALID(pBar);
                    //将关闭消息加入该DockPane队列,等待完成本函数后关闭
                     ::PostMessageA(pBar->m_hWnd
,WM_CLOSE, 0 , 0);
                 }
           }
      }
     else

    {

      //单个窗口
         CDockablePane* pane = (CDockablePane*)pWnd;
         if(pane->IsKindOf(RUNTIME_CLASS(CDockablePane))
||  pane->IsKindOf(RUNTIME_CLASS(CPane))

      && !pane>IsKindOf(RUNTIME_CLASS(CMFCToolBar)))

      {
                //将关闭消息加入该DockPane队列,等待完成本函数后关闭
                ::PostMessageA(pane->m_hWnd
,WM_CLOSE, 0 , 0);
           }
      }
      return TRUE;
  }

//关闭悬浮窗体
  BOOL CMainFrame::OnCloseMiniFrame(CPaneFrameWnd* pWnd)
  {
     //处理关闭事件
      CWnd* pwnd = pWnd->GetPane();
      if(pwnd->IsKindOf(RUNTIME_CLASS(CTabbedPane)))

     {

       //多个窗口
          CTabbedPane* tabpane = (CTabbedPane *)pwnd;
          CMFCBaseTabCtrl* pTabWnd =
tabpane->GetUnderlyingWindow();
           //关闭所有的面板
           for(int
i=0;i<pTabWnd->GetTabsNum();i++)
           {
                CDockablePane* pBar
= DYNAMIC_DOWNCAST(CDockablePane, pTabWnd->GetTabWnd(i));
                if (pBar != NULL)
                {
                     ASSERT_VALID(pBar);
                    //将关闭消息加入该DockPane队列,等待完成本函数后关闭
                     ::PostMessageA(pBar->m_hWnd
,WM_CLOSE, 0 , 0);
                }
          }
      }
      else

     {

       //单个窗口
          CDockablePane* pane = (CDockablePane *)pwnd;
         if(pane->IsKindOf(RUNTIME_CLASS(CDockablePane))
|| pane->IsKindOf(RUNTIME_CLASS(CPane))

        &&
pane->IsKindOf(RUNTIME_CLASS(CPaneFrameWnd)))

      {
           //将关闭消息加入该DockPane队列,等待完成本函数后关闭
             ::PostMessageA(pWnd->GetPane()->m_hWnd
,WM_CLOSE, 0 , 0);
          }
      }
    return TRUE;
}

//关闭后,如视图需要重新打开,用这句:
  if(m_wndClassView.GetSafeHwnd())
  {
      m_wndClassView.ShowPane(TRUE,FALSE,TRUE);
      return ;
  }
  else

  {
      UINT Dockstyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
| CBRS_RIGHT |CBRS_FLOAT_MULTI;

    BOOL bNameValid;
        CString strClassView;
        bNameValid = strClassView.LoadString(IDS_CLASS_VIEW);
        ASSERT(bNameValid);

     if (!m_wndClassView.Create(strClassView, this, CRect(0,
0, 200, 200),

                TRUE, ID_VIEW_ONLINE_CLIENT_TERR_PANE,

                Dockstyle
,AFX_CBRS_OUTLOOK_TABS))
        {
            TRACE("未能创建%s窗口\n"
,strClassView);
            return ;
        }
        m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);
        DockPane(&m_wndClassView);

   }

CDockablePane 关闭的问题的更多相关文章

  1. 在CDockablePane中嵌入CFormView

    CDockablePane中嵌入CFormView与嵌入CDialogEx稍有不同,差异主要体现在CFormView类本身与CDialogEx类的不同上,CDockablePane层面的操作完全相同. ...

  2. CDockablepane风格设置

    屏蔽掉pane右上角的几个按钮 即将CDockablePane右上角的三个按钮屏蔽. 1            去掉关闭按钮 在CDockablePane的派生类中,重写方法CanBeClosed即可 ...

  3. CDockablePane使用总结

    基于 http://blog.csdn.net/kikaylee/article/details/8936953 CDockablePane的基本布局和用法 新建一个SDI工程,在CMainFrame ...

  4. VC++ MFC SDI/MDI Ribbon程序的停靠窗格被关闭后如何再次显示

    VC++ 创建基于MFC的SDI应用程序,Visual Studio风格的主界面如下图所示,在该主界面上的视图菜单下包含有队对各个可停靠窗格显示或隐藏的控制菜单项.而基于Ribbon风格的应用程序,所 ...

  5. 如何远程关闭一个ASP.NET Core应用?

    在<历数依赖注入的N种玩法>演示系统自动注册服务的实例中,我们会发现输出的列表包含两个特殊的服务,它们的对应的服务接口分别是IApplicationLifetime和IHostingEnv ...

  6. CentOS7使用firewalld打开关闭防火墙与端口(转载)

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disabl ...

  7. RMS Server打开或关闭日志记录

    原文: https://technet.microsoft.com/zh-cn/library/cc732758 在 Active Directory Rights Management Servic ...

  8. Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder

    Stack Overflow 排错翻译  - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...

  9. centos6和centos7防火墙的关闭

    CentOS6.5查看防火墙的状态: [zh@localhost ~]$service iptable status 显示结果: [zh@localhost ~]$service iptable st ...

随机推荐

  1. OpenCV2.x自学笔记——最大类间方差法OTSU

    推荐用法:(参数勿动) threshold(gray,binary,0,255,CV_THRESH_OTSU+CV_THRESH_BINARY);

  2. A - Bi-shoe and Phi-shoe (欧拉函数打表)

    Description Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a ver ...

  3. clion idea jetbrain windows下搞c/c++

    安装 clion 把MinGW(搜MinGW.zip)放到c盘根目录下 ok

  4. ejabberd模块开发

    参考: http://anders.conbere.org/journal/ http://www.process-one.net/en/wiki/ejabberd_module_developmen ...

  5. Linux下搭建ntp时间同步服务器

    1.ntpd软件安装(略过) 2.修改ntp.conf配置文件 vi /etc/ntp.conf 第一种配置:允许任何IP的客户机都可以进行时间同步将“restrict default kod nom ...

  6. F - 娜娜梦游仙境系列——多民族王国

    F - 娜娜梦游仙境系列——多民族王国 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Othe ...

  7. 练习3:修改withdraw 方法

    练习目标-使用有返回值的方法:在本练习里,将修改withdraw方法以返回一个布尔值来指示交易是否成功. 任务 1.修改Account类 a.修改deposit 方法返回true(意味所有存款是成功的 ...

  8. MFC下MCI的使用播放音乐

    最近研究了一下MFC下的音乐的播放,主要使用了MCI 1.需要包含的库文件 在链接资源里(link)添加库文件VFW32.lib winmm.lib 2.包含的头文件 #include <mms ...

  9. app测试--稳定性测试

    稳定性测试的概念有2种, 一, 稳定性测试,对应于异常性测试,即发生异常情况时,系统如何反应的测试.包含: 1 交互性测试,被打扰的情况,如来电,短信,低电量等.这些其实在上章的功能测试中有提到. 2 ...

  10. webupload-upload执行上传时,进入的路径与linux服务器上的不一致

    将if判断处改为garage即可. 原因是因为if处判断处理没有执行,因为要需要把从garage开始的到后面的字符串都去掉才行 不然:local=http://www.xxx.com/garage s ...