次の方法で共有


Graphics::Restore メソッド (gdiplusgraphics.h)

Graphics::Restore メソッドは、この Graphics オブジェクトの状態を、この Graphics オブジェクトの Graphics::Save メソッドの以前の呼び出しによって格納された状態に設定します。

構文

Status Restore(
  [in] GraphicsState gstate
);

パラメーター

[in] gstate

種類: GraphicsState

保存された状態のブロックを識別する 32 ビット値 (この Graphics オブジェクトの Graphics::Save メソッドの以前の呼び出しによって返されます)。

戻り値

種類: 状態

メソッドが成功した場合は、 Status 列挙の要素である Ok を返します。

メソッドが失敗した場合は、 Status 列挙体の他の要素のいずれかを返します。

解説

Graphics オブジェクトの Graphics::Save メソッドを呼び出すと、Graphics オブジェクトの状態を保持する情報ブロックがスタックに配置されます。 Graphics::Save メソッドは、その情報ブロックを識別する値を返します。 識別値を Restore メソッドに渡すと、情報ブロックはスタックから削除され、Graphics::Save 呼び出し時の状態に Graphics オブジェクトを復元するために使用されます。 Graphics::Save メソッドの特定の呼び出しによって返される識別子は、Graphics::Restore メソッドに 1 回だけ渡すことができます。

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::Save または BeginContainer によって) がスタックから削除されます。 同様に、EndContainer を呼び出すと、BeginContainer への対応する呼び出しの後に(Graphics::Save または BeginContainer によって) スタックに配置されたすべての情報ブロックがスタックから削除されます。
 

次の例では、 Graphics::Restore メソッドを使用する 2 つの方法を示します。 最初の例では、入れ子になった保存済み状態を復元する方法を示し、2 番目の例では、入れ子になった 2 つの保存状態の最初の状態のみを復元する方法を示します。

入れ子になった保存済み状態の復元

次の使用例は、 Graphics オブジェクトのワールド変換を回転に設定し、 Graphics オブジェクトの状態を保存します。 次に、コードは TranslateTransform を呼び出し、状態をもう一度保存します。 その後、コードは ScaleTransform を呼び出します。 その時点で、 Graphics オブジェクトのワールド変換は複合変換です。最初に回転、次に移動、スケーリングを行います。 このコードでは、赤いペンを使用して、その複合変換によって変換される楕円を描画します。

このコードは、2 回目の Save 呼び出しによって返された state2Graphics::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);
}

入れ子になった 2 つの保存済み状態の最初の状態のみを復元する

次の使用例は、 Graphics オブジェクトのワールド変換を回転に設定し、 Graphics オブジェクトの状態を保存します。 次に、コードは TranslateTransform を呼び出し、状態をもう一度保存します。 その後、コードは ScaleTransform を呼び出します。 その時点で、 Graphics オブジェクトのワールド変換は複合変換です。最初に回転、次に移動、スケーリングを行います。 このコードでは、赤いペンを使用して、その複合変換によって変換される楕円を描画します。

このコードは、Save の最初の呼び出しによって返された state1Graphics::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::Save