Graphics オブジェクトの状態の管理Managing the State of a Graphics Object

Graphics クラスは、GDI+ の要となるものです。The Graphics class is at the heart of GDI+. 何かを描画するには、Graphics オブジェクトを取得し、そのプロパティを設定して、そのメソッド (DrawLineDrawImageDrawString など) を呼び出します。To draw anything, you obtain a Graphics object, set its properties, and call its methods DrawLine, DrawImage, DrawString, and the like).

次の例は、Graphics オブジェクトの DrawRectangle メソッドを呼び出します。The following example calls the DrawRectangle method of a Graphics object. DrawRectangle メソッドに渡される最初の引数は、Pen オブジェクトです。The first argument passed to the DrawRectangle method is a Pen object.

Dim graphics As Graphics = e.Graphics  
Dim pen As New Pen(Color.Blue) ' Opaque blue  
graphics.DrawRectangle(pen, 10, 10, 200, 100)  
Graphics graphics = e.Graphics;  
Pen pen = new Pen(Color.Blue);  // Opaque blue  
graphics.DrawRectangle(pen, 10, 10, 200, 100);  

グラフィックスの状態Graphics State

Graphics オブジェクトの役割は、DrawLineDrawRectangle などの描画メソッドを提供することだけではありません。A Graphics object does more than provide drawing methods, such as DrawLine and DrawRectangle. Graphics オブジェクトによってグラフィックスの状態も維持され、次のカテゴリに分類できます。A Graphics object also maintains graphics state, which can be divided into the following categories:

  • 品質設定Quality settings

  • 変換Transformations

  • クリッピング領域Clipping region

品質設定Quality Settings

Graphics オブジェクトには、描画される項目の品質に影響を与えるいくつかのプロパティがあります。A Graphics object has several properties that influence the quality of the items that are drawn. たとえば、TextRenderingHint プロパティを設定して、テキストに適用されるアンチエイリアシングの種類 (存在する場合) を指定できます。For example, you can set the TextRenderingHint property to specify the type of antialiasing (if any) applied to text. 品質に影響を与える他のプロパティは、SmoothingModeCompositingModeCompositingQuality、および InterpolationMode です。Other properties that influence quality are SmoothingMode, CompositingMode, CompositingQuality, and InterpolationMode.

次の例では、スムージング モードが AntiAlias に設定されている楕円と、スムージング モードが HighSpeed に設定されている楕円の 2 つを描画します。The following example draws two ellipses, one with the smoothing mode set to AntiAlias and one with the smoothing mode set to HighSpeed:

Dim graphics As Graphics = e.Graphics  
Dim pen As New Pen(Color.Blue)  
  
graphics.SmoothingMode = SmoothingMode.AntiAlias  
graphics.DrawEllipse(pen, 0, 0, 200, 100)  
graphics.SmoothingMode = SmoothingMode.HighSpeed  
graphics.DrawEllipse(pen, 0, 150, 200, 100)  
Graphics graphics = e.Graphics;  
Pen pen = new Pen(Color.Blue);  
  
graphics.SmoothingMode = SmoothingMode.AntiAlias;  
graphics.DrawEllipse(pen, 0, 0, 200, 100);  
graphics.SmoothingMode = SmoothingMode.HighSpeed;  
graphics.DrawEllipse(pen, 0, 150, 200, 100);  

変換Transformations

Graphics オブジェクトでは、その Graphics オブジェクトによって描画されるすべての項目に適用される 2 つの変換 (ワールドとページ) を保持します。A Graphics object maintains two transformations (world and page) that are applied to all items drawn by that Graphics object. すべてのアフィン変換は、ワールド変換に格納できます。Any affine transformation can be stored in the world transformation. アフィン変換には、拡大縮小、回転、反転、傾斜、平行移動などがあります。Affine transformations include scaling, rotating, reflecting, skewing, and translating. ページ変換は、拡大縮小や単位の変更 (例: ピクセルからインチ) に使用できます。The page transformation can be used for scaling and for changing units (for example, pixels to inches). 詳細については、「座標系と変換」を参照してください。For more information, see Coordinate Systems and Transformations.

次の例では、Graphics オブジェクトのワールド変換とページ変換を設定します。The following example sets the world and page transformations of a Graphics object. ワールド変換は 30 度の回転に設定されています。The world transformation is set to a 30-degree rotation. ページ変換は、2 番目の DrawEllipse に渡される座標がピクセルではなくミリメートルとして処理されるように設定されます。The page transformation is set so that the coordinates passed to the second DrawEllipse will be treated as millimeters instead of pixels. このコードでは、DrawEllipse メソッドに対して 2 つの同じ呼び出しを行います。The code makes two identical calls to the DrawEllipse method. ワールド変換は最初の DrawEllipse の呼び出しに適用され、2 回目の DrawEllipse の呼び出しには両方の変換 (ワールドとページ) が適用されます。The world transformation is applied to the first DrawEllipse call, and both transformations (world and page) are applied to the second DrawEllipse call.

Dim graphics As Graphics = e.Graphics  
Dim pen As New Pen(Color.Red)  
  
graphics.ResetTransform()  
graphics.RotateTransform(30) ' world transformation  
graphics.DrawEllipse(pen, 0, 0, 100, 50)  
graphics.PageUnit = GraphicsUnit.Millimeter ' page transformation  
graphics.DrawEllipse(pen, 0, 0, 100, 50)  
Graphics graphics = e.Graphics;  
Pen pen = new Pen(Color.Red);
  
graphics.ResetTransform();  
graphics.RotateTransform(30);                    // world transformation  
graphics.DrawEllipse(pen, 0, 0, 100, 50);  
graphics.PageUnit = GraphicsUnit.Millimeter;     // page transformation  
graphics.DrawEllipse(pen, 0, 0, 100, 50);  

次の図は、2 つの楕円を示しています。The following illustration shows the two ellipses. 楕円の中心ではなく、座標系の原点 (クライアント領域の左上隅) を中心として 30 度回転させていることに注意してください。Note that the 30-degree rotation is about the origin of the coordinate system (upper-left corner of the client area), not about the centers of the ellipses. また、ペンの幅 1 は、最初の楕円については 1 ピクセル、2 つ目の楕円については 1 ミリメートルを意味することに注意してください。Also note that the pen width of 1 means 1 pixel for the first ellipse and 1 millimeter for the second ellipse.

2 つの楕円 (回転とペンの幅) を示す図。

クリッピング領域Clipping Region

Graphics オブジェクトでは、その Graphics オブジェクトによって描画されるすべての項目に適用されるクリッピング領域を保持します。A Graphics object maintains a clipping region that applies to all items drawn by that Graphics object. クリッピング領域は、SetClip メソッドを呼び出すことによって設定できます。You can set the clipping region by calling the SetClip method.

次の例では、2 つの四角形の和集合を形成することによって、プラス記号の形の領域を作成します。The following example creates a plus-shaped region by forming the union of two rectangles. その領域は、Graphics オブジェクトのクリッピング領域として指定されます。That region is designated as the clipping region of a Graphics object. その後、クリッピング領域の内部に制限されている 2 つの線が、コードによって描画されます。Then the code draws two lines that are restricted to the interior of the clipping region.

Dim graphics As Graphics = e.Graphics  
  
' Opaque red, width 5  
Dim pen As New Pen(Color.Red, 5)  
  
' Opaque aqua  
Dim brush As New SolidBrush(Color.FromArgb(255, 180, 255, 255))  
  
' Create a plus-shaped region by forming the union of two rectangles.  
Dim [region] As New [Region](New Rectangle(50, 0, 50, 150))  
[region].Union(New Rectangle(0, 50, 150, 50))  
graphics.FillRegion(brush, [region])  
  
' Set the clipping region.  
graphics.SetClip([region], CombineMode.Replace)  
  
' Draw two clipped lines.  
graphics.DrawLine(pen, 0, 30, 150, 160)  
graphics.DrawLine(pen, 40, 20, 190, 150)  
Graphics graphics = e.Graphics;  
  
// Opaque red, width 5  
Pen pen = new Pen(Color.Red, 5);
  
// Opaque aqua  
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 180, 255, 255));
  
// Create a plus-shaped region by forming the union of two rectangles.  
Region region = new Region(new Rectangle(50, 0, 50, 150));  
region.Union(new Rectangle(0, 50, 150, 50));  
graphics.FillRegion(brush, region);  
  
// Set the clipping region.  
graphics.SetClip(region, CombineMode.Replace);  
  
// Draw two clipped lines.  
graphics.DrawLine(pen, 0, 30, 150, 160);  
graphics.DrawLine(pen, 40, 20, 190, 150);  

次の図は、クリッピングされた線を示しています。The following illustration shows the clipped lines:

制限されたクリップ領域を示す図。

関連項目See also