C++带阴影文字输出的实现

一、正文

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

步骤:

创建内存位图,设它的长宽为当前窗口的几分之几(此例中我取当前窗口的1/4);
创建一个矩阵,使字体为原来的1/4,阴影距离也为你要设置文本的1/4;
在位图上绘制文本,设置绘制模式为反走样模式,创建一个有透明度的画笔(比如50%透明)。记住我们新创建的内存位图都为100%透明,因此我们所加入不完全透明的位 在绘制时将呈现出艺术效果;
把位图显示在屏幕上,在两个方向上都放大4倍,插值模式为高质量双三次插值法,插值法非常重要,因为双三次插值使文本的边模糊,这样就出现阴影与半影效果;
最后,把文本绘制到绘图平面上,设置绘制模式为反走样模式以保证正确的范围;

二、代码说明请使用

void CDropShadowEffectTextView::OnDraw(CDC* pDC) { using namespace Gdiplus; CDropShadowEffectTextDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CRect ClientRect; GetClientRect(&ClientRect); CSize ClientSize(ClientRect.Width(),ClientRect.Height()); RectF theRect(ClientRect.left,ClientRect.top,ClientRect.Width(),ClientRect.Height()); PointF textPos(10, ClientSize.cy/3); CStringW text("文字阴影特效"); FontFamily fontFamily(L"Times New Roman"); Font font(&fontFamily, 100, FontStyleBold, UnitPixel); Graphics g(pDC->m_hDC); LinearGradientBrush b(theRect,Color::Blue,Color::AliceBlue,90.0f); g.FillRectangle(&b,theRect); //Make a small bitmap Bitmap bm(ClientSize.cx/4,ClientSize.cy/4,&g); //Get a graphics object for it Graphics* bmpg = Graphics::FromImage(&bm); // must use an antialiased rendering hint bmpg->SetTextRenderingHint(TextRenderingHintAntiAlias); //this matrix zooms the text out to 1/4 size and offsets it by a little right and down Matrix mx(0.25f,0,0,0.25f,3,3); bmpg->SetTransform(&mx); //The shadow is drawn bmpg->DrawString(text,-1,&font,textPos,NULL,&SolidBrush(Color(128, 0,0,0))); //The destination Graphics uses a high quality mode g.SetInterpolationMode(InterpolationModeHighQualityBicubic); //and draws antialiased text for accurate fitting g.SetTextRenderingHint(TextRenderingHintAntiAlias); //The small image is blown up to fill the main client rectangle g.DrawImage(&bm,theRect,0,0,bm.GetWidth(),bm.GetHeight(),UnitPixel); //finally, the text is drawn on top g.DrawString(text,-1,&font,textPos,NULL,&SolidBrush(Color::White)); }

效果图:

转自:http://www.vckbase.com/document/viewdoc/?id=1460

你可能感兴趣的:(C++带阴影文字输出的实现)