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

VC++ 界面繪製 3D 立體文字效果實現

     編輯:關於VC++

效果原理

利用系統顏色 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 並計算行高
  • 抗鋸齒:若目標系統支援 GDI+,可改用 Graphics::DrawString 獲得更平滑邊緣
  • 封裝類:提取為 C3DTextCtrl 繼承 CStatic,暴露 Set3DText()、SetDepth() 介面

適用場景

  • 應用程式標題欄品牌標識
  • 對話框歡迎頁面標語
  • 狀態欄重要提示文字
  • 自定義控件標籤

總結

僅需 20 行核心代碼,無需外部資源、無效能負擔,即可為 MFC 介面增添專業視覺質感。掌握「雙色疊加 + 像素偏移」技巧,可輕鬆擴展至外發光、內陷、多層疊加等進階效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved