Controles desenhados pelo usuário

O .NET Framework possibilita que você desenvolva facilmente seus próprios controles. Você pode criar um controle de usuário, que é um conjunto de controles padrão vinculados por código ou pode criar seu próprio controle desde o início. Você pode até mesmo usar herança para criar um controle que herde de um controle existente e adicionar à sua funcionalidade inerente. Independentemente da abordagem utilizada, o .NET Framework oferece a funcionalidade de desenhar uma interface gráfica personalizada para qualquer controle que você criar.

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

  • ClipRectangle Object - O retângulo que representa a parte do controle que será desenhada. Pode ser todo o controle ou parte do controle, dependendo de como o controle é desenhado.

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

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

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

Ao herdar da Control classe, você deve substituir o OnPaint método e fornecer código de renderização de elementos gráficos dentro. Se você deseja fornecer uma interface gráfica personalizada para um controle de usuário ou um controle herdado, você também pode fazer isso substituindo o OnPaint método. 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 da classe base, ele cria um Pen objeto com o OnPaint qual desenhar e, finalmente, desenha uma elipse no retângulo determinado pelo Location e Size do controle. Embora a maioria do código de renderização seja significativamente mais complicada do que isso, este exemplo demonstra o uso do Graphics objeto contido no PaintEventArgs objeto. Observe que se você estiver herdando de uma classe que já tem uma representação gráfica, como UserControl ou Button, e não desejar incorporar essa representação em sua renderização, não deverá chamar o método da OnPaint classe base.

O código no OnPaint método do seu 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 ele for redimensionado, adicione a seguinte linha ao construtor do seu controle:

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

Observação

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

Confira também