显示或者隐藏

  当点击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. NSDictionary 的内部实现

    NSDictionary是IOS中使用的一种key-value容器,参考cocotron的源代码,NSDictionary使用NSMapTable实现. NSMapTable同样是一个key-valu ...

  2. gdb常用调试命令

    一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序.    2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式)   ...

  3. 推荐学习c语言的几个开源项目

    1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连 ...

  4. redis数据类型:sets

    sets类型及操作: set是集合,它是string类型的无序集合.set是通过hash table实现的, 添加.删除和查找的复杂度都是O(1).对集合我们可以取并集.交集.差集. 通过这些操作我们 ...

  5. 监控mysql主从

    这里记录了,每次都百度查询多次. zabbix默认包含mysql监控 其中包含 mysql的基本状态监控 MySQL主从监控需要结合自定义 1)目前项目需求 只对 Slave_IO_Running . ...

  6. Android 透明状态栏&着色状态栏

    Android 5.0 及以上实现方式(android在5.0之后引入Material Design 实现方式相对简单) 透明状态栏,背景浸入状态栏 if (Build.VERSION.SDK_INT ...

  7. 使用非 GUI 模式运行 JMeter 压力测试

    使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.使用命令jmeter -n -t <testplan filename> -l <list ...

  8. BITMAP图片压缩算法三则--bilinear、nearest、cubic

    原文:http://blog.chinaunix.net/uid-253932-id-3037805.html 工作需要,要弄截图且缩小.截图倒是好说,WIN API可以搞定,但是缩小且尽量不失真,这 ...

  9. HDU 5810 Balls and Boxes

    n*(m-1)/(m*m) #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio&g ...

  10. VBS获取Ini配置文件一个节点下的所有字段的值

    ''* 功能:使用VBS读取ini文件中指定节点下的所有值'* 输入参数:inipath :ini文件的地址'*           initypes :ini文件中包含在"["和 ...