CMFCTabCtrl的标签关闭问题

文章链接地址 : http://www.pcw8510.com/?p=1258


最近本人在项目过程中和CMFCTabCtrl多次交手,该控件是出现在VS2008之后的,说实话,一般的控件也没啥新意,看看MSDN,自己查查资料就搞定了。这次主要是连续两个问题都出在改控件上,所以我就把这个系列问题记录下来,仅供大家以后参考。

一、CMFCTabCtrl标签关闭按钮

该控件的主要表现形式就是X按钮,但是无效果。那只能自己丰衣足食了。

1.      先把CMFCTabCtrl继承过来

PublicCMYMFCTabCtrl::CMFCTabCtrl

 

2.      复写WM_LBUTTONDOWN的消息对应函数

VoidCMYMFCTabCtrl::OnLButtonDown(UINT nFlags,Cpoint point)
{
     //判断是否击中标签的关闭按钮
       if(m_rectCloseButton.PtInRect(point))
       {
              m_bCloseButtonLButtonDown = TRUE;
       }
 
//如果点击标签
else if(this->m_rectTabsArea.PtInRect(point))
{
                  m_bCloseButtonLButtonDown= FALSE;
       //处理对应自己的标签弹出  (略)
}
}


之后终于我们的CMYMFCTabCtrl功能算齐全了。标签终于能关闭了。

 

二、多文档VS风格的CMFCTabCtrl

如果事情就这么结束了,那就不用写这篇BLOG,之后由于我们的主程序是用了VisualStudio风格样式开发的。本身支持多文档显示,那个多文档显示也用了CMFCTabCtrl控件。但是那个关闭按钮可是天生就有关闭功能的,一阵窃喜,不用写代码咯。可是客户后来提出要求,始终要留一个主View,其他View可以删除。刚听到这个需求,觉得非常简单,向上面一样如法炮制即可。可是,这个CMFCTabCtrl已经内嵌到CmainFrame中了,而且开放的接口是

EnableMDITabbedGroups和EnableMDITabs(),因此上面的方法完全行不通。

 

解决方法:

从源头来遏制这个问题吧,Windows的核心机制还是消息。那就对消息下手。

内嵌的CMFCTabCtrl是属于CC hildFrame的。

触发该窗体的WindowProc来截获消息吧

LRESULT CchildFrame::WindowProc(UINT message,WPARAMwParam, LPARAM lParam)
{
         If(message== WM_CLOSE)
         {
         //判断消息的源头是哪里的,因为所有标签都能发送WM_CLOSE的
              CDocument * pDoc = GetActiveDocument();
                   If(pDoc->GetTitle== _T(“xxxxxx”)) //以自己的Title为标记
                            ReturnTRUE;
         }
        
         Return CMDIChildWndEx::WindowProc(message,wParam,lParam);
}


OK了,这样再看看,是不是那个XXX的标签是不是关不掉了?


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值