Excel 工作表標籤、VC 輸出視窗標籤屬於「資料夾式標籤控制」,而非 MFC CTabCtrl(SysTabControl32)。Spy++ 可驗證它們是自訂視窗類別。為達最大重用性與控制力,本文自行實作 CFolderTabCtrl 類別,不依賴現成控件。
OnInitDialog 中以 CreateFromStatic 取代靜態控件:m_wndFolderTab.CreateFromStatic(IDC_FOLDERTAB, this);
Load 載入標籤名稱(字串資源,以 \n 分隔):m_wndFolderTab.Load(IDR_FOLDERTABS);
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)。
關鍵在於資料結構設計:將標籤幾何資訊封裝於 CFolderTab,統一由 ComputeRgn 計算,其餘邏輯(繪製、點擊測試)自然簡化。下一篇將整合至實際 MFC 文件/視圖架構。