許多簡單的文字特效只是簡單的將文字用不同的顏色與不同的位置輸出一次或多次,本文所討論的陰影效果借助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; } }