Control.CreateGraphics メソッド


コントロールの Graphics を作成します。Creates the Graphics for the control.

 System::Drawing::Graphics ^ CreateGraphics();
public System.Drawing.Graphics CreateGraphics ();
member this.CreateGraphics : unit -> System.Drawing.Graphics
Public Function CreateGraphics () As Graphics



コントロールの GraphicsThe Graphics for the control.

次のコード例では、指定したコントロールのサイズを変更して、コントロールが書式設定されたテキストに対応するようにします。The following code example resizes the specified control so the control will accommodate its formatted text. 書式設定されたテキストは、 Text コントロールが割り当てられた Font テキストに適用されるプロパティです。The formatted text is the Text property with the control's assigned Font applied to the text. AutoSizeControlこの例のメソッドには、 textPadding コントロールのすべての端に適用する埋め込みを表すパラメーターもあります。The AutoSizeControl method in this example also has a textPadding parameter that represents the padding to apply to all edges of the control. 埋め込みを同じにするには、コントロールでサポートされて MiddleCenter いる場合は、テキストをの値に揃え System.Drawing.ContentAlignment ます。To make the padding appear equal, align the text with the MiddleCenter value of System.Drawing.ContentAlignment if your control supports it.

   void AutoSizeControl( Control^ control, int textPadding )
      // Create a Graphics object for the Control.
      Graphics^ g = control->CreateGraphics();
      // Get the Size needed to accommodate the formatted Text.
      System::Drawing::Size preferredSize = g->MeasureString( control->Text, control->Font ).ToSize();
      // Pad the text and resize the control.
      control->ClientSize = System::Drawing::Size( preferredSize.Width + (textPadding * 2), preferredSize.Height + (textPadding * 2) );
      // Clean up the Graphics object.
      delete g;
private void AutoSizeControl(Control control, int textPadding)
   // Create a Graphics object for the Control.
   Graphics g = control.CreateGraphics();

   // Get the Size needed to accommodate the formatted Text.
   Size preferredSize = g.MeasureString(
      control.Text, control.Font).ToSize();

   // Pad the text and resize the control.
   control.ClientSize = new Size(
      preferredSize.Width + (textPadding * 2), 
      preferredSize.Height+(textPadding * 2) );

   // Clean up the Graphics object.
Private Sub AutoSizeControl(control As Control, textPadding As Integer)
   ' Create a Graphics object for the Control.
   Dim g As Graphics = control.CreateGraphics()
   ' Get the Size needed to accommodate the formatted Text.
   Dim preferredSize As Size = g.MeasureString( _
     control.Text, control.Font).ToSize()
   ' Pad the text and resize the control.
   control.ClientSize = New Size( _
     preferredSize.Width + textPadding * 2, _
     preferredSize.Height + textPadding * 2)
   ' Clean up the Graphics object.
End Sub


Graphicsメソッドを通じて取得したオブジェクトは、 CreateGraphics 通常、現在の Windows メッセージが処理された後は保持されません。そのオブジェクトで描画されたものは、次の WM_PAINT メッセージで消去されるためです。The Graphics object that you retrieve through the CreateGraphics method should not normally be retained after the current Windows message has been processed, because anything painted with that object will be erased with the next WM_PAINT message. そのため、オブジェクトをキャッシュして再利用することはできません Graphics 。ただし、のような非ビジュアルメソッドを使用する場合は除き Graphics.MeasureString ます。Therefore you cannot cache the Graphics object for reuse, except to use non-visual methods like Graphics.MeasureString. 代わりに、オブジェクトを使用するたびにを呼び出し、 CreateGraphics 使用が Graphics 終了したときにを呼び出す必要があり Dispose ます。Instead, you must call CreateGraphics every time that you want to use the Graphics object, and then call Dispose when you are finished using it. Windows メッセージの詳細については、「」を参照してください WndProcFor more information about Windows messages, see WndProc.

仕様により、 CreateGraphics 呼び出し元のスレッドに所有権を設定し、他のスレッドで呼び出された場合は失敗します。By design, CreateGraphics sets ownership to the calling thread, and fails if it is called on other threads.


プロパティに加えて、 InvokeRequired スレッドセーフであるコントロールには Invoke 、、、 BeginInvoke EndInvoke 、および CreateGraphics コントロールのハンドルが既に作成されている場合の4つのメソッドがあります。In addition to the InvokeRequired property, there are four methods on a control that are thread safe: Invoke, BeginInvoke, EndInvoke, and CreateGraphics if the handle for the control has already been created. CreateGraphicsバックグラウンドスレッドでコントロールのハンドルが作成される前にを呼び出すと、無効なクロススレッド呼び出しが発生する可能性があります。Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. その他のすべてのメソッド呼び出しでは、いずれかの invoke メソッドを使用して、コントロールのスレッドへの呼び出しをマーシャリングする必要があります。For all other method calls, you should use one of the invoke methods to marshal the call to the control's thread.