Gdiplus阴影文字实现

原文地址:http://www.vckbase.com/document/viewdoc/?id=1460

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

步骤:

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

二、代码说明请使用

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));

}  
效果图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值