科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC++.NET中使用GDI+创建特效字体

VC++.NET中使用GDI+创建特效字体

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

来自于微软.NET技术的C++托管扩展所包含的GDI+技术功能十分强大,本文将介绍如何使用GDI+的画刷来绘制文本。

作者:刘涛 来源:天极网 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
二、实现文本的3D效果

  上节探讨了如何实现2D文字的显示。这部分我们将探讨如何实现阴影、块状、浮雕、雕刻文本效果。简单的说,上述文字效果是通过对文本的多次绘制来实现的。首先在背景上绘制最远的文本(也即是阴影),然后逐渐向最外层文本过度。换句话说,绘制3D文本就是多次绘制2D文本。这里,我将重点集中在如何实现3D效果的代码上。

  注意:为了测试这些代码片段,首先要在托管扩展程序的窗体上放置一个PictureBox控件,并将该控件命名为picText,然后将代码拷贝到你的应用程序中,以此实现在PictureBox控件上绘制3D效果的文本。下面是例子程序(代码程序下载:)界面效果图。


  1、阴影效果文本

  为了取得阴影效果,你只需要绘制文本两次。首先是阴影文本然后是最前面的文本。例如,下面的代码绘制了一个阴影文本,阴影文本在前端文本后方5个像素处。


图二、阴影文本效果

// Assumes a PictureBox on the form named picText
// with this code being the picText object’s
// Paint method
private:
System::Void picText_Paint( System::Object * sender,
System::Windows::Forms::PaintEventArgs * e)
{
 // Test string
 String* textToDisplay = S"Test string";
 // Obtain Graphics object
 Graphics* g = e->Graphics;
 // Create a Font object, Times New Roman, 25pt
 System::Drawing::Font* font = new System::Drawing::Font("Times New Roman", Convert::ToSingle(25),           FontStyle::Regular);
 // Obtain the size of the text to be rendered
 SizeF textSize = g->MeasureString(textToDisplay, font);
 // Text will be centered on PictureBox control
 Single x = (picText->Width - textSize.Width) / 2;
 Single y = (picText->Height - textSize.Height) / 2;
 // Clear background
 g->Clear(Color::White);
 // 注意:使用系统"光照"画刷绘制阴影文本
 g->DrawString(textToDisplay, font, SystemBrushes::ControlLight, x + 5, y + 5);
 // 使用系统默认的文本画刷绘制前端文本。
 g->DrawString(textToDisplay, font, SystemBrushes::ControlText, x, y);
}

  2、实现块状文本

  为了实现块状文本效果,从希望的背景出开始一个像素一个像素地移动位置,并绘制文本。非常明显,这时需要确定重复绘制文本的方向。本文示例程序绘制文本时将光源设置在右上角,这意味着要使用for循环,并在X方面上减少偏移量。如果将光源移动到左上角,只需要反过来增加偏移量就可以了。


图三、块状文本效果

// Assumes a PictureBox on the form named picText
// with this code being the picText object’s
// Paint method
private:
System::Void picText_Paint( System::Object * sender,
System::Windows::Forms::PaintEventArgs * e)
{
 // Test string
 String* textToDisplay = S"Test string";
 // Get drawing surface for PictureBox and clear background
 Graphics* g = e->Graphics;
 // Create a Font object
 System::Drawing::Font* font = new System::Drawing::Font("Times New Roman", Convert::ToSingle(25), FontStyle::Regular);
 // Obtain the size of the text to be rendered
 SizeF textSize = g->MeasureString(textToDisplay, font);
 // Text will be centered on Picture Box control
 Single x = (picText->Width - textSize.Width) / 2;
 Single y = (picText->Height - textSize.Height) / 2;
 // Clear background
 g->Clear(Color::White);
 // 从背景处开始反复绘制阴影文本
 for (int i = Convert::ToInt32(5); i >= 0; i--)
 {
  g->DrawString(textToDisplay, font, SystemBrushes::ControlLight, x - i, y + i);
 }
 // 绘制前端文本
 g->DrawString(textToDisplay, font, SystemBrushes::ControlText, x, y);
}

  3、浮雕及雕刻文本

  由于浮雕及雕刻是一种相反的效果,所以本文将这两种效果放在一节中进行解释。浮雕效果常常通过阴影文本技术来实现,深度设置为1个像素,前景文本的颜色设置为背景颜色。阴影的文本的颜色选择黑色或灰色。雕刻效果的步骤相反,阴影文本相对于前面的文本向左上方偏移一个像素。


图四、浮雕效果


图五、雕刻效果

// Assumes a PictureBox on the form named picText
// with this code being the picText object’s
// Paint method
private:
System::Void picText_Paint( System::Object * sender,
System::Windows::Forms::PaintEventArgs * e)
{
 // Test string
 String* textToDisplay = S"Test string";
 // Get drawing surface for PictureBox and clear background
 Graphics* g = e->Graphics;
 // Create a Font object
 System::Drawing::Font* font = new System::Drawing::Font("Times New Roman", Convert::ToSingle(25), FontStyle::Regular);
 // Obtain the size of the text to be rendered
 SizeF textSize = g->MeasureString(textToDisplay, font);
 // Text will be centered on Picture Box control
 Single x = (picText->Width - textSize.Width) / 2;
 Single y = (picText->Height - textSize.Height) / 2;
 // Clear background
 g->Clear(Color::White);
 // isEmbossed变量用来决定浮雕或雕刻效果
 bool isEmbossed = false;
 g->DrawString(textToDisplay, font, SystemBrushes::ControlText,
   x + Convert::ToSingle( (isEmbossed? 1 : -1)),
   y + Convert::ToSingle( (isEmbossed ? 1 : -1)));

 // Draw the foreground text
 g->DrawString(textToDisplay, font, new SolidBrush(Color::White), x, y);
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章