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

O método Graphics::Save salva o estado atual (transformações, região de recorte e configurações de qualidade) deste objeto Graphics . Você pode restaurar o estado posteriormente chamando o método Graphics::Restore .

Sintaxe

GraphicsState Save();

Valor retornado

Tipo: GraphicsState

Esse método retorna um valor que identifica o estado salvo. Passe esse valor para o método Graphics::Restore quando quiser restaurar o estado. O tipo de dados GraphicsState é definido em Gdiplusenums.h.

Comentários

Quando você chama o método Graphics::Save de um objeto Graphics , um bloco de informações que contém o estado do objeto Graphics é colocado em uma pilha. O método Graphics::Save retorna um valor que identifica esse bloco de informações. Quando você passa o valor de identificação para o método Graphics::Restore , o bloco de informações é removido da pilha e é usado para restaurar o objeto Graphics para o estado em que estava no momento da chamada Graphics::Save . Observe que o identificador retornado por uma determinada chamada para o método Graphics::Save pode ser passado apenas uma vez para o método Graphics::Restore .

As chamadas para o método Graphics::Save podem ser aninhadas; ou seja, você pode chamar o método Graphics::Save várias vezes antes de chamar o método Graphics::Restore . Sempre que você chama o método Graphics::Save , um bloco de informações é colocado na pilha e você recebe um identificador para o bloco de informações. Quando você passa um desses identificadores para o método Graphics::Restore , o objeto Graphics é retornado ao estado em que estava no momento da chamada Graphics::Save que retornou esse identificador específico. O bloco de informações colocado na pilha por essa chamada Graphics::Save é removido da pilha e todos os blocos de informações colocados nessa pilha depois dessa chamada Graphics::Save também são removidos.

As chamadas para o método BeginContainer colocam blocos de informações na mesma pilha que as chamadas para o método Graphics::Save . Assim como uma chamada Graphics::Restore é emparelhada com uma chamada Graphics::Save , uma chamada EndContainer é emparelhada com uma chamada BeginContainer .

Nota Quando você chama Graphics::Restore, todos os blocos de informações colocados na pilha (por Graphics::Save ou por BeginContainer) após a chamada correspondente para Graphics::Save são removidos da pilha. Da mesma forma, quando você chama EndContainer, todos os blocos de informações colocados na pilha (por Graphics::Save ou por BeginContainer) após a chamada correspondente para BeginContainer são removidos da pilha.
 

Exemplos

Os exemplos a seguir mostram duas maneiras de usar o método Graphics::Save . O primeiro exemplo mostra como restaurar estados salvos aninhados e o segundo exemplo mostra como restaurar apenas o primeiro de dois estados salvos aninhados.

Restaurando estados salvos aninhados

O exemplo a seguir define a transformação mundial de um objeto Graphics como uma rotação e salva o estado do objeto Graphics . Em seguida, o código chama TranslateTransform e salva o estado novamente. Em seguida, o código chama ScaleTransform. Nesse ponto, a transformação mundial do objeto Graphics é uma transformação composta: primeiro gire, depois traduza e, em seguida, dimensione. O código usa uma caneta vermelha para desenhar uma elipse transformada por essa transformação composta.

O código passa o estado2, que foi retornado pela segunda chamada para Salvar, para o método Graphics::Restore e desenha a elipse novamente usando uma caneta verde. A elipse verde é girada e convertida, mas não dimensionada. Por fim, o código passa state1, que foi retornado pela primeira chamada para Salvar, para o método Graphics::Restore e desenha a elipse novamente usando uma caneta azul. A elipse azul é girada, mas não convertida ou dimensionada.

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

Restaurando apenas o primeiro de dois estados salvos aninhados

O exemplo a seguir define a transformação mundial de um objeto Graphics como uma rotação e salva o estado do objeto Graphics . Em seguida, o código chama TranslateTransform e salva o estado novamente. Em seguida, o código chama ScaleTransform. Nesse ponto, a transformação mundial do objeto Graphics é uma transformação composta: primeiro gire, depois traduza e, em seguida, dimensione. O código usa uma caneta vermelha para desenhar uma elipse transformada por essa transformação composta.

O código passa state1, que foi retornado pela primeira chamada para Salvar, para o método Graphics::Restore e desenha a elipse novamente usando uma caneta verde. A elipse verde é girada, mas não traduzida ou dimensionada.

Em seguida, o código tenta restaurar o estado identificado pelo estado2. A tentativa falha porque a chamada Restore(state1) removeu os blocos de informações identificados por state1 e state2 da pilha.

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 com suporte Windows XP, Windows 2000 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows 2000 Server [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho gdiplusgraphics.h (inclua Gdiplus.h)
Biblioteca Gdiplus.lib
DLL Gdiplus.dll

Confira também

Elementos gráficos

Gráficos::Restaurar