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

實現類 Excel/VC 的資料夾式標籤控制(一)

     編輯:關於VC++

標籤控制 vs 標籤控件

Excel 工作表標籤、VC 輸出視窗標籤屬於「資料夾式標籤控制」,而非 MFC CTabCtrl(SysTabControl32)。Spy++ 可驗證它們是自訂視窗類別。為達最大重用性與控制力,本文自行實作 CFolderTabCtrl 類別,不依賴現成控件。

CFolderTabCtrl 使用方式

  1. 對話框放入一個靜態文字控件(IDC_FOLDERTAB)作為佔位。
  2. OnInitDialog 中以 CreateFromStatic 取代靜態控件:
m_wndFolderTab.CreateFromStatic(IDC_FOLDERTAB, this);
  1. 呼叫 Load 載入標籤名稱(字串資源,以 \n 分隔):
m_wndFolderTab.Load(IDR_FOLDERTABS);
  1. 處理 WM_NOTIFY 訊息(代碼 FTN_TABCHANGED),取得 NMFOLDERTAB 結構中的索引與標籤指標。

核心實作細節

標籤幾何與繪製

  • 每個標籤為 CFolderTab 物件,儲存文字、梯形區域(CRgn)。
  • RecomputeLayout 遍歷標籤,呼叫 ComputeRgn 計算梯形座標(含文字度量、邊距、重疊偏移 CXOFFSET)。
  • OnPaint 先繪製未選標籤,最後繪製選中標籤(白底、無頂邊框、小字體),達成 3D 視覺效果。
int CFolderTab::ComputeRgn(CDC& dc, int x) {
    CRect rc; dc.DrawText(m_sText, &rc, DT_CALCRECT);
    // 調整邊距...
    CPoint pts[4]; GetTrapezoid(rc, pts);
    m_rgn.CreatePolygonRgn(pts, 4, WINDING);
    return rc.Width();
}

滑鼠互動

  • OnLButtonDown → HitTest 遍歷標籤 PtInRegion 判斷點擊標籤。
  • SelectItem 更新 m_iCurItem、使失效重繪、發送 WM_NOTIFY(FTN_TABCHANGED)。

執行畫面

FldrTab 程式畫面 靜態控件定位 標籤選中/未選中狀態

設計心得

關鍵在於資料結構設計:將標籤幾何資訊封裝於 CFolderTab,統一由 ComputeRgn 計算,其餘邏輯(繪製、點擊測試)自然簡化。下一篇將整合至實際 MFC 文件/視圖架構。

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