中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 图形图像与多媒体
带阴影文字输出的实现
作者:未知 时间:2005-07-20 14:16 出处:VC知识库 责编:chinaitpower
              摘要:带阴影文字输出的实现

带阴影文字输出的实现

作者:李昊

下载源代码

一、正文

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

}      
三、效果图

效果图(jpeg的效果不如程序中的好)

四、结束语
  关于怎么在VS2003中如何使用GDI+请参考我以前的文章:

  本作者熟悉C++/MFC,熟悉GDI/GDI+,英文文档翻译,接做文档翻译,小型系统开发,技术难题突破等,Email:realman1981@sohu.com,电话:13679278016

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有