在 About 對話框或啟動畫面顯示帶有藝術感的「禁用狀態」粗體文字,能提升軟體專業形象。關鍵在於使用 CDC::DrawState 搭配 DSS_DISABLED 旗標,系統會自動產生立體陰影灰化效果。本文示範完整實作流程。
class CDisableFontDlg : public CDialog
{
CFont m_font; // 字體物件
static const TCHAR* DISPLAYSTR; // 顯示字串
// ...
};
定義字串常數:#define DISPLAYSTR _T("Sailmer Agent")
void CDisableFontDlg::SetFont(CString strFace, int nHeight = -16,
int nWeight = FW_BOLD, BYTE bItalic = TRUE, BYTE bUnderline = FALSE)
{
if (m_font.m_hObject) m_font.Detach(); // 釋放舊字體
m_font.CreateFont(nHeight, 0, 0, 0, nWeight, bItalic, bUnderline,
0, 0, 0, 0, 0, 0, strFace);
}
參數對應 LOGFONT 結構:高度、寬度、傾角、方向、粗細、斜體、底線、字元集等。
OnInitDialog)BOOL CDisableFontDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetFont(_T("Verdana"), -25); // 25 點大小,粗體、斜體
return TRUE;
}
OnPaint)void CDisableFontDlg::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);
CFont* pOldFont = dc.SelectObject(&m_font);
// 計算文字範圍以置中
CSize szText = dc.GetTextExtent(DISPLAYSTR, _tcslen(DISPLAYSTR));
CPoint ptStart((rect.Width() - szText.cx) / 2, 10);
// 核心:使用 DrawState 繪製禁用狀態文字
dc.DrawState(ptStart, rect.Size(), DISPLAYSTR,
DSS_DISABLED, // 禁用狀態:系統自動產生灰化立體效果
TRUE, 0, (CBrush*)NULL);
dc.SelectObject(pOldFont);
}
| API/旗標 | 作用 |
|---|---|
CDC::DrawState | 高階繪圖函式,支援圖示、位圖、文字的多種狀態繪製 (正常、禁用、連結、熱點等)。 |
DSS_DISABLED | 指示繪製「禁用」視覺效果:灰色系、立體浮雕感,模擬系統禁用控制項外觀。 |
CFont::CreateFont | 建立邏輯字體,參數豐富控制字型外觀。 |
Detach | 將 HFONT 從 CFont 分離,避免重複建立時資源洩漏。 |

文字呈現灰白立體浮雕感,如同系統禁用按鈕文字,極具視覺張力。
DSS_UNION、DSS_MONO 實現單色/聯合繪製模式。DSS_NORMAL / DSS_DISABLED 回應使用者互動 (如授權狀態)。AlphaBlend 實現半透明禁用效果 (需分層視窗支援)。DrawState 是 GDI 中被低估的寶藏函式。善用 DSS_DISABLED 旗標,幾行程式碼即可產生專業級禁用文字特效,無需手工計算陰影像素,極大簡化介面美化工作量。