Compartilhar via


Controles de User-Drawn

O .NET Framework fornece a capacidade de desenvolver facilmente seus próprios controles. Você pode criar um controle de usuário, que é um conjunto de controles padrão associados por código, ou pode projetar seu próprio controle do zero. Você pode até usar a herança para criar um controle que herda de um controle existente e acrescenta à sua funcionalidade inerente. Qualquer abordagem usada, o .NET Framework fornece a funcionalidade para desenhar uma interface gráfica personalizada para qualquer controle criado.

A pintura de um controle é realizada através da execução do código no método OnPaint do controle. O único argumento do método OnPaint é um objeto PaintEventArgs que fornece todas as informações e funcionalidades necessárias para renderizar o controle. O PaintEventArgs fornece como propriedades dois objetos principais que serão usados na renderização do controle:

  • ClipRectangle objeto – o retângulo que representa a parte do controle que será desenhada. Esse pode ser todo o controle ou parte do controle, dependendo de como o controle é desenhado.

  • Graphics objeto – encapsula vários objetos e métodos voltados para gráficos que fornecem a funcionalidade necessária para desenhar seu controle.

Para obter mais informações sobre o objeto Graphics e como usá-lo, consulte Como: Criar Objetos Gráficos para Desenho.

O evento OnPaint é acionado sempre que o controle é desenhado ou atualizado na tela e o objeto ClipRectangle representa o retângulo no qual a pintura ocorrerá. Se todo o controle precisar ser atualizado, o ClipRectangle representará o tamanho de todo o controle. No entanto, se apenas parte do controle precisar ser atualizada, o objeto ClipRectangle representará apenas a região que precisa ser redesenhada. Um exemplo desse caso seria quando um controle foi parcialmente obscurecido por outro controle ou formulário na interface do usuário.

Ao herdar da classe Control, você deve substituir o método OnPaint e fornecer código de renderização gráfica. Se você quiser fornecer uma interface gráfica personalizada para um controle de usuário ou um controle herdado, também poderá fazer isso substituindo o método OnPaint. Um exemplo é mostrado abaixo:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)  
   ' Call the OnPaint method of the base class.  
   MyBase.OnPaint(e)  
  
   ' Declare and instantiate a drawing pen.  
   Using myPen As System.Drawing.Pen = New System.Drawing.Pen(Color.Aqua)  
      ' Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, New Rectangle(Me.Location, Me.Size))  
   End Using
End Sub  
protected override void OnPaint(PaintEventArgs e)  
{  
   // Call the OnPaint method of the base class.  
   base.OnPaint(e);  
  
   // Declare and instantiate a new pen.  
   using (System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua))  
   {
      // Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, new Rectangle(this.Location,
         this.Size));  
   }
}  

O exemplo anterior demonstra como renderizar um controle com uma representação gráfica muito simples. Ele chama o método OnPaint da classe base, cria um objeto Pen com o qual desenhar e, por fim, desenha uma elipse no retângulo determinado pelo Location e Size do controle. Embora a maioria dos códigos de renderização seja significativamente mais complicada do que isso, este exemplo demonstra o uso do objeto Graphics contido no objeto PaintEventArgs. Observe que, se você estiver herdando de uma classe que já tenha uma representação gráfica, como UserControl ou Button, e não quiser incorporar essa representação em sua renderização, não deverá chamar o método OnPaint da classe base.

O código no método OnPaint do controle será executado quando o controle for desenhado pela primeira vez e sempre que for atualizado. Para garantir que o controle seja redesenhado sempre que for redimensionado, adicione a seguinte linha ao construtor do seu controle:

SetStyle(ControlStyles.ResizeRedraw, True)  
SetStyle(ControlStyles.ResizeRedraw, true);  

Nota

Use a propriedade Control.Region para implementar um controle não retangular.

Consulte também