CDockablePane 关闭的问题
显示或者隐藏
当点击CDockablePane上的关闭按钮时,并不能将其关闭,知识将其隐藏了起来,如果需要重新显示或隐藏,则相关命令的响应函数如下:
- if(m_Panes.GetSafeHwnd())
- {
- BOOL flag = !m_Panes.IsVisible();
- m_Panes.ShowPane(flag,FALSE,flag);
- }
关闭按钮的响应函数
当点击CDockablePane上的关闭按钮时,主框架会进行响应
- //关闭停靠窗口事件,事实上是隐藏窗体,还是占用资源的
- BOOL CMainFrame::OnCloseDockingPane(CDockablePane* pWnd) ;
- //关闭悬浮窗口事件,事实上液是隐藏窗体,还是占用资源的
- 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 关闭的问题的更多相关文章
- 在CDockablePane中嵌入CFormView
CDockablePane中嵌入CFormView与嵌入CDialogEx稍有不同,差异主要体现在CFormView类本身与CDialogEx类的不同上,CDockablePane层面的操作完全相同. ...
- CDockablepane风格设置
屏蔽掉pane右上角的几个按钮 即将CDockablePane右上角的三个按钮屏蔽. 1 去掉关闭按钮 在CDockablePane的派生类中,重写方法CanBeClosed即可 ...
- CDockablePane使用总结
基于 http://blog.csdn.net/kikaylee/article/details/8936953 CDockablePane的基本布局和用法 新建一个SDI工程,在CMainFrame ...
- VC++ MFC SDI/MDI Ribbon程序的停靠窗格被关闭后如何再次显示
VC++ 创建基于MFC的SDI应用程序,Visual Studio风格的主界面如下图所示,在该主界面上的视图菜单下包含有队对各个可停靠窗格显示或隐藏的控制菜单项.而基于Ribbon风格的应用程序,所 ...
- 如何远程关闭一个ASP.NET Core应用?
在<历数依赖注入的N种玩法>演示系统自动注册服务的实例中,我们会发现输出的列表包含两个特殊的服务,它们的对应的服务接口分别是IApplicationLifetime和IHostingEnv ...
- CentOS7使用firewalld打开关闭防火墙与端口(转载)
1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disabl ...
- RMS Server打开或关闭日志记录
原文: https://technet.microsoft.com/zh-cn/library/cc732758 在 Active Directory Rights Management Servic ...
- Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder
Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...
- centos6和centos7防火墙的关闭
CentOS6.5查看防火墙的状态: [zh@localhost ~]$service iptable status 显示结果: [zh@localhost ~]$service iptable st ...
随机推荐
- ARC下面的对象被释放的bug
一般在ARC管理的方式之下,很难出现对象被过度释放的问题,下面是我将遇到的一个crash. * thread #: tid = , queue = , address=0x18) frame #: f ...
- Spring AOP实现声明式事务代码分析
众所周知,Spring的声明式事务是利用AOP手段实现的,所谓"深入一点,你会更快乐",本文试图给出相关代码分析. AOP联盟为增强定义了org.aopalliance.aop.A ...
- linux下合并pdf
使用Gost Script和 PDFtk运行如下命令: #gs -q -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=Linuxidc.pdf -dBATCH *.p ...
- chapter11_1 Lua数组、列表
Lua中的table可以表示其他语言提供的数据结构:数组.记录.线性表.队列.集合等. 在Lua中很少编写搜索算法,因为table本身就提供了直接访问任意类型的功能. 数组 使用整数来索引table即 ...
- html5+css3学习笔记音频和视频
格式 IE Firefox Opera Chrome Safari Ogg No 3.5+ 10.5+ 5.0+ No MPEG 4 9.0+ No No 5.0+ 3.0+ WebM No 4.0+ ...
- WPFbutton样式
有四款button不同的风格 <Window x:Class="SjglzxRj.Window3" xmlns="http://schemas.microsoft. ...
- docker network
前言:前面的部分一直都是单机跑docker,但实际生产环境不可能只用一台来跑.肯定会用到多台,因为他们都是内部私有ip,那么多台主机之间的容器如何通信?这个是个很头疼的问题!目前主流几种方法如下: 1 ...
- VS2013程序打包部署详细图解
目录(?)[+] 新建项目 FILE –> New –> Project,如下图所示: 注意:如果 InstallShield Limited Edition Project 显 ...
- (1)Two Sum--求数组中相加为指定值的两个数
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- linux查看内核版本
cat /proc/version 或者 cat /etc/issue 或者 uname -a