用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; } }
时间: 2024-10-09 18:25:52