首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

MFC 工具列整合扁平化下拉選單:動態建立與訊息響應

     編輯:VC 教學

前言

Office 2000 風格工具列包含扁平化下拉選單 (Flat ComboBox),MFC 預設工具列僅支援按鈕。本文示範如何在工具列預留分隔按鈕位置,動態建立 CFlatComboBox 並處理選擇變更事件。

實作步驟

1. 資源編輯器預留位置

  • 工具列資源編輯器插入一個空白按鈕,ID 設為 ID_TOOL_ZOOM,樣式 TBBS_SEPARATOR。

2. 衍生工具列類別

ClassWizard 建立 CMainToolBar : public CToolBar,加入成員:
CFlatComboBox m_wndZoom;

3. 主框架替換工具列類別

MainFrm.h:


#include "MainToolBar.h"
// CToolBar m_wndToolBar;
CMainToolBar m_wndToolBar;

4. 動態建立下拉選單 (OnCreate 中)


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%

5. 訊息對應處理選擇事件

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 與訊息路由正確。
  • 訊息對應在主框架:因控件非對話框項目,ClassWizard 無法直接對應,需手寫 ON_CBN_SELENDOK 宏。

執行效果

工具列出現扁平化下拉選單,選擇項目即觸發 OnSelectZoomed,可即時調整檢視縮放比例,呈現專業應用程式外觀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved