renderização de um controle Windows Forms
renderização refere-se ao processo de criação de uma representação visual na tela do usuário. Usa o Windows FormsGDI (a biblioteca de elementos gráficos Windows nova) para renderização. Classes gerenciadas que fornecem acesso a GDI no System.Drawing espaço para nome e seus subnamespaces.
Os seguintes elementos estão envolvidos no renderização 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 liberar recursos gráficos.
Funcionalidade fornecida pelo controle de desenho
A classe base Control Fornece a funcionalidade de desenho por meio de seu Paint evento. Um controle dispara o Paint evento sempre que ele precisa atualizar sua exibição. Para obter mais informações sobre eventos no .NET estrutura, consulte Manipulando e aumentando a eventos.
A classe de dados de evento para o Paint evento, PaintEventArgs, contém os dados necessários para um controle de desenho — um identificador para um objeto gráfico e um objeto de retângulo representando a região para desenhar em. 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 é um clsistema autônomos gerenciado que encapsula a funcionalidade de desenho, sistema autônomo descrito na discussão dos GDI neste tópico. The ClipRectangle é uma instância do Rectangle estruturar e define a área disponível na qual um controle pode desenhar. Um desenvolvedor de controles pode computar a ClipRectangle usando o ClipRectangle propriedade de um controle sistema autônomo descrito na discussão de geometria neste tópico.
Um controle deve fornecer a lógica de renderização, substituindo o OnPaint método que ele herda de Control. OnPaint obtém acesso a um objeto gráfico e um retângulo de desenho em através de Graphics e o ClipRectangle propriedades das PaintEventArgs instância passado para ele.
Protected Overridable Sub OnPaint(pe As PaintEventArgs)
protected virtual void OnPaint(PaintEventArgs pe);
The OnPaint método da base Control classe não implementa a funcionalidade de desenho, mas simplesmente invoca os delegados de eventos são registrados com o Paint evento. Quando você substituir OnPaint, geralmente você deve chamar o OnPaint método da classe base, de modo que registrado delegados receber o Paint evento. No entanto, controles que pintar a superfície de inteira não devem chamar OnPaint, pois isso apresenta intermitências. Para obter um exemplo de substituir o OnPaint evento, consulte o Como: Criar um controle Windows Forms que mostra o andamento.
Observação: |
---|
Não invocar OnPaint diretamente do seu controle; em vez disso, invocar o Invalidate método (herdado da Control) ou algum Outros método que chama Invalidate. The Invalidate por sua vez chama o método OnPaint. The Invalidate método estiver sobrecarregado e, dependendo dos argumentos fornecido para Invalidate e, um controle é redesenhado alguns ou todos de sua área de tela. |
A base Control classe define outro método é útil para desenho — o OnPaintBackground método.
Protected Overridable Sub OnPaintBackground(pevent As PaintEventArgs)
protected virtual void OnPaintBackground(PaintEventArgs pevent);
OnPaintBackground pinta o plano de fundo (e, assim, a forma) da janela e garantidas como rápida, ao mesmo tempo OnPaint Pinta os detalhes e pode ser mais lenta porque solicitações individuais pintura são combinadas em um 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 com cor de gradiente para o seu controle.
Ao mesmo tempo em que OnPaintBackground tem uma nomenclatura eventos semelhantes e tem o mesmo argumento sistema autônomo o OnPaint método, OnPaintBackground não é um método de evento true. Não há nenhum PaintBackground eventos e OnPaintBackground não invoca o evento delegados. Ao substituir o OnPaintBackground método, uma classe derivada não é necessária para invocar o OnPaintBackground método de sua classe base.
Noções básicas do GDI +
The Graphics classe fornece métodos para desenhar várias formas sistema autônomo círculos, triângulos, arcos e elipses, bem sistema autônomo métodos para exibir texto. The System.Drawing namespace e seus subnamespaces contém classes que encapsulam sistema autônomo elementos gráficos sistema autônomo 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 elementos gráficos gerenciado.Os conceitos básicos de GDI também são descritos na Como: Criar um controle Windows Forms que mostra o andamento.
Geometria da região desenho
The 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 que a pintura é feita no Paint método de evento que leva uma PaintEventArgs instância sistema autônomo seu argumento). Um controle pode precisar pintar apenas uma parte da sua área disponível, assim sistema autônomo acontece quando uma pequena parte das alterações de exibição do controle.Nessas situações, um desenvolvedor de controles deve calcular o retângulo real para desenhar e passar que para Invalidate. sistema autônomo versões sobrecarregadas dos Invalidate que têm um Rectangle ou Region sistema autônomo um argumento usar esse argumento para gerar o ClipRectangle propriedade de PaintEventArgs.
O código a seguir fragmento mostra como a FlashTrackBar controle personalizado calcula a área retangular para desenhar em. The 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 do System.Drawing.Graphics classe, bem sistema autônomo instâncias de System.Drawing.Brush, System.Drawing.Pen, e Outros classes de elementos gráficos. É importante que você crie um recurso de elementos gráficos somente quando precisar dele e liberá-lo assim que terminar 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.
O código a seguir fragmento mostra como a FlashTrackBar controle personalizado cria e lança um Brush recurso. Para obter 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