3D 文字效果透過 高光 與 陰影 兩層文字疊加產生:
COLOR_3DHILIGHT) 繪製文字,座標向右下偏移 1 像素。COLOR_3DSHADOW) 繪製相同文字,座標為原位置。TRANSPARENT),兩層文字重疊形成凸起立體感。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,
DEFAULT_PITCH | FF_SWISS, _T("Arial"));
dc.SetBkMode(TRANSPARENT);
CRect rectText;
GetClientRect(&rectText);
CFont* pOldFont = dc.SelectObject(&font);
// 1. 繪製高光層(右下偏移 1 像素)
COLORREF oldColor = dc.SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
dc.DrawText(str, rectText + CPoint(1, 1),
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// 2. 繪製陰影層(原位置)
dc.SetTextColor(::GetSysColor(COLOR_3DSHADOW));
dc.DrawText(str, rectText,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// 還原
dc.SetTextColor(oldColor);
dc.SelectObject(pOldFont);
}
}
| 函數/常數 | 用途 |
|---|---|
CreateFont | 建立邏輯字型,高度 44、寬度 0(自動)、字重 550 (Bold)、字體 Arial |
SetBkMode(TRANSPARENT) | 文字背景透明,避免矩形塊遮蓋 |
GetSysColor(COLOR_3DHILIGHT) | 系統 3D 高光色(通常近白) |
GetSysColor(COLOR_3DSHADOW) | 系統 3D 陰影色(通常深灰) |
DrawText + DT_CENTER | DT_VCENTER | 文字在矩形區域水平垂直置中 |
rectText + CPoint(1,1) | 利用 CRect 運算子多載產生偏移矩形 |
OnTimer 中漸變 SetTextColor 的 Alpha 值(需搭配 AlphaBlend 或 GDI+)。GetSysColor 為 RGB(255,255,200) (高光) / RGB(80,80,80) (陰影) 等。DT_SINGLELINE,調整 rectText 高度與 DT_WORDBREAK。Graphics::DrawString 搭配 LinearGradientBrush 可得更平滑、可縮放的 3D 效果。只需 20 行核心代碼,即可為 MFC 對話框或視圖增添專業級 3D 文字效果,提升介面質感與品牌辨識度。