MFC 控制項體系概覽
Windows 使用者介面由標準控制項構成:CStatic、CButton、CEdit、CListBox、CComboBox、CScrollBar 等六大基礎類別,另加 Windows 95 引入的 15 種增強控制項。掌握控制項的外觀樣式與行為回應是開發專業級應用程式的基石。
CStatic 靜態標籤深度定制
建立基礎流程
CStatic* pStatic = new CStatic();
pStatic->Create(_T("Hello World"),
WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER,
CRect(50, 80, 150, 150),
this, // 父視窗
IDC_STATIC); // ID (靜態控制項通常用 -1 或 IDC_STATIC)
Create 參數詳解
| 參數 | 說明 |
| lpszText | 顯示文字內容 |
| dwStyle | 樣式旗標組合 (WS_* + SS_*) |
| rect | 位置與大小 (相對父視窗客戶區) |
| pParentWnd | 父視窗指標 |
| nID | 控制項識別碼 |
樣式旗標完整分類
繼承自 CWnd (WS_*)
| 樣式 | 必要性 | 功能 |
| WS_CHILD | 必要 | 子視窗,必須有父視窗 |
| WS_VISIBLE | 必要 | 可見,否則建立後隱藏 |
| WS_DISABLED | 選用 | 停用 (靜態標籤不接收輸入,通常不需) |
| WS_BORDER | 選用 | 細線邊框 |
CStatic 專屬 (SS_*)
| 樣式 | 顯示效果 | 備註 |
| SS_LEFT | 靠左對齊,自動換行 | 預設 |
| SS_CENTER | 置中對齊,自動換行 | 常用 |
| SS_RIGHT | 靠右對齊,自動換行 | |
| SS_LEFTNOWORDWRAP | 靠左,超寬截斷不換行 | 單行標籤適用 |
| SS_SIMPLE | 單行簡單顯示,忽略 CTLCOLOR | 效能最佳 |
| SS_NOPREFIX | & 字元不作為熱鍵前綴 | 顯示 & 符號本身 |
| SS_BLACKFRAME | 黑色矩形框 (視窗框架色) | 忽略文字 |
| SS_GRAYFRAME | 灰色矩形框 (桌面色) | 忽略文字 |
| SS_WHITEFRAME | 白色矩形框 (視窗背景色) | 忽略文字 |
| SS_BLACKRECT | 實心黑色矩形 | 忽略文字 |
| SS_GRAYRECT | 實心灰色矩形 | 忽略文字 |
| SS_WHITERECT | 實心白色矩形 | 忽略文字 |
| SS_ICON | 顯示圖示 (文字為資源名稱) | rect 僅定位置 |
| SS_USERITEM | 使用者自繪 | 需處理 WM_DRAWITEM |
文字對齊與換行行為實測
- SS_CENTER + 長文字:在矩形區域內逐行置中,超高則截斷
- SS_LEFT + 長文字:靠左換行,同樣受限於矩形高度
- SS_LEFTNOWORDWRAP:單行截斷,適合固定高度標籤
- 矩形過小時:文字被裁切 (不會自動縮放字體)
矩形/框架顯示模式應用
// 分組框架效果
pStatic->Create(_T(""), WS_CHILD|WS_VISIBLE|SS_BLACKFRAME, r, this, IDC_GROUP_FRAME);
// 視覺分隔線
pStatic->Create(_T(""), WS_CHILD|WS_VISIBLE|SS_ETCHEDHORZ, r, this, IDC_SEPARATOR); // 需 Common Controls 6.0
// 背景塊
pStatic->Create(_T(""), WS_CHILD|WS_VISIBLE|SS_GRAYRECT, r, this, IDC_BG_BLOCK);
此模式下文字參數被忽略,習慣傳空字串。顏色跟隨系統配色方案 (控制台面板可調)。
字體定制:CFont 應用
建立與套用字體
// 類別成員變數
CFont m_fontTitle;
// 建構函數或 OnCreate 中
m_fontTitle.CreateFont(
36, // nHeight: 36 points (負值為邏輯單位,正值為裝置單位)
0, // nWidth: 0 = 自動依比例
0, // nEscapement: 文字基線角度 (0.1 度)
0, // nOrientation: 字元格角度
FW_BOLD, // nWeight: FW_NORMAL(400) / FW_BOLD(700) / 1-1000
FALSE, // bItalic: 斜體
FALSE, // bUnderline: 底線
FALSE, // cStrikeOut: 刪除線
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
_T("Arial") // 字型名稱
);
// 套用至控制項
pStatic->SetFont(&m_fontTitle);
// 重要:字體物件生命週期必須長於控制項使用期間
// 通常宣告為視窗類別成員,隨視窗銷毀自動釋放
CreateFont 關鍵參數
| 參數 | 建議值/說明 |
| nHeight | 負值 = 邏輯單位 (點數),如 -36 為 36 點;正值 = 像素高度 |
| nWeight | FW_DONTCARE(0), FW_NORMAL(400), FW_BOLD(700), FW_HEAVY(900) |
| 字型名稱 | 系統保證存在:Arial, Courier New, Times New Roman, Symbol, Wingdings |
| 字集 | ANSI_CHARSET (西文), DEFAULT_CHARSET (系統預設), CHINESEBIG5_CHARSET (繁中) |
常見字體陷阱
- 區域變數 CFont:函數結束析構 → 控制項持有無效 HFONT → 顯示異常
- 未指定字集:中文環境用 ANSI_CHARSET 會顯示亂碼,須用 CHINESEBIG5_CHARSET
- 字型不存在:系統自動替換預設字型 (通常是 MS Shell Dlg)
CWnd 繼承的 Set 系列函數擴展
CStatic 繼承自 CWnd,可用以下函數進階定制:
| 函數 | 用途 |
| SetWindowText / GetWindowText | 執行期修改/取得文字 |
| SetFont / GetFont | 字體設定/查詢 |
| SetWindowPos | 位置、大小、Z-order 一次設定 |
| MoveWindow | 移動+縮放 (內部呼叫 SetWindowPos) |
| ShowWindow(SW_HIDE/SW_SHOW) | 顯示/隱藏 |
| EnableWindow(FALSE/TRUE) | 停用/啟用 (視覺變灰) |
| ModifyStyle / ModifyStyleEx | 執行期修改 WS_/WS_EX_ 樣式 |
| SetDlgCtrlID | 修改控制項 ID |
開發效率工具
MSDN 線上說明快速查詢
- VC++ 6.0:F1 上下文說明、索引標籤搜尋
- VS2005+:動態說明、物件瀏覽器 (Ctrl+Alt+J)、線上 MSDN
- 搜尋關鍵字:
CStatic::Create, SS_CENTER, CreateFont
多專案編譯策略
| 策略 | 優點 | 缺點 |
| 每專案獨立目錄 | 隔離乾淨、並行建置 | 佔用磁碟空間大 |
| 單一目錄切換原始檔 | 節省空間、共用設定 | 需手動切換、易混淆 |
教學階段建議獨立目錄;實務專案使用方案包含多專案結構。
最佳實踐總結
- 靜態標籤最少樣式:
WS_CHILD | WS_VISIBLE + 對齊樣式
- 長文字預留足夠矩形高度,或用
SS_LEFTNOWORDWRAP 強制單行
- 視覺分組用
SS_*FRAME/RECT,文字傳空字串
- 字體物件宣告為視窗類別成員,確保生命週期
- 中文環境
CreateFont 必須指定 CHINESEBIG5_CHARSET (或 GB2312_CHARSET)
- 善用
ModifyStyle 動態切換樣式 (如錯誤訊息紅字/正常黑字)
- 複雜佈局改用對話框編輯器 +
DDX_Control 關聯變數