Processamento de um controle Windows Forms

Processamento refere-se ao processo de criação de uma representação visual na tela do usuário. Windows Forms usa GDI (nova biblioteca do Windows graphics) para processamento. As classes gerenciadas que fornecem acesso a GDI estão na System.Drawing namespace e subnamespaces.

Os seguintes elementos estão envolvidos no processamento de controle:

  • A funcionalidade de desenho fornecida pela classe base System.Windows.Forms.Control.

  • Os elementos essenciais do GDI biblioteca de elementos gráficos.

  • A geometria da região de desenho.

  • O procedimento para liberação de recursos gráficos.

Funcionalidade fornecida pelo controle de desenho.

A classe base Control fornece a funcionalidade de desenho por meio de sua Paint de evento. Um controle gera a Paint evento sempre que precisa atualizar o vídeo. Para obter mais informações sobre eventos na.NET Framework, consulte Handling and Raising Events.

Os dados do evento de classe para o Paint evento, PaintEventArgs, mantém os dados necessários para um controle de desenho — um identificador para um objeto gráfico e um objeto rectangle que representa a região para desenhar pol. Esses objetos são mostrados em negrito no fragmento de código a seguir.

Public Class PaintEventArgs
   Inherits EventArgs
   Implements IDisposable
   
   Public ReadOnly Property ClipRectangle() As System.Drawing.Rectangle
      ...
   End Property
   
   Public ReadOnly Property Graphics() As System.Drawing.Graphics
      ...
   End Property
   ' Other properties and methods.
   ...
End Class
public class PaintEventArgs : EventArgs, IDisposable {
public System.Drawing.Rectangle ClipRectangle {get;}
public System.Drawing.Graphics Graphics {get;}
// Other properties and methods.
...
}

Graphicsé uma classe gerenciada que encapsula a funcionalidade de desenho, conforme descrito na discussão de GDI posteriormente neste tópico. O ClipRectangle é uma instância do Rectangle estruturar e define a área disponível na qual um controle pode desenhar. Um desenvolvedor de controle pode computar a ClipRectangle usando o ClipRectangle a propriedade de um controle, conforme descrito na discussão da geometria posteriormente neste tópico.

Um controle deve fornecer a lógica de renderização, substituindo o OnPaint método que ele herda de Control. OnPaintobtém acesso a um objeto gráfico e um retângulo para desenhar em através de Graphics e o ClipRectangle Propriedades da PaintEventArgs instância passada para o proprietário.

Protected Overridable Sub OnPaint(pe As PaintEventArgs)
protected virtual void OnPaint(PaintEventArgs pe);

O OnPaint o método da base de Control classe não implementa a funcionalidade de desenho, mas simplesmente invoca os delegados de eventos são registrados com o Paint de evento. Quando você substituir OnPaint, normalmente, você deve chamar o OnPaint método da classe base, de modo que registrado delegados recebe o Paint de evento. No entanto, os controles que pintar a superfície de toda não devem chamar a classe base OnPaint, pois isso introduz cintilação. Para obter um exemplo de substituir o OnPaint evento, consulte o Como: Criar um controle Windows Forms que mostra o andamento.

ObservaçãoObservação

Não chamar OnPaint diretamente a partir do seu controle; em vez disso, chame o Invalidate método (herdada da Control) ou algum outro método que chama Invalidate. O Invalidate por sua vez chama o método OnPaint. O Invalidate método estiver sobrecarregado e, dependendo dos argumentos fornecido para Invalidate e, um controle redesenha alguns ou todos os seus área da tela.

Base da Control classe define o outro método é útil para o desenho — o OnPaintBackground método.

Protected Overridable Sub OnPaintBackground(pevent As PaintEventArgs)
protected virtual void OnPaintBackground(PaintEventArgs pevent);

OnPaintBackgroundPinta o plano de fundo (e, assim, a forma) da janela e a garantia de ser rápido, enquanto OnPaint pinta os detalhes e pode ser mais lento porque as solicitações de pintura individuais sejam combinadas em uma Paint evento que abrange todas as áreas que precisam ser redesenhados. Talvez você queira chamar o OnPaintBackground se, por exemplo, você deseja desenhar um plano de fundo colorido do gradiente para o controle.

Enquanto OnPaintBackground tem uma evento semelhante nomenclatura e leva o mesmo argumento como o OnPaint método, OnPaintBackground não é um evento verdadeiro método. Não há nenhum PaintBackground eventos e OnPaintBackground não invoca delegados de evento. Ao substituir o OnPaintBackground método, uma classe derivada não é necessária para chamar o OnPaintBackground o método de sua classe de base.

Noções básicas de GDI+

O Graphics classe fornece métodos para desenhar várias formas como círculos, triângulos, arcos e elipses, bem como métodos para exibir texto. O System.Drawing seus subnamespaces e namespace contém classes que encapsulam os elementos gráficos como formas (círculos, retângulos, arcos e outros), cores, fontes, pincéis e assim por diante. Para obter mais informações sobre o GDI, consulte Usando Classes de gráficos gerenciado. Os conceitos básicos de GDI também são descritos o Como: Criar um controle Windows Forms que mostra o andamento.

Geometria da região de desenho

O ClientRectangle propriedade de um controle Especifica a região retangular disponível para o controle na tela do usuário, enquanto o ClipRectangle propriedade de PaintEventArgs Especifica a área que realmente é pintada. (Lembre-se de que a pintura é feita na Paint método de evento que leva um PaintEventArgs instância como seu argumento). Um controle pode precisar pintar apenas uma parte da sua área disponível, assim como acontece quando uma pequena seção de alterações de exibição do controle. Nessas situações, um desenvolvedor de controle deve calcular o retângulo real para desenhar e passo para Invalidate. As versões sobrecarregadas dos Invalidate que o levam um Rectangle ou Region como um argumento usar esse argumento para gerar o ClipRectangle propriedade de PaintEventArgs.

Fragmento de código a seguir mostra como o FlashTrackBar controle personalizado calcula a área retangular para desenhar pol. O client variável denota a ClipRectangle propriedade. Para obter um exemplo completo, consulte Como: Criar um controle Windows Forms que mostra o andamento.

Dim invalid As Rectangle = New Rectangle( _
    client.X + lmin, _
    client.Y, _
    lmax - lmin, _
    client.Height)

Invalidate(invalid)
Rectangle invalid = new Rectangle(
    client.X + min, 
    client.Y, 
    max - min, 
    client.Height);

Invalidate(invalid);

Liberando recursos de gráficos

Objetos gráficos são caros porque eles usam os recursos do sistema. Esses objetos incluem instâncias a System.Drawing.Graphics classe, bem como instâncias de System.Drawing.Brush, System.Drawing.Pene outras classes de elementos gráficos. É importante que você crie um recurso de elementos gráficos quando precisar dele e liberá-lo assim que tiver terminado de usá-lo. Se você criar um tipo que implementa o IDisposable interface, ligue para seu Dispose método quando tiver terminado com ele para liberar recursos.

Fragmento de código a seguir mostra como o FlashTrackBar controle personalizado cria e lança um Brush recurso. Para o código-fonte completo, consulte Como: Criar um controle Windows Forms que mostra o andamento.

Private baseBackground As Brush
private Brush baseBackground = null;
MyBase.OnPaint(e)

If (baseBackground Is Nothing) Then

    If (myShowGradient) Then
        baseBackground = New LinearGradientBrush(New Point(0, 0), _
                                                 New Point(ClientSize.Width, 0), _
                                                 StartColor, _
                                                 EndColor)
    ElseIf (BackgroundImage IsNot Nothing) Then
        baseBackground = New TextureBrush(BackgroundImage)
    Else
        baseBackground = New SolidBrush(BackColor)
    End If

End If
base.OnPaint(e);
if (baseBackground == null) {
    if (showGradient) {
        baseBackground = new LinearGradientBrush(new Point(0, 0),
                                                 new Point(ClientSize.Width, 0),
                                                 StartColor,
                                                 EndColor);
    }
    else if (BackgroundImage != null) {
        baseBackground = new TextureBrush(BackgroundImage);
    }
    else {
        baseBackground = new SolidBrush(BackColor);
    }
}
Protected Overrides Sub OnResize(ByVal e As EventArgs)
    MyBase.OnResize(e)
    If (baseBackground IsNot Nothing) Then
        baseBackground.Dispose()
        baseBackground = Nothing
    End If
End Sub
protected override void OnResize(EventArgs e) {
    base.OnResize(e);
    if (baseBackground != null) {
        baseBackground.Dispose();
        baseBackground = null;
    }
}

Consulte também

Tarefas

Como: Criar um controle Windows Forms que mostra o andamento