Método Graphics::Save (gdiplusgraphics.h)

El método Graphics::Save guarda el estado actual (transformaciones, región de recorte y configuración de calidad) de este objeto Graphics . Puede restaurar el estado más adelante llamando al método Graphics::Restore .

Sintaxis

GraphicsState Save();

Valor devuelto

Tipo: GraphicsState

Este método devuelve un valor que identifica el estado guardado. Pase este valor al método Graphics::Restore cuando desee restaurar el estado. El tipo de datos GraphicsState se define en Gdiplusenums.h.

Comentarios

Cuando se llama al método Graphics::Save de un objeto Graphics , se coloca un bloque de información que contiene el estado del objeto Graphics en una pila. El método Graphics::Save devuelve un valor que identifica ese bloque de información. Al pasar el valor de identificación al método Graphics::Restore , el bloque de información se quita de la pila y se usa para restaurar el objeto Graphics al estado en el que estaba en el momento de la llamada Graphics::Save . Tenga en cuenta que el identificador devuelto por una llamada determinada al método Graphics::Save solo se puede pasar una vez al método Graphics::Restore .

Las llamadas al método Graphics::Save se pueden anidar; Es decir, puede llamar al método Graphics::Save varias veces antes de llamar al método Graphics::Restore . Cada vez que se llama al método Graphics::Save , se coloca un bloque de información en la pila y se recibe un identificador para el bloque de información. Al pasar uno de esos identificadores al método Graphics::Restore , el objeto Graphics se devuelve al estado en el que estaba en el momento de la llamada Graphics::Save que devolvió ese identificador determinado. El bloque de información colocado en la pila por esa llamada Graphics::Save se quita de la pila y también se quitan todos los bloques de información colocados en esa pila después de esa llamada Graphics::Save .

Las llamadas al método BeginContainer colocan bloques de información en la misma pila que las llamadas al método Graphics::Save . Al igual que una llamada Graphics::Restore se empareja con una llamada Graphics::Save , una llamada EndContainer se empareja con una llamada BeginContainer .

Nota Al llamar a Graphics::Restore, todos los bloques de información colocados en la pila (por Graphics::Save o Por BeginContainer) después de la llamada correspondiente a Graphics::Save se quitan de la pila. Del mismo modo, cuando se llama a EndContainer, todos los bloques de información colocados en la pila (por Graphics::Save o por BeginContainer) después de la llamada correspondiente a BeginContainer se quitan de la pila.
 

Ejemplos

En los ejemplos siguientes se muestran dos maneras de usar el método Graphics::Save . En el primer ejemplo se muestra cómo restaurar los estados guardados anidados y el segundo ejemplo muestra cómo restaurar solo el primero de dos estados guardados anidados.

Restaurar estados guardados anidados

En el ejemplo siguiente se establece la transformación mundial de un objeto Graphics en una rotación y, a continuación, se guarda el estado del objeto Graphics . A continuación, el código llama a TranslateTransform y vuelve a guardar el estado. A continuación, el código llama a ScaleTransform. En ese momento, la transformación mundial del objeto Graphics es una transformación compuesta: gire primero, luego traduzca y, a continuación, escale. El código usa un lápiz rojo para dibujar una elipse transformada por esa transformación compuesta.

El código pasa state2, devuelto por la segunda llamada a Save, al método Graphics::Restore y vuelve a dibujar la elipse con un lápiz verde. La elipse verde se gira y se traduce, pero no se escala. Por último, el código pasa state1, devuelto por la primera llamada a Save, al método Graphics::Restore y vuelve a dibujar la elipse con un lápiz azul. La elipse azul se gira, pero no se traduce ni se escala.

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);
}

Restaurar solo el primero de dos estados guardados anidados

En el ejemplo siguiente se establece la transformación mundial de un objeto Graphics en una rotación y, a continuación, se guarda el estado del objeto Graphics . A continuación, el código llama a TranslateTransform y vuelve a guardar el estado. A continuación, el código llama a ScaleTransform. En ese momento, la transformación mundial del objeto Graphics es una transformación compuesta: gire primero, luego traduzca y, a continuación, escale. El código usa un lápiz rojo para dibujar una elipse transformada por esa transformación compuesta.

El código pasa state1, devuelto por la primera llamada a Save, al método Graphics::Restore y vuelve a dibujar la elipse con un lápiz verde. La elipse verde se gira, pero no se traduce ni se escala.

A continuación, el código intenta restaurar el estado identificado por state2. Se produce un error en el intento porque la llamada Restore(state1) quitó los bloques de información identificados por state1 y state2 de la pila.

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);
}

Requisitos

   
Cliente mínimo compatible Windows XP, Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado gdiplusgraphics.h (include Gdiplus.h)
Library Gdiplus.lib
Archivo DLL Gdiplus.dll

Consulte también

Elementos gráficos

Graphics::Restore