显示或者隐藏

  当点击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. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

  2. 在线用户管理--ESFramework 4.0 进阶(05)

    无论我们采用何种通信框架来构建我们的分布式系统,在服务端进行用户管理都是非常重要的一个环节.然而用户管理是否应该隶属于通信框架了?这个并不一定,通常来说,用户管理是与具体应用紧密相关的,应该是由应用解 ...

  3. php使用iconv进行从utf-8转为gb2312字符编码出错或截断的解决方案

    iconv("GB2312","UTF-8",$text);修改为以下其中一种:1.iconv("UTF-8","GBK" ...

  4. C的指针,真的很经典

    工作以后,一直使用C++,也做过Objective C,各种类的方法封装得很好,使用很简单,今天偶尔翻看一下 严蔚敏 的 <数据结构>,第一个程序demo就看了半天,一是由于demo的变量 ...

  5. Chapter 16_2 继承

    类也是对象,所有它们也可以从其他类获得方法.这就是“继承”,可以在Lua中表示: Account = { balance = } function Account:new(o) o = o or {} ...

  6. 一把刀终极配置 For XP v2.0 免费绿色版

    软件名称: 一把刀终极配置 For XP 软件语言: 简体中文 授权方式: 免费软件 运行环境: WinXP 软件大小: 924KB 图片预览: 软件简介: 一把刀终极配置 For XP,用于快速方便 ...

  7. MySQL 多表查询分页

    SELECT v.*, vt.id vid, vt.vote_id, vt. option, vt.poll FROM vote v JOIN vote_option vt ON v.id = vt. ...

  8. 二〇一五年五月二十二日--bug--启动页面出现模糊的问题

    启动页面出现模糊的问题: 原因是 :android:theme="@style/TranslucentTheme" <application android:name=&qu ...

  9. ASP.NET MVC 使用带有短横线的html Attributes

    我们常常需要一个文本框来输入用户名,在asp.net mvc 中可以使用 TextBoxFor.有时候我们想为这个文本框添加一些特性,比如 html5 的data-,如果直接写data-是会提示错误的 ...

  10. C语言strtok()函数:字符串分割

    头文件:#include <string.h> 定义函数:char * strtok(char *s, const char *delim); 函数说明:strtok()用来将字符串分割成 ...