新建GDI+单文档工程,加入必要的GDI+代码,看代码:
void C油表View::OnRotatephoto()
{
// TODO: 在此添加命令处理程序代码
Graphics graphics(this->m_hWnd);
this->RedrawWindow();
//////加载图片
Image image(L"cos.jpg");
/////获取当前窗口的中心点
CRect rect;
this->GetClientRect(&rect);
Point center(rect.CenterPoint().x, rect.CenterPoint().y);
int offsetX, offsetY;
offsetX = center.X - image.GetWidth() / 2;
offsetY = center.Y - image.GetHeight() / 2;
//////构造图片显示区域,让图片的中心点与窗口的中心点一致
RectF picRect(offsetX, offsetY, image.GetWidth(), image.GetHeight());
PointF Pcenter = PointF(picRect.X + picRect.Width / 2, picRect.Y + picRect.Height / 2);
////让图片绕中心旋转一周
for (int i = 0; i < 36; i++)
{
////绘图平面以图片的中心点旋转
graphics.TranslateTransform(Pcenter.X, Pcenter.Y);
graphics.RotateTransform(i);
//////恢复绘图平面在水平和垂直方向上的平移
graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);
///////绘制图片并延时
graphics.DrawImage(&image, picRect);
//Sleep(1000);
///////重置绘图平面的所有变换
graphics.ResetTransform();
}
}
代码实现图:
图片中的锯齿就是图片旋转过程中留下来的。
graphics.TranslateTransform(Pcenter.X, Pcenter.Y);
将原来的坐标原点也就是在窗口客户区的左上角改为了(Pcenter.X, Pcenter.Y)即图片的中心点,那么现在图片的中心点就是新的坐标系的坐标原点,在新建的坐标系中旋转图片,旋转度数为30°,然后恢复坐标原点,即该窗口原点重新设为客户区的左上角——graphics.TranslateTransform(-Pcenter.X, -Pcenter.Y);这就是这句代码的作用。因为在以图片中心为坐标原点时,窗口客户区的坐标点就是(-Pcenter.X, -Pcenter.Y),现在我们一旦实现这句代码的话,就相当于把坐标系移到了窗口客户区的左上角。
graphics.ResetTransform();就是把旋转后的图片回复。不管之前你对图片做了何种变换,经过这句代码都将回复成原来的样子。
对于其他的GDI+坐标变换代码,你都是依照这种思路来理解。