Condividi tramite


Metodo Graphics::Save (gdiplusgraphics.h)

Il metodo Graphics::Save salva lo stato corrente (trasformazioni, area di ritaglio e impostazioni di qualità) di questo oggetto Graphics . È possibile ripristinare lo stato in un secondo momento chiamando il metodo Graphics::Restore .

Sintassi

GraphicsState Save();

Valore restituito

Tipo: GraphicsState

Questo metodo restituisce un valore che identifica lo stato salvato. Passare questo valore al metodo Graphics::Restore quando si desidera ripristinare lo stato. Il tipo di dati GraphicsState è definito in Gdiplusenums.h.

Commenti

Quando si chiama il metodo Graphics::Save di un oggetto Graphics , un blocco di informazioni che contiene lo stato dell'oggetto Graphics viene inserito in uno stack. Il metodo Graphics::Save restituisce un valore che identifica tale blocco di informazioni. Quando si passa il valore di identificazione al metodo Graphics::Restore , il blocco informazioni viene rimosso dallo stack e viene usato per ripristinare lo stato in cui si trovava l'oggetto Graphics al momento della chiamata Graphics::Save . Si noti che l'identificatore restituito da una determinata chiamata al metodo Graphics::Save può essere passato una sola volta al metodo Graphics::Restore .

Le chiamate al metodo Graphics::Save possono essere annidate; vale a dire, è possibile chiamare il metodo Graphics::Save più volte prima di chiamare il metodo Graphics::Restore . Ogni volta che si chiama il metodo Graphics::Save , viene inserito un blocco di informazioni nello stack e si riceve un identificatore per il blocco di informazioni. Quando si passa uno di questi identificatori al metodo Graphics::Restore , l'oggetto Graphics viene restituito allo stato in cui si trovava al momento della chiamata Graphics::Save che ha restituito tale identificatore specifico. Il blocco di informazioni posizionato nello stack da tale chiamata Graphics::Save viene rimosso dallo stack e tutti i blocchi di informazioni inseriti nello stack dopo la rimozione della chiamata Graphics::Save .

Le chiamate al metodo BeginContainer posizionano blocchi di informazioni sullo stesso stack delle chiamate al metodo Graphics::Save . Proprio come una chiamata Graphics::Restore è associata a una chiamata Graphics::Save , una chiamata EndContainer viene associata a una chiamata BeginContainer .

Nota Quando chiami Graphics::Restore, tutti i blocchi di informazioni posizionati nello stack (da Graphics::Save o da BeginContainer) dopo la chiamata corrispondente a Graphics::Save vengono rimossi dallo stack. Analogamente, quando si chiama EndContainer, tutti i blocchi di informazioni posizionati nello stack (da Graphics::Save o beginContainer) dopo la chiamata corrispondente a BeginContainer vengono rimossi dallo stack.
 

Esempio

Gli esempi seguenti illustrano due modi per usare il metodo Graphics::Save . Nel primo esempio viene illustrato come ripristinare gli stati salvati annidati e il secondo esempio mostra come ripristinare solo il primo dei due stati salvati annidati.

Ripristino degli stati salvati annidati

Nell'esempio seguente la trasformazione globale di un oggetto Graphics viene impostata su una rotazione e quindi viene salvato lo stato dell'oggetto Graphics . Successivamente, il codice chiama TranslateTransform e salva nuovamente lo stato. Il codice chiama quindi ScaleTransform. A questo punto, la trasformazione globale dell'oggetto Graphics è una trasformazione composita: prima ruotare, quindi tradurre, quindi ridimensionare. Il codice usa una penna rossa per disegnare un'ellisse trasformata da tale trasformazione composita.

Il codice passa lo stato2, restituito dalla seconda chiamata a Save, al metodo Graphics::Restore e disegna nuovamente l'ellisse usando una penna verde. L'ellisse verde viene ruotata e convertita ma non ridimensionata. Infine, il codice passa lo stato1, restituito dalla prima chiamata a Save, al metodo Graphics::Restore e disegna nuovamente l'ellisse usando una penna blu. L'ellisse blu viene ruotata ma non convertita o ridimensionata.

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

Ripristino solo del primo di due stati salvati annidati

Nell'esempio seguente la trasformazione globale di un oggetto Graphics viene impostata su una rotazione e quindi viene salvato lo stato dell'oggetto Graphics . Successivamente, il codice chiama TranslateTransform e salva nuovamente lo stato. Il codice chiama quindi ScaleTransform. A questo punto, la trasformazione globale dell'oggetto Graphics è una trasformazione composita: prima ruotare, quindi tradurre, quindi ridimensionare. Il codice usa una penna rossa per disegnare un'ellisse trasformata da tale trasformazione composita.

Il codice passa lo stato1, restituito dalla prima chiamata a Save, al metodo Graphics::Restore e disegna nuovamente l'ellisse usando una penna verde. L'ellisse verde viene ruotata ma non convertita o ridimensionata.

Successivamente, il codice tenta di ripristinare lo stato identificato da state2. Il tentativo non riesce perché la chiamata Restore(state1) ha rimosso i blocchi di informazioni identificati sia da state1 che da state2 dallo stack.

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

Requisiti

   
Client minimo supportato Windows XP, Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione gdiplusgraphics.h (include Gdiplus.h)
Libreria Gdiplus.lib
DLL Gdiplus.dll

Vedi anche

Grafica

Grafica::Restore