三、倾斜文本 示例代码下载:
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)); |
查看本文来源