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::Restore 时,从 (堆栈中删除对 Graphics::Save 的相应调用后,由 Graphics::SaveBeginContainer) 放置在堆栈上的所有信息块。 同样,调用 EndContainer 时,从堆栈中删除对 BeginContainer 的相应调用后,由 Graphics::SaveBeginContainer) 放置在 (堆栈上的所有信息块。
 

示例

以下示例演示了使用 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) 从堆栈中删除了 state1state2 标识的信息块。

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

另请参阅

显卡

Graphics::Restore