提到 3D 文字,許多開發者第一反應是 3ds Max 或 OpenGL。但若僅需簡單立體字效果,引入龐大渲染管線屬於過度設計。本文展示如何利用 MFC CFont 與 CDC,結合色彩學原理,以極簡代碼繪製層次感強烈的 3D 文字。
螢幕是二維平面,立體感源於高亮與陰影的對比:
實現策略:同字體、同內容、異顏色、錯位繪製兩層文字。陰影在後,高亮在前,像素偏移量決定「厚度」與「光源方向」。
使用 CFont::CreateFontIndirect 配合 LOGFONT 結構,精確控制字體外觀:
LOGFONT lf = {0};
lf.lfHeight = 50; // 字高
lf.lfWidth = 0; // 平均寬度 (0=自動)
lf.lfEscapement = 0; // 文字傾斜角度 (十分之一度)
lf.lfOrientation = 0; // 字體基線角度
lf.lfWeight = FW_HEAVY; // 粗細 (FW_BOLD/FW_HEAVY)
lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut = FALSE;
lf.lfCharSet = GB2312_CHARSET; // 中文字符集
lf.lfOutPrecision = OUT_STROKE_PRECIS;
lf.lfClipPrecision = CLIP_STROKE_PRECIS;
lf.lfQuality = DRAFT_QUALITY; // 或 PROOF_QUALITY
lf.lfPitchAndFamily = VARIABLE_PITCH | FF_MODERN;
_tcscpy_s(lf.lfFaceName, _T("幼圓")); // 字體名稱
CFont m_font;
m_font.CreateFontIndirect(&lf);
void CMyView::OnDraw(CDC* pDC) {
CFont* pOldFont = pDC->SelectObject(&m_font);
pDC->SetBkMode(TRANSPARENT); // 關鍵:背景透明,否則內部填充會遮蓋陰影層
CString sTemp = _T("3D 文字演示");
// 1. 繪製陰影層 (右下偏移,模擬左上光源)
pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW)); // 系統 3D 深陰影色
pDC->TextOut(10, 10, sTemp); // 基準位置
// 2. 繪製高亮層 (左上偏移 3 像素)
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT)); // 系統 3D 高亮色
pDC->TextOut(7, 7, sTemp); // 向左上移動 (10-3, 10-3)
// 效果:視覺上文字「浮起」,厚度約 3 像素
pDC->SelectObject(pOldFont); // 恢復字體
}
利用 CDC::BeginPath/EndPath 與 StrokeAndFillPath 實現矢量描邊:
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->BeginPath();
pDC->TextOut(7, 7, sTemp);
pDC->EndPath();
pDC->SetPolyFillMode(WINDING);
pDC->StrokeAndFillPath(); // 同時描邊與填充,形成空心立體感

| 技術點 | 說明 |
|---|---|
| 背景透明模式 | SetBkMode(TRANSPARENT) 必須開啟,否則後繪製層會以不透明矩形覆蓋前層,失去立體層次。 |
| 系統色常數 | 使用 GetSysColor(COLOR_3DHILIGHT/DKSHADOW) 自適應系統主題,支持深色/淺色模式自動切換。 |
| 像素偏移控制 | X/Y 偏移量 (如 ±2~±4) 決定「厚度」;正負號決定光源方向 (左上/右下)。 |
| 繪製順序 | 先陰影 (暗色、偏右下),後高亮 (亮色、偏左上),符合繪圖師算法。 |
| 字體選擇 | 粗體、無襯線字體 (如微軟雅黑、幼圓) 效果最佳;細體筆畫偏移後易斷裂。 |
COLOR_3DLIGHT, COLOR_3DSHADOW) 可獲得更柔和的倒角效果。GetDeviceCaps(LOGPIXELSX) 縮放,保持物理尺寸一致。Graphics::DrawString + LinearGradientBrush。MFC 原生 CFont/CDC 配合色彩學原理,足以應付絕多數 UI 立體文字需求。這種「輕量級 3D」無需外部依賴、編譯體積小、執行效率高,是工具類、嵌入式界面、輕量級編輯器的理想選擇。深入鑽研 LOGFONT 更多屬性 (旋轉、傾斜、字距),還能創造更豐富的排版藝術。