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::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::Save メソッドを使用する 2 つの方法を示しています。 最初の例では、入れ子になった保存状態を復元する方法を示し、2 番目の例では、入れ子になった 2 つの保存された状態の 1 つ目のみを復元する方法を示します。
入れ子になった保存済み状態の復元
次の使用例は、 Graphics オブジェクトのワールド変換を回転に設定し、 Graphics オブジェクトの状態を保存します。 次に、コードは TranslateTransform を呼び出し、状態をもう一度保存します。 その後、コードは ScaleTransform を呼び出します。 その時点で、 Graphics オブジェクトのワールド変換は複合変換です。最初に回転、次に平行移動、スケーリングを行います。 このコードでは、赤いペンを使用して、その複合変換によって変換される楕円を描画します。
このコードは、Save の 2 回目の呼び出しによって返された 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);
}
入れ子になった 2 つの保存済み状態の最初の状態のみを復元する
次の使用例は、 Graphics オブジェクトのワールド変換を回転に設定し、 Graphics オブジェクトの状態を保存します。 次に、コードは TranslateTransform を呼び出し、状態をもう一度保存します。 その後、コードは ScaleTransform を呼び出します。 その時点で、 Graphics オブジェクトのワールド変換は複合変換です。最初に回転、次に平行移動、スケーリングを行います。 このコードでは、赤いペンを使用して、その複合変換によって変換される楕円を描画します。
このコードは、Save の最初の呼び出しによって返された state1 を Graphics::Restore メソッドに渡し、緑色のペンを使用して省略記号をもう一度描画します。 緑色の楕円は回転しますが、変換または拡大縮小は行われません。
次に、コードは state2 で識別された状態の復元を試みます。 Restore(state1) 呼び出しによって state1 と state2 の両方で識別された情報ブロックがスタックから削除されたため、試行は失敗します。
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 |