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方法就出错了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值