这些点的坐标信息及类型信息。我们可以在程序中按照规律依次修改这些点的坐标信息,之后使用修改后的点信息重新构造路径,
这样就可以定制任意的文本输出轮廓。
代码实现字体先沿着水平方向逐渐变大,到文本的中部之后,字体慢慢还原:
新建单文档工程,新建菜单项,并新建个子菜单项,接着建立消息响应,代码实现:
void C油表View::OnFontmatrix1()
{
// TODO: 在此添加命令处理程序代码
Graphics graphics(this->m_hWnd);
this->RedrawWindow();
//////构造字体系列
FontFamily fontfamily(L"宋体");
/////创建路径区域
GraphicsPath path;
SolidBrush blueBrush(Color::Blue);
graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
//////向区域中追加文本,字体大小为80
path.AddString(L"C++技术网", -1, &fontfamily, FontStyleRegular, 80, Point(0, 0), NULL);
//////获取路径所占的矩形区域
RectF bound;
path.GetBounds(&bound);
/////获取路径区域的中心点
float halfh = bound.Height / 2;
float halfw = bound.Width / 2;
/////对路径实施变换,更改路径区域的中心点
Matrix pathMatrix(1, 0, 0, 1, -halfw, -halfh);
path.Transform(&pathMatrix);
//////获取路径点的信息
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);
path.GetBounds(&bound);
////依次对路径定义点的Y值进行缩放
for (int i = 0; i < count; i++)
{
//////根据该点距离路径起点的距离占整个路径长度的比例更改Y值
dataPoints[i].Y *= 2 * (bound.Width - abs(dataPoints[i].X)) / bound.Width;
}
//////根据更改后的路径定义点重新构造路径
GraphicsPath newpath(dataPoints, pTypes, count);
//////将绘图平面的原点移到窗口中心
CRect rect;
this->GetClientRect(&rect);
graphics.TranslateTransform(rect.Width() / 2, rect.Height() / 2);
/////填充路径
graphics.FillPath(&blueBrush, &newpath);
}
效果图:
Matrix pathMatrix(1,0,0,1,-halfw,-halfh)这行代码将路径中心定位在文本的中央,以(-halfw,-halfh)作为坐标原点,依据这个位置信息可以确定文本大小变动的趋势:在区域中心的左边字体从小到大,在右边的字体从大到小