最新文章
热门文章
WinPE操作系统的使用及简介(破解 
QQ象棋,联众象棋游戏如何作弊 
如何解决网页中图片大小类型等属 
总结几种结构体初始化方法 
关于硕士毕业论文自动生成目录和 
VC建立类向导(class wizard)错误 
C++中取随机数函数rand和srand用 
VC编写自己构造http协议数据的po 
如何查看得到windows系统管理员帐 
由DCOM权限引起的在windows2003上 
当前位置:李露的博客 >> 电脑技术 >> 浏览文章
关于CSizingControlBar捕获关闭按钮消息
更新日期:2010年12月28日  来源:本站原创  作者:天漏客   访问次数:次  【字体:

CSizingControlBar是一个比较强大的可停靠对话框类,继承于CControlBar,所以它实际上是一个控制条,而不是继承于CDialog,使用CSizingControlBar类可以很方便的做一个停靠对话框。

默认的点“×”是隐藏该停靠框,而不是关闭。有时候我们点击“×”也并不是想关闭该停靠框,而是关闭该停靠框中的TAB控件的某一页,像VC和VS的资源管理器和类管理器一页,那么这时你需要捕获它的关闭消息,然后自己做判断。

重载OnCancel和不错WM_CLOSE消息,会发现都没有效果。重载OnCommand,然后捕获SC_CLOSE消息,也没有效果。之所以这些没有效果,看这个类的实现源码就知道了。那个“×”按钮是自绘的一个,而不是一般对话框上默认的关闭按钮,所以点击它,不会发生WM_CLOSE消息。

要能捕获关闭消息,需要在我们自己重载的类中捕获WM_NCLBUTTONUP消息,在CSizingControlBarG类中,已经有了该消息的处理:

void CSizingControlBarG::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
    if (nHitTest == HTCLOSE)
        m_pDockSite->ShowControlBar(this, FALSE, FALSE); // hide

    baseCSizingControlBarG::OnNcLButtonUp(nHitTest, point);
}

所以,我们自己处理,就是要自己覆盖(不是重载)该函数,在自己的类中添加该消息,写处理代码,最后返回给CSizingControlBarG,如果是给最上层CSizingControlBar,将隐藏不了该停靠框。

void CDockDataEdit::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 //获取当前页数大于1,仅关闭当前页
 if (m_wndTab.GetPageCount() > 1)
 {
  //获取当前选中的页
  int nItemSel = m_wndTab.GetCurSel();
  m_wndTab.RemovePage(nItemSel);

  return;
 }

 //当前页数为1,那么关闭
 CSizingControlBarG::OnNcLButtonUp(nHitTest, point);
}

这样就可以自己处理关闭消息了。

顺便提下:

如果要设置成有标题栏,而不是两条横线的风格,需要使用CSizingControlBarCF类,同时在CMainFrame::OnCreate函数中,在EnableDocking(CBRS_ALIGN_ANY);的后面加上:

#ifdef _SCB_REPLACE_MINIFRAME
 m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);
#endif //_SCB_REPLACE_MINIFRAME

这样就OK了。

可以在stdafx.h头文件中加上:
#define _SCB_REPLACE_MINIFRAME
#include "uiex\sizecbar\sizecbar.h"
#include "uiex\sizecbar\scbarg.h"
#include "uiex\sizecbar\scbarcf.h"
#define baseCMyBar CSizingControlBarCF

然后在自己的类中继承:

class CDockDataEdit : public baseCMyBar
{};
 

发表评论】【告诉好友】【打印此文】【收藏此文】【关闭窗口
上一篇:[转]50种让你的网站被关注的方法 下一篇:C#中逻辑层代码共用web.config和app.config配置文件

Copyright 2006-2012 Powered by LiLu.NAME,李露的博客 All Rights Reserved.
E-Mail:lilu.name#gamil.com(注意是gmail,自己改) QQ:285252760
苏ICP备08016526号