TransformPoints函数用于对点信息进行批量修改,我们可以结合路径来实现TransformPoints函数更为强大的运算。GraphicsPath类的成员函数GetPathPoints可以获取构成路径的所有点的信息,如果对这些点信息使用TransformPoints进行进一步修改,可以让轮廓产生意想不到的变换结果。
下面以实现文字的两种特效为例,说明TransformPoints函数在路径变换中的具体应用。在路径对象中,可以使用AddString函数向路径中追加文本,这些文本的轮廓代表路径的轮廓。如果对组成路径轮廓进行修改,最终的结果都会反映在文本轮廓中,所以,TransformPoints函数可以通过对点信息的修改来实现文本特效。
新建工程,加入GDI+程序必备的代码,你可以在之前我写的文章去找,有介绍。下面新建一个菜单项“GDI+学习”,新建一个子菜单项“文字特效”,建立消息响应:
void C旋转字体View::OnMatrixtranslatepoints()
{
// TODO: 在此添加命令处理程序代码
Graphics graphics(this->m_hWnd);
this->RedrawWindow();
///////构造字体系列
FontFamily fontFamily(L"宋体");
//////创建路径区域
GraphicsPath path;
SolidBrush redBrush(Color::Red);
graphics.SetTextRenderingHint(TextRenderingHintClearTypeGridFit);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
//////向区域中追加文本,字体大小为80
path.AddString(L"文字特效",-1,&fontFamily,FontStyleRegular,80,Point(0,0),NULL);
//////获取路径的点信息
INT count=path.GetPointCount();
Point* dataPoints=new Point[count];
path.GetPathPoints(dataPoints,count);
///////获取路径的点类型信息
INT num=path.GetPointCount();
BYTE* pTypes=new BYTE[num];
path.GetPathTypes(pTypes,num);
////复制路径
GraphicsPath* path2=path.Clone();
//////将文本在水平方向上缩小,在垂直方向上拉伸
Matrix matrix(0.5,0.0,0.0,3.5,0.0,0.0);
//////对points数据中的每一个成员进行矩形运算
matrix.TransformPoints(dataPoints,count);
//////根据计算后的点重新构造路径
GraphicsPath newpath(dataPoints,pTypes,count);
//////填充路径
graphics.FillPath(&redBrush,&newpath);
///////第二种特效
Matrix matrix2(0.6,0.5,0.2,1.5,160,-40);
path2->GetPathPoints(dataPoints,count);
///////根据计算后的点重新构造路径
matrix2.TransformPoints(dataPoints,count);
GraphicsPath newpath2(dataPoints,pTypes,count);
graphics.FillPath(&redBrush,&newpath2);
}
代码实现:
GDI+中使用类Matrix描述矩阵,矩阵的构造有下列几种方式:
Matrix()
Matrix(m11,m12,m21,m22,dx,dy)
Matrix(Rect& rect, Points* dstplg)
Matrix(Rect& rect, PointsF* dstplg)
其中,在第二种和第三种构造函数中,参数m11,m12,m21,m22,dx,dy所构成的矩阵如下:
m11 m12 0 x y 0
m21 m22 0 w h 0
dx dy 1 px py 1
在上面所列的矩阵中,右边部分的元素x,y,w,h分别代表rect左上角的位置及矩形的宽度和高度;px,py分别代表点的位置。
在GDI+中,只要给出足够多的点,利用这些点就可以构造任何几何图形。GDI+中的曲线,直线,矩形,圆等几何图形,都是以点的信息作为参数绘制。如果想对几何图形的组成点进行批量修改(如让每一个点都在原来的位置上旋转一定的角度),可以直接通过使用Matrix类的成员函数TransformPoints来实现,该函数的调用格式为:
TransformPoints(Points* pts, INT count);
TransformPoints(PointF* pts, INT count);