Control.CreateGraphics 方法


为控件创建 GraphicsCreates 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.MeasureStringTherefore 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 属性外,控件上有四种线程安全方法: InvokeBeginInvokeEndInvoke 和( CreateGraphics 如果已创建控件的句柄)。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. 对于所有其他方法调用,应使用调用方法之一封送对控件线程的调用。For all other method calls, you should use one of the invoke methods to marshal the call to the control's thread.