技术开发 频道

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

  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);
  四、绘制反射文本
 
  首先,实现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));

 

 

 

0
相关文章