利用系統顏色 COLOR_3DHILIGHT(高光)與 COLOR_3DSHADOW(陰影)分別繪製兩次文字,第二次偏移 1 像素,形成浮雕立體感。核心僅需 CDC::SetTextColor、CDC::DrawText 與透明背景模式。
void CMy3DTextDlg::OnPaint() {
if (IsIconic()) {
// 圖標繪製邏輯(標準模板代碼)
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM)dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect; GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
} else {
CPaintDC dc(this);
CString str = _T("電腦報,我們的學習報");
// 建立大字體
CFont font;
font.CreateFont(44, 0, 0, 0, 550, FALSE, FALSE, 0,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
VARIABLE_PITCH | FF_SWISS, _T("Arial"));
dc.SetBkMode(TRANSPARENT); // 關鍵:透明背景
CRect rectText; GetClientRect(&rectText);
CFont* pOldFont = dc.SelectObject(&font);
COLORREF oldColor = dc.SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
// 第一層:高光(右下偏移 1 像素)
dc.DrawText(str, rectText + CPoint(1, 1),
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// 第二層:陰影(原位置)
dc.SetTextColor(::GetSysColor(COLOR_3DSHADOW));
dc.DrawText(str, rectText,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// 還原狀態
dc.SetTextColor(oldColor);
dc.SelectObject(pOldFont);
}
}
| 步驟 | API/屬性 | 作用 |
|---|---|---|
| 背景模式 | SetBkMode(TRANSPARENT) | 避免文字周圍白框,讓陰影疊加自然 |
| 高光顏色 | GetSysColor(COLOR_3DHILIGHT) | 系統 3D 邊框高光色,自適應主題 |
| 陰影顏色 | GetSysColor(COLOR_3DSHADOW) | 系統 3D 邊框陰影色,自適應主題 |
| 偏移繪製 | rectText + CPoint(1,1) | 右下 1 像素形成立體厚度感 |
| 字體建立 | CreateFont(44,0,0,0,550...) | 44 像素高、550 粗細(半粗體)、Arial |
Invalidate() 實現跑馬燈/倒計時DT_SINGLELINE,使用 DT_WORDBREAK 並計算行高Graphics::DrawString 獲得更平滑邊緣C3DTextCtrl 繼承 CStatic,暴露 Set3DText()、SetDepth() 介面僅需 20 行核心代碼,無需外部資源、無效能負擔,即可為 MFC 介面增添專業視覺質感。掌握「雙色疊加 + 像素偏移」技巧,可輕鬆擴展至外發光、內陷、多層疊加等進階效果。