新建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();
}
}
}
代码实现:
这个代码实现的原理其实就是在投射变换之后再输出文本,那么扭曲的文本可以成为正常输出文本的“投影”。