首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 繪製 3D 立體邊框:C3DBar 類封裝

     編輯:VC 教學

設計目標

為靜態文字、群組框、自定義控件提供 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);     // 下邊框
};

核心繪製邏輯 (以 DrawLeft 為例)

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);
}

整合範例:自定義靜態控件 CDigiStatic

void 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) 等系統色,自動跟隨系統主題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved