程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ GDI+ 帶陰影的文字功能的實現

C++ GDI+ 帶陰影的文字功能的實現

編輯:關於C++
用GDI+的優秀圖形輸出功能可以非常方便的實現文字特效,其中一個帶陰影的文字便是其中一例。

許多簡單的文字特效只是簡單的將文字用不同的顏色與不同的位置輸出一次或多次,本文所討論的陰影效果借助GDI+的反走樣能力生成透明的陰影與半陰影。 這兒所述的方法先在繪圖平面上繪制一個比預期小的文字,然後放大它

由於代碼注釋很詳細,直接上代碼:

 

ULONG_PTR	g_gdiPlusToken = NULL;  //GDI+ 初始化
void CMFCApplication1Dlg::OnBnClickedOk()
{
    using namespace Gdiplus;

    if (NULL == g_gdiPlusToken)
    {
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        Gdiplus::GdiplusStartup(&g_gdiPlusToken, &gdiplusStartupInput, NULL);
    }

    CRect    ClientRC;    
    CStringW strTxt("19:20:30");

    m_picBox.GetClientRect(&ClientRC);
    RectF         desRC(ClientRC.left, ClientRC.top, ClientRC.Width(), ClientRC.Height());
    PointF        txtPos(0, 0);
    FontFamily    fontFamily(L"Times New Roman");
    Gdiplus::Font font(&fontFamily, 100, FontStyleBold, UnitPixel);
    Graphics      g(m_picBox.GetDC()->m_hDC);

    //1.0 填充背景色
    g.FillRectangle(&Gdiplus::SolidBrush(Color::LightSlateGray), desRC);

    //2.0 創建一個小尺寸的內存位圖,設置它的長寬為總尺寸的1/4
    Bitmap bmp(ClientRC.Width() / 4, ClientRC.Height() / 4, &g);

    //2.1 設置繪制模式為反走樣模式
    Graphics* pTempG = Graphics::FromImage(&bmp);
    pTempG->SetTextRenderingHint(TextRenderingHintAntiAlias);
    
    //2.2 創建一個矩陣,使字體為原來的1/4,陰影距離也為你要設置文本的1/4左右
    Matrix mx(0.25f, 0, 0, 0.25f, 3, 3);
    pTempG->SetTransform(&mx);

    //2.3 在位圖上繪制文本,使用有透明度的畫筆(比如50%透明)
    pTempG->DrawString(strTxt, -1, &font, txtPos, NULL, &SolidBrush(Color(128, 0, 0, 0)));

    //3.1 插值模式為高質量雙三次插值法,插值法非常重要,因為雙三次插值使文本的邊模糊,這樣就出現陰影與半影效果
    g.SetInterpolationMode(InterpolationModeHighQualityBicubic);
   
    //3.2 設置繪制模式為反走樣模式以保證正確的范圍
    g.SetTextRenderingHint(TextRenderingHintAntiAlias);

    //3.3 把位圖顯示在屏幕上,在兩個方向上都放大4倍
    g.DrawImage(&bmp, desRC, 0, 0, bmp.GetWidth(), bmp.GetHeight(), UnitPixel);

    //3.4 把文本繪制到繪圖平面上, 使用白色字體
    g.DrawString(strTxt, -1, &font, txtPos, NULL, &SolidBrush(Color::White));

    //4.0 釋放內存
    if (NULL != pTempG)
    {
        delete pTempG;
        pTempG = NULL;
    }
}
\

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved