科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 三、倾斜文本

  示例代码下载:GDIPlusShearText.zip


图:显示倾斜文本的例子程序界面

  1、存储倾斜参数

  这里存在最终用户定义文本倾斜参数的问题,在这种情况下,定义一个变量存储这个值,然后调用PictureBox 控件的Paint 方法(例子代码中,是通过"显示文本"按钮的单击响应函数btnDisplayText_Click来调用这个方法)。有时你需要使用用户键入的其他值,如字体大小等。在例子程序中,代码如下:

public __gc class Form1 : public System::Windows::Forms::Form
{
 ...
 protected:
  String* textToDisplay;
  Decimal fontSize;
  Decimal shearSize;
  ...
 private: System::Void btnDisplayText_Click(System::Object * sender, System::EventArgs * e)
 {
  // Set up internal display values
  textToDisplay = txtToDisplay->Text;
  fontSize = spnFontSize->Value;
  shearSize = spnShear->Value;
  // Invalidate the control
  picText->Invalidate();
 }

  2、实现PictureBox控件的Paint方法

  文本将在PictureBox控件上进行绘制,所以实现Paint方法可以确保在需要的时候控件进行重绘。下面代码的中的条件语句确保用户已经输入了需要显示的文本。

private: System::Void picText_Paint(System::Object * sender,
System::Windows::Forms::PaintEventArgs * e)
{
 if (textToDisplay)
 {
 }
}

  下面步骤中的代码全部放入到PictureBox对象的Paint方法中。

  3、获取picture控件的Graphics对象

  可以通过PictureBox控件的CreateGraphics方法获取Graphics对象。然而,当Graphics对象超出作用域范围时,垃圾收集器将回收它。这时候,这个对象是不稳定的,所以,你需要的Graphics对象要从Paint 方法得到(经由PaintEventArgs::Graphics方法)。

Graphics* g = e->Graphics;

  4、在用户提供的字体大小基础上实例化字体

  这个程序使用默认的"Times New Roman"字体,所以下面的代码使用用户规定的字体大小创建Times New Roman"字体。

System::Drawing::Font* font = new System::Drawing::Font("Times New Roman",
Convert::ToSingle(fontSize), FontStyle::Regular);

  5、获取所要显示的文本的尺寸

  Graphics::MeasureString方法通常来测量字符串的尺寸,它将返回所要按某种字体显示的文本的尺寸。

SizeF textSize = g->MeasureString(textToDisplay, font);

  6、对PictureBox控件进行清除操作

  通过PictureBox::Clear方法来初始化PictureBox控件并定义所需要的颜色,下面的代码使用了用户为控件定义的值。

g->Clear(SystemColors::Control);

  7、计算文本在PictureBox控件上显示的位置

  下面的代码决定了居中显示文本坐标位置(X,Y)。

Single x = (picText->Width - textSize.Width) / 2;
Single y = (picText->Height - textSize.Height) / 2;

  8、对PictureBox控件的平移矩阵进行平移

  为了正确衡量文本,你必须重新衡量整个graphics对象,所以,首先必须重新定位最初的Graphics对象到(X,Y)处,你通过Graphics::TranslateTransform方法来完成上述任务。

g->TranslateTransform(x, y);

  9、返回新产生的变换矩阵

  一旦你对一个给定的PictureBox控件产生了一个"世界坐标的转换",它可以通过Graphics::Transform属性返回一个矩阵对象,这个矩阵将用来倾斜文本。

Matrix* transform = g->Transform;

  10、使用用户定义的值倾斜转换矩阵

  矩阵对象有一个Shear方法,这个方法就可以来实现文本倾斜。它使用水平及垂直因子,这个例子中只使用了水平倾斜值,但是这两个值可以非常简单地进行定义。然而需要注意的是,这种平移技术只有在一个值为零时才能实现真正的倾斜。

transform->Shear(Convert::ToSingle(shearSize), 0);

  11、将新得到的转换矩阵赋于图形对象的转换矩阵

  一旦本地的矩阵经过Shear方法进行了修改,就需要将Graphic对象的transform设置为这个新值。

g->Transform = transform;

  12、绘制文本

  既然已经设置了PictureBox控件的绘制区域,最后就可以调用Graphics::DrawString方法来绘制文本了。

g->DrawString(textToDisplay, font, Brushes::Black, 0, 0);

  四、绘制反射文本

  示例程序下载:GDIPlusReflectedText.zip

  首先,实现PictureBox 控件的Paint事件。注意,在实现这种显示效果时,它前面的5个步骤与上例中一样,读者朋友可以参考上例。

  1、对PictureBox控件的平移矩阵进行平移

  不久,你就需要测量Graphics对象,这样才能绘制反向的文本。然而,测量影响到了整个Graphics对象,不仅仅是需要绘制的文本,所以,你需要将Graphics对象重新定位到你希望显示文本的位置。

g->TranslateTransform(x, y);

  2、计算显示文本的高度

  你需要在最初文本的下面显示反射文本,虽然你通过Measurestring方法得到文本的高度,但这个高度包括空白高度,而我们需要的是纯字体的高度,下面的代码得到了纯文本的高度。

int lineAscent = font->FontFamily->GetCellAscent(font->Style);
int lineSpacing = font->FontFamily->GetLineSpacing(font->Style);
Single lineHeight = font->GetHeight(g);
Single cy = lineHeight * lineAscent / lineSpacing;

  3、绘制最初的文本

  注意XY的坐标值在(0,0)处,这是由于你前期调用TranslateTransform方法产生的结果。

g->DrawString(textToDisplay, font, Brushes::Black, 0, 0);

  4、对graphic对象的transformation 矩阵使用必须的比例因子

  为了反射文本,你需要使用ScaleTransform方法,在这个方法中使用-1,使文本按次序进行反射。

g->ScaleTransform(1, -1.0F);
  
  5、绘制反射文本

  一旦比例因子建立以后,你只要简单地绘制反射文本就可以了,注意Y值被设置为文本高度的-2倍,这样它才能显示在文本的下方。

g->DrawString(textToDisplay, font, Brushes::Gray, 0, -(cy*2));

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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