一、正文
用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));
}
三、效果圖
效果圖(jpeg的效果不如程序中的好)
本文配套源碼