Office 2000 風格工具列包含扁平化下拉選單 (Flat ComboBox),MFC 預設工具列僅支援按鈕。本文示範如何在工具列預留分隔按鈕位置,動態建立 CFlatComboBox 並處理選擇變更事件。
ID_TOOL_ZOOM,樣式 TBBS_SEPARATOR。ClassWizard 建立 CMainToolBar : public CToolBar,加入成員:
CFlatComboBox m_wndZoom;
MainFrm.h:
#include "MainToolBar.h"
// CToolBar m_wndToolBar;
CMainToolBar m_wndToolBar;
int index = m_wndToolBar.CommandToIndex(ID_TOOL_ZOOM);
CRect rect;
m_wndToolBar.SetButtonInfo(index, ID_TOOL_ZOOM, TBBS_SEPARATOR, 80); // 設定寬度
m_wndToolBar.GetItemRect(index, &rect);
rect.top += 2;
rect.bottom += 200; // 下拉清單高度
if (!m_wndZoom.Create(WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS,
rect, &m_wndToolBar, ID_TOOL_ZOOM))
{
TRACE0("Failed to create combo-box");
return FALSE;
}
m_wndZoom.ShowWindow(SW_SHOW);
// 填入縮放選項
m_wndZoom.AddString(_T("25%"));
m_wndZoom.AddString(_T("50%"));
m_wndZoom.AddString(_T("75%"));
m_wndZoom.AddString(_T("100%"));
m_wndZoom.AddString(_T("125%"));
m_wndZoom.AddString(_T("150%"));
m_wndZoom.AddString(_T("175%"));
m_wndZoom.AddString(_T("200%"));
m_wndZoom.SetCurSel(3); // 預設 100%
MainFrm.h 宣告:
afx_msg void OnSelectZoomed();
MainFrm.cpp 訊息對應:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_CBN_SELENDOK(ID_TOOL_ZOOM, OnSelectZoomed)
END_MESSAGE_MAP()
實作:
void CMainFrame::OnSelectZoomed()
{
int sel = m_wndToolBar.m_wndZoom.GetCurSel();
CString str; m_wndToolBar.m_wndZoom.GetLBText(sel, str);
// 依選擇縮放比例執行縮放邏輯...
}
Create ComboBox,避免資源編輯器限制。Create(..., &m_wndToolBar, ...) 確保 Z-Order 與訊息路由正確。ON_CBN_SELENDOK 宏。工具列出現扁平化下拉選單,選擇項目即觸發 OnSelectZoomed,可即時調整檢視縮放比例,呈現專業應用程式外觀。