MFC Feature Pack for Visual C++ 2008的BUG之一

  1. CMFCTabCtrl::EnableActiveTabCloseButton

用于在CMFCTabCtrl的Tab页显示一个关闭按钮,看看关闭按钮怎么实现:

 

  1. void  CMFCBaseTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.  m_bWindowPosChanged = FALSE;
  4.  CWnd::OnLButtonDown(nFlags, point);
  5.   if  (m_rectCloseButton.PtInRect(point))
  6.  {
  7.   m_bTabCloseButtonPressed = TRUE;
  8.   RedrawWindow(m_rectCloseButton);
  9.    return ;
  10.  }
  11. ...
  12.   void  CMFCBaseTabCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  13. {
  14.   if  (m_bTabCloseButtonPressed)
  15.  {
  16.   m_bTabCloseButtonPressed = FALSE;
  17.   m_bTabCloseButtonHighlighted = FALSE;
  18.   RedrawWindow(m_rectCloseButton);
  19.    if  (m_rectCloseButton.PtInRect(point))
  20.   {
  21.    CWnd* pWndActive = GetActiveWnd();
  22.     if  (pWndActive != NULL)
  23.    {
  24.     pWndActive->SendMessage(WM_CLOSE);
  25.    }
  26.     return ;
  27.   }
  28.  }
  29. ...

应该就这些了。

在例子TabbedView中添加这个功能:

  1. int  CTabbedViewView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  2. {
  3.   if  (CTabView::OnCreate(lpCreateStruct) == -1)
  4.    return  -1;
  5.  AddView (RUNTIME_CLASS (CView1), _T( "Simple" ), 100);
  6.  AddView (RUNTIME_CLASS (CView2), _T( "List" ), 101);
  7.  AddView (RUNTIME_CLASS (CView3), _T( "Form" ), 102);
  8.  AddView (RUNTIME_CLASS (CView4), _T( "ScrollView" ), 102);
  9.  m_wndTabs.EnableActiveTabCloseButton();
  10.   return  0;
  11. }

然后点击一个页面上的关闭按钮,会发现这个tab页并没有消失,而切换到其他页面,程序就中断了,问题出在:

  1. BOOL  CMFCTabCtrl::SetActiveTab( int  iTab)
  2. {
  3. ...
  4.   if  (m_iActiveTab != -1 && m_bHideInactiveWnd)
  5.  {
  6.    //--------------------
  7.    // Hide active window:
  8.    //--------------------
  9.   CWnd* pWndActive = GetActiveWnd();
  10.    if  (pWndActive != NULL)
  11.   {
  12.    pWndActive->ShowWindow(SW_HIDE);
  13.   }
  14.  }

由于窗口已经销毁,而该Tab页仍然存在,所以m_iActiveTab就是被销毁的窗口所在页面,pWndActive是已经被销毁的窗口,自然调用其ShowWindow方法就出错了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值