当前位置:C++技术网 > 资讯 > GDI+矩阵变换之文字大小渐变

GDI+矩阵变换之文字大小渐变

更新时间:2015-12-07 20:28:40浏览次数:1+次

文本在路径中的保存形式是以点的信息来实现的,每一点都包含该点的坐标信息及类型信息。我们可以在程序中按照规律依次修改
这些点的坐标信息及类型信息。我们可以在程序中按照规律依次修改这些点的坐标信息,之后使用修改后的点信息重新构造路径,
这样就可以定制任意的文本输出轮廓。
代码实现字体先沿着水平方向逐渐变大,到文本的中部之后,字体慢慢还原:

新建单文档工程,新建菜单项,并新建个子菜单项,接着建立消息响应,代码实现:

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)作为坐标原点,依据这个位置信息可以确定文本大小变动的趋势:在区域中心的左边字体从小到大,在右边的字体从大到小