背景
图形变换是指对绘制的图形进行平移、旋转、伸缩等操作,由 Graphics 类提供对应的成员函数进行实现
平移变换
①.概述
平移变换将所绘制图形的坐标 (x, y) 全部平移一个增量 (dx, dy),对应成员函数 TranslateTransform ,相当于移动了绘图的坐标系原点。
②.平移变换
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue, 2);
Rect m_rect(30, 30, 180, 120);
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
graphics.TranslateTransform(20, 40);//x 平移20,y 平移40
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
}
旋转变换
①.概述
旋转变换将所绘制图形的坐标(x, y)全部旋转 α度,是相对于左上角的坐标原点进行旋转。对应成员函数 RotateTransform。
②.旋转变换
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue, 2);
Rect m_rect(30, 30, 180, 120);
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
graphics.RotateTransform(10);//旋转10度
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
}
伸缩变换
①.概念
伸缩变换将所绘制图形的形状在 x 和 y 方向上按指定比例 sx 和 sy 进行缩放,对应成员函数 ScaleTransform,变换的是图形中各坐标点的值。
②.伸缩变换
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue, 2);
Rect m_rect(30, 30, 180, 120);
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
graphics.ScaleTransform(0.3f, 0.3f);//x、y 变为原来的 0.3
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
}
③.镜像变换
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue, 2);
Font font(L"宋体", 30, FontStyleRegular, UnitPixel);
SolidBrush solidBrush(Color::Blue);
StringFormat stringFormat;
stringFormat.SetLineAlignment(StringAlignmentCenter);
graphics.TranslateTransform(250, 40);//更改坐标原点
QString m_text = "GDI+文字绘制";
graphics.DrawString(m_text.toStdWString().c_str() , -1, &font, PointF(0.0f, 40.0f), &stringFormat, &solidBrush);
graphics.ScaleTransform(-1, 1);//上下对称
graphics.DrawString(m_text.toStdWString().c_str(), -1, &font, PointF(0.0f, 40.0f), &stringFormat, &solidBrush);
}
矩形缩放
①.概述
Rect 类提供有成员函数 Inflate 用于矩形进行缩放,缩放结果是把矩形的四个边向外扩展或者向内收缩指定的距离。
②.Inflate使用
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue, 2);
Rect m_rect(30, 30, 180, 120);
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
m_rect.Inflate(-10, -10);//4条边向内收缩10个像素
graphics.DrawRectangle(&m_pen, m_rect);//绘制矩形
}