2015-12-08 81 views

回答

1

這是我的解決方案。我重寫了垂直模式下按鈕的行爲。現在當按下垂直模式時,按鈕會顯示組合框下拉窗口。

當您將組合框按鈕添加到工具欄時,您應該在ReplaceButton()方法中使用類CVerticalableToolBarComboBoxButton而不是CMFCToolBarComboBoxButton。

示例:在下面的圖片中,您可以看到按鈕在水平和垂直模式下的行爲。

水平模式

Horizontal mode

垂直模式

Vertical left mode Vertical right mode

類代碼:

class CVerticalableToolBarComboBoxButton 
    : public CMFCToolBarComboBoxButton 
{ 
    DECLARE_SERIAL(CVerticalableToolBarComboBoxButton) 

public: 
    typedef CMFCToolBarComboBoxButton TBase; 

protected: 

    bool    m_bDoVerticalMode; 

public: 
    CVerticalableToolBarComboBoxButton(bool bDoVerticalMode = true); 
    CVerticalableToolBarComboBoxButton(UINT uiID, int iImage, DWORD dwStyle = CBS_DROPDOWNLIST, int iWidth = 0, bool bDoVerticalMode = true); 

    virtual ~CVerticalableToolBarComboBoxButton(); 

    virtual void Serialize(CArchive& ar); 

    virtual BOOL OnClick(CWnd* pWnd, BOOL bDelay = TRUE); 
    virtual void OnChangeParentWnd(CWnd* pWndParent); 
    virtual void OnMove(); 
    virtual void OnSize(int iSize); 

protected: 
    void AdjustVerticalRect(); 
}; 


///////////////////////////////////////////////////////////////////////////// 
// CVerticalableToolBarComboBoxButton 
IMPLEMENT_SERIAL(CVerticalableToolBarComboBoxButton, CVerticalableToolBarComboBoxButton::TBase, VERSIONABLE_SCHEMA | 1) 

    CVerticalableToolBarComboBoxButton::CVerticalableToolBarComboBoxButton(bool bDoVerticalMode /*= true*/) 
    : m_bDoVerticalMode(bDoVerticalMode) 
{} 

CVerticalableToolBarComboBoxButton::CVerticalableToolBarComboBoxButton(UINT uiID, int iImage, DWORD dwStyle /*= CBS_DROPDOWNLIST*/, int iWidth /*= 0*/, bool bDoVerticalMode /*= true*/) 
    : TBase(uiID, iImage, dwStyle, iWidth) 
    , m_bDoVerticalMode(bDoVerticalMode) 
{} 

CVerticalableToolBarComboBoxButton::~CVerticalableToolBarComboBoxButton() 
{} 

void CVerticalableToolBarComboBoxButton::Serialize(CArchive& ar) 
{ 
    TBase::Serialize(ar); 

    if (ar.IsLoading()) { 
     ar >> m_bDoVerticalMode; 
    } 
    else { 
     ar << m_bDoVerticalMode; 
    } 
} 

BOOL CVerticalableToolBarComboBoxButton::OnClick(CWnd* pWnd, BOOL bDelay /*= TRUE*/) 
{ 
    BOOL bRes = FALSE; 

    bool bDefault = m_bHorz || !m_bDoVerticalMode; 
    if (!bDefault) { 
     if (IsFlatMode()) { 

      if (m_pWndEdit == NULL) { 
       m_pWndCombo->SetFocus(); 
      } 
      else { 
       m_pWndEdit->SetFocus(); 
      } 

      m_pWndCombo->ShowDropDown(); 

      if (pWnd != NULL) { 
       pWnd->InvalidateRect(m_rectCombo); 
      } 

      bRes = TRUE; 
     } 
    } 

    if (bDefault) { 
     bRes = TBase::OnClick(pWnd, bDelay); 
    } 

    return bRes; 
} 

void CVerticalableToolBarComboBoxButton::OnChangeParentWnd(CWnd* pWndParent) 
{ 
    TBase::OnChangeParentWnd(pWndParent); 

    if (!m_bHorz & m_bDoVerticalMode) { 
     AdjustVerticalRect(); 
    } 
} 

void CVerticalableToolBarComboBoxButton::OnMove() 
{ 
    TBase::OnMove(); 

    if (!m_bHorz & m_bDoVerticalMode) { 
     AdjustVerticalRect(); 
    } 
} 

void CVerticalableToolBarComboBoxButton::OnSize(int iSize) 
{ 
    TBase::OnSize(iSize); 

    if (!m_bHorz & m_bDoVerticalMode) { 
     AdjustVerticalRect(); 
    } 
} 

void CVerticalableToolBarComboBoxButton::AdjustVerticalRect() 
{ 
    ASSERT(m_bDoVerticalMode); 
    ASSERT(!m_bHorz); 

    if (m_pWndCombo->GetSafeHwnd() == NULL || m_rect.IsRectEmpty()) { 

     m_rectCombo.SetRectEmpty(); 
     m_rectButton.SetRectEmpty(); 
     return; 
    } 

    CMFCToolBar* pParentBar = nullptr; 
    { 
     CWnd* pNextBar = m_pWndCombo->GetParent(); 
     while (pParentBar == nullptr && pNextBar != nullptr) { 
      pParentBar = DYNAMIC_DOWNCAST(CMFCToolBar, pNextBar); 
      pNextBar = pNextBar->GetParent(); 
     } 
    } 

    if (IsCenterVert() && (!m_bTextBelow || m_strText.IsEmpty()) && (pParentBar != nullptr)) 
    { 
     const int nRowHeight = pParentBar->GetRowHeight(); 
     const int yOffset = std::max<>(0, (nRowHeight - m_rect.Height())/2); 

     m_rect.OffsetRect(0, yOffset); 
    } 

{ 
    CRect rect; 
    m_pWndCombo->GetWindowRect(&rect); 
    const int nWidth = std::max<>(rect.Width(), m_iWidth); 

    rect.left = m_rect.left; 
    rect.top = m_rect.top; 
    rect.right = m_rect.left + nWidth; 
    rect.bottom = m_rect.top + m_nDropDownHeight; 

    if ((pParentBar != nullptr) && pParentBar->IsDocked()) { 
     const UINT nID = pParentBar->GetParentDockSite()->GetDockSiteID(); 
     if (nID == AFX_IDW_DOCKBAR_RIGHT) { 
      rect.left = m_rect.right - nWidth; 
      rect.right = m_rect.right; 
     } 
    } 

    m_pWndCombo->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER | SWP_NOACTIVATE); 
    m_pWndCombo->SetEditSel(-1, 0); 
} 

{ 
    m_pWndCombo->GetWindowRect(&m_rectCombo); 
    m_pWndCombo->ScreenToClient(&m_rectCombo); 
    m_pWndCombo->MapWindowPoints(m_pWndCombo->GetParent(), &m_rectCombo); 

} 

if (m_bFlat) { 
    m_rectButton = m_rectCombo; 
} 
else { 
    m_rectButton.SetRectEmpty(); 
} 
} 

// CVerticalableToolBarComboBoxButton 
///////////////////////////////////////////////////////////////////////////// 
相關問題