显示或者隐藏

  当点击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. ElasticSearch基础(4)-索引

    一.ES API常用规则 ES支持以Http协议的方式提供REST服务,以JSON格式发送请求返回响应. ES提供了大量的不管的数据操作,运维管理API,大量的api 这海量的api有一些通用的功能特 ...

  2. SSL读书笔记

    摘要: 第一次写博客,为读书笔记,参考书目如下: <HTTP权威指南> <图解HTTP> <大型分布式网站架构设计与实践> 作者:陈康贤 一. HTTP+SSL=H ...

  3. inode和文件描述符区别

    inode 或i节点是指对文件的索引.如一个系统,所有文件是放在磁盘或flash上,就要编个目录来说明每个文件在什么地方,有什么属性,及大小等.就像书本的目录一样,便于查找和管理.这目录是操作系统需要 ...

  4. 优化SQLServer数据库加快查询速度

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...

  5. crontab定时任务

    使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它, cron服务是一个定时执行的服务,可以通过cro ...

  6. C++primer第三章标准库类型

    除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...

  7. shell笔记-local、export用法

    local一般用于局部变量声明,多在在函数内部使用.    1.    Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止.    2.   ...

  8. arguments对象,caller 和 callee

    arguments对象是比较特别的一个对象,arguments非常类似Array,但实际上又不是一个Array实例. 它指的是函数对象里的参数,且只能在函数内部使用. 使用 检测函数的参数个数,引用属 ...

  9. 十八、oracle 角色

    一.介绍角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理.假定有用户a,b,c为了让他们都拥有如下权限1. 连接数据库2. 在scott.emp表上select,insert,up ...

  10. HDU 4585 Shaolin (set的应用)

    set是STL中非常方便的工具,可以实现自动去重和排序,可我一直忽视它的重要性,导致吃了好几次亏. 在思考这道题的时候,我一直往二分上靠拢,可是二分需要直接插入排序,直接插入排序覆盖的时候复杂度最大是 ...