C++ GDI+ 带阴影的文字功能的实现

用GDI+的优秀图形输出功能可以非常方便的实现文字特效,其中一个带阴影的文字便是其中一例。

许多简单的文字特效只是简单的将文字用不同的颜色与不同的位置输出一次或多次,本文所讨论的阴影效果借助GDI+的反走样能力生成透明的阴影与半阴影。 这儿所述的方法先在绘图平面上绘制一个比预期小的文字,然后放大它。

由于代码注释很详细,直接上代码:

ULONG_PTRg_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);RectFdesRC(ClientRC.left, ClientRC.top, ClientRC.Width(), ClientRC.Height());PointFtxtPos(0, 0);FontFamily fontFamily(L"Times New Roman");Gdiplus::Font font(&fontFamily, 100, FontStyleBold, UnitPixel);Graphicsg(m_picBox.GetDC()->m_hDC);//1.0 填充背景色g.FillRectangle(&Gdiplus::SolidBrush(Color::LightSlateGray), desRC);//2.0 创建一个小尺寸的内存位图,设置它的长宽为总尺寸的1/4Bitmap 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;}}

爬上那座山,听最圣洁的经。

C++ GDI+ 带阴影的文字功能的实现

相关文章:

你感兴趣的文章:

标签云: