新建GDI+工程,新建菜单项,并在新建的菜单项下新建一个子菜单项,建立消息响应:

void C油表View::OnFontshear()
{
	// TODO: 在此添加命令处理程序代码
	Graphics graphics(this->m_hWnd);
	this->RedrawWindow();
	SolidBrush brush(Color(255, 0, 0, 255));
	FontFamily fontFamily(L"宋体");
	Gdiplus::Font myFont(&fontFamily, 20, FontStyleRegular, UnitPixel);
	Gdiplus::Font font(L"Times New Roman", 100);
	Matrix mymat;
	mymat.Shear(-1.4, 0.0);
	mymat.Scale(1, 0.5);
	mymat.Translate(236,170);
	graphics.SetTransform(&mymat);
	Matrix matrix;
	graphics.GetTransform(&matrix);
	SolidBrush mybrush(Color::Gray);
	SolidBrush redbrush(Color::Red);
	graphics.DrawString(L"Hello", -1, &font, PointF(0, 50), NULL, &mybrush);
	graphics.ResetTransform();
	graphics.DrawString(L"Hello", -1, &font, PointF(0, 50), NULL, &redbrush);
	///////在新位置上查看变换矩阵的信息
	REAL x[6];
	///////产看每一个矩阵元素的值,清空数组元素
	for (int ii = 0; ii < 6; ii++)
	{
		x[ii]=0;
	}
	CString msg;
	////////获取矩阵元素值
	mymat.GetElements(x);
	for (int i = 0; i < 6; i++)
	{
		CString value;
		value.Format(L"%-10.2f", x[i]);
		msg += value;
		CStringW valueW(msg);
		///////输出行向量
		if (i == 1 || i == 3 || i == 5)
		{
			graphics.DrawString(valueW.GetBuffer(0), -1, &myFont, PointF(0, 0), NULL, &SolidBrush(Color::Black));
			///////在垂直方向上移一行
			graphics.TranslateTransform(0, myFont.GetHeight(0.0));
			msg.Empty();
		}
	}
}
代码实现:

这个代码实现的原理其实就是在投射变换之后再输出文本,那么扭曲的文本可以成为正常输出文本的“投影”。