现在的位置: 首页 > 综合 > 正文

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

2013年07月03日 ⁄ 综合 ⁄ 共 1521字 ⁄ 字号 评论关闭
  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方法就出错了。

抱歉!评论已关闭.