為靜態文字、群組框、自定義控件提供 3D 凸起/凹陷邊框,純 GDI 繪製,無外部依賴,易於整合進現有 MFC 專案。
class C3DBar
{
public:
void SetBarColor(COLORREF cr); // 設定基準色 (自動計算高光/陰影)
void DrawHorizontal(CDC* pDC, CRect& rc); // 水平橫條
void DrawVertical(CDC* pDC, CRect& rc); // 垂直直條
void DrawLeft(CDC* pDC, CRect& rc); // 左邊框
void DrawRight(CDC* pDC, CRect& rc); // 右邊框
void DrawTop(CDC* pDC, CRect& rc); // 上邊框
void DrawBottom(CDC* pDC, CRect& rc); // 下邊框
};
void C3DBar::DrawLeft(CDC* pDC, CRect& rc)
{
// 基準色派生高光/陰影色
COLORREF clrHigh = RGB(GetRValue(m_cr)*0.8+51, GetGValue(m_cr)*0.8+51, GetBValue(m_cr)*0.8+51);
COLORREF clrShadow = RGB(GetRValue(m_cr)*0.5, GetGValue(m_cr)*0.5, GetBValue(m_cr)*0.5);
CPen penHigh(PS_SOLID, 1, clrHigh), *pOldPen = pDC->SelectObject(&penHigh);
pDC->MoveTo(rc.left, rc.bottom);
pDC->LineTo(rc.left, rc.top); // 左上亮線
pDC->SelectObject(pOldPen);
CPen penShadow(PS_SOLID, 1, clrShadow);
pOldPen = pDC->SelectObject(&penShadow);
pDC->MoveTo(rc.left+1, rc.top);
pDC->LineTo(rc.right, rc.top); // 上亮線延伸
pDC->MoveTo(rc.left+1, rc.bottom-1);
pDC->LineTo(rc.right, rc.bottom-1); // 下暗線
pDC->SelectObject(pOldPen);
}
CDigiStaticvoid CDigiStatic::OnPaint()
{
CPaintDC dc(this);
CRect rc; GetClientRect(&rc);
// 計算邊框寬度 (客戶區 1/30)
int w = max(1, rc.Width() / 30);
CRect rcLeft(0, 0, w, rc.Height());
CRect rcRight(rc.right - w, 0, rc.right, rc.Height());
CRect rcTop(0, 0, rc.Width(), w);
CRect rcBottom(0, rc.bottom - w, rc.Width(), rc.bottom);
m_3dBar.SetBarColor(RGB(180, 180, 180)); // 銀灰基準色
m_3dBar.DrawLeft(&dc, rcLeft);
m_3dBar.DrawRight(&dc, rcRight);
m_3dBar.DrawTop(&dc, rcTop);
m_3dBar.DrawBottom(&dc, rcBottom);
// 繪製內容文字...
}
SetState(BOOL bPressed, BOOL bHover, BOOL bFocused),根據狀態切換高光/陰影色序,模擬按鈕按下/懸停效果。RoundRect 或 GraphicsPath (GDI+) 繪製圓角 3D 邊框。GetSysColor(COLOR_3DFACE) 等系統色,自動跟隨系統主題。