Graphics::Save 方法 (gdiplusgraphics.h)
Graphics::Save 方法保存此 Graphics 对象的当前状态 (转换、剪辑区域和质量设置) 。 稍后可以通过调用 Graphics::Restore 方法还原状态。
语法
GraphicsState Save();
返回值
类型: GraphicsState
此方法返回一个值,该值标识保存的状态。 如果要还原状态,请将此值传递给 Graphics::Restore 方法。 GraphicsState 数据类型在 Gdiplusenums.h 中定义。
注解
调用 Graphics 对象的 Graphics::Save 方法时,一个保存 Graphics 对象状态的信息块将放在堆栈上。 Graphics::Save 方法返回一个值,该值标识该信息块。 将标识值传递给 Graphics::Restore 方法时,信息块将从堆栈中删除,并用于将 Graphics 对象还原到调用 Graphics::Save 时的状态。 请注意,对 Graphics::Save 方法的给定调用返回的标识符只能传递给 Graphics::Restore 方法一次。
可以嵌套对 Graphics::Save 方法的调用;也就是说,在调用 Graphics:: Restore 方法之前,可以多次调用 Graphics:: Save 方法。 每次调用 Graphics::Save 方法时,都会在堆栈上放置一个信息块,并且你会收到信息块的标识符。 将其中一个标识符传递给 Graphics::Restore 方法时, Graphics 对象将返回到返回该特定标识符的 Graphics::Save 调用时的状态。 从堆栈中删除 由 Graphics::Save 调用放置在堆栈上的信息块,并且该 Graphics::Save 调用之后放置在该堆栈上的所有信息块也会被删除。
调用 BeginContainer 方法会将信息块与调用 Graphics::Save 方法放在同一堆栈上。 正如 Graphics::Restore 调用与 Graphics::Save 调用配对一样, EndContainer 调用与 BeginContainer 调用配对。
示例
以下示例演示了使用 Graphics::Save 方法的 两种方法。 第一个示例演示如何还原嵌套保存状态,第二个示例演示如何仅还原两个嵌套保存状态中的第一个。
还原嵌套保存的状态
以下示例将 Graphics 对象的世界转换设置为旋转,然后保存 Graphics 对象的状态。 接下来,代码调用 TranslateTransform,并再次保存状态。 然后,代码调用 ScaleTransform。 此时, Graphics 对象的世界转换是复合转换:先旋转,然后平移,然后缩放。 代码使用红色笔绘制由该复合转换转换转换的椭圆。
代码将第二次调用 Save 返回的 state2 传递给 Graphics::Restore 方法,并使用绿色笔再次绘制椭圆。 绿色椭圆会旋转和转换,但不会缩放。 最后,代码将第一次调用 Save 返回的 state1 传递给 Graphics::Restore 方法,并使用蓝色笔再次绘制椭圆。 蓝色椭圆是旋转的,但不进行转换或缩放。
VOID Example_Save1(HDC hdc)
{
Graphics graphics(hdc);
GraphicsState state1, state2;
graphics.RotateTransform(30.0f);
state1 = graphics.Save();
graphics.TranslateTransform(100.0f, 0.0f, MatrixOrderAppend);
state2 = graphics.Save();
graphics.ScaleTransform(1.0f, 3.0f, MatrixOrderAppend);
// Draw an ellipse.
// Three transformations apply: rotate, then translate, then scale.
Pen redPen(Color(255, 255, 0, 0));
graphics.DrawEllipse(&redPen, 0, 0, 100, 20);
// Restore to state2 and draw the ellipse again.
// Two transformations apply: rotate then translate.
graphics.Restore(state2);
Pen greenPen(Color(255, 0, 255, 0));
graphics.DrawEllipse(&greenPen, 0, 0, 100, 20);
// Restore to state1 and draw the ellipse again.
// Only the rotation transformation applies.
graphics.Restore(state1);
Pen bluePen(Color(255, 0, 0, 255));
graphics.DrawEllipse(&bluePen, 0, 0, 100, 20);
}
仅还原两个嵌套保存状态中的第一个状态
以下示例将 Graphics 对象的世界转换设置为旋转,然后保存 Graphics 对象的状态。 接下来,代码调用 TranslateTransform,并再次保存状态。 然后,代码调用 ScaleTransform。 此时, Graphics 对象的世界转换是复合转换:先旋转,然后平移,然后缩放。 代码使用红色笔绘制由该复合转换转换转换的椭圆。
代码将第一次调用 Save 返回的 state1 传递给 Graphics::Restore 方法,并使用绿色笔再次绘制椭圆。 绿色椭圆是旋转的,但不进行转换或缩放。
接下来,代码尝试还原由 state2 标识的状态。 尝试失败,因为调用 Restore (state1) 从堆栈中删除了 state1 和 state2 标识的信息块。
VOID Example_Save2(HDC hdc)
{
Graphics graphics(hdc);
GraphicsState state1, state2;
graphics.RotateTransform(30.0f);
state1 = graphics.Save();
graphics.TranslateTransform(100.0f, 0.0f, MatrixOrderAppend);
state2 = graphics.Save();
graphics.ScaleTransform(1.0f, 3.0f, MatrixOrderAppend);
// Draw an ellipse.
// Three transformations apply: rotate, then translate, then scale.
Pen redPen(Color(255, 255, 0, 0));
graphics.DrawEllipse(&redPen, 0, 0, 100, 20);
// Restore to state1 and draw the ellipse again.
// Only the rotation transformation applies.
graphics.Restore(state1);
Pen greenPen(Color(255, 0, 255, 0));
graphics.DrawEllipse(&greenPen, 0, 0, 100, 20);
// The information block identified by state2 has been lost.
// The following call to Restore has no effect because
// Restore(state1) removed from the stack the
// information blocks identified by state1 and state2.
graphics.Restore(state2);
// The Graphics object is still in the state identified by state1.
// The following code draws a blue ellipse on top of the previously
// drawn green ellipse.
Pen bluePen(Color(255, 0, 0, 255));
graphics.DrawEllipse(&bluePen, 0, 0, 100, 20);
}
要求
最低受支持的客户端 | Windows XP、Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | gdiplusgraphics.h (包括 Gdiplus.h) |
Library | Gdiplus.lib |
DLL | Gdiplus.dll |