.NET

1 ago, 2007

Controles Personalizados: GradientLabel

Publicidade

Olá pessoal. Quero falar um pouco sobre controles Windows Forms. O .NET Framework já nos da uma centena de controles, mas há casos onde nenhum deles se encaixa em nossa necessidade. É dai que vem a necessidade de um mecanismo de criação e personalização de controles. O .NET Framework nos dá três opções para criar um controle:

Controle Composto

Um controle composto é criada pela combinação de um ou mais controles já existentes, em uma só montagem. Um bom exemplo disso é o já conhecido controle de login, que combina Labels, Textboxes e Buttons em uma só montagem.

Controle Estendido

Um controle estendido é criado a partir de um controle já existente, adicionando funcionalidade e aproveitando funcionalidade já existente no controle.

Controle Customizado

O controle customizado é criado tendo como base a classe base de todos os controles.

System.Windows.Forms.Controls. Nessa opção o desenvolvedor é responsável por toda a funcionalidade do controle, bem como a pintura do controle no formulário. Está é a opção mais flexível, porem a mais trabalhosa.

Criando o GradientLabel

GradientLabel em ação.GradientLabel em ação.

Ok, vamos focar na extensão de um controle existente, o Label. O Label tem como objetivo principal desenhar um texto na tela. O Label já expõe algumas funcionalidades básicas, dentre elas, o propriedade TextAlign, que define o alinhamento do texto dentro do controle.

Nosso controle estendido, GradientLabel deverá estender o controle Label, e terá como objetivo adicionar duas funcionalidades:

Criando o Controle

Primeiro devemos criar um projeto no VS.NET, Windows Control Library. O passo seguinte é mudar a herança da classe para a classe Label, dessa forma:

public partial class GradientLabel : System.Windows.Forms.Label

Desta maneira estamos criando uma classe GradientLabel, que usará a classe System.Windows.Forms.Label como base.

1 – Adicionando funcionalidade I: Propriedades

A criação de propriedades é feita da mesma maneira em aplicativo Windows Forms comum. No entanto se quisermos adicionar suporte ao designer devemos utilizar alguns atributos. Dar suporte ao designer significa possibilitar a interação com seu controle em tempo de design pela interface do VS.NET.

Exemplo:

[Description("Controls text orientation"), Category("Appearance"), DefaultValue(typeof(System.Drawing.Drawing2D.LinearGradientMode), "ForwardDiagonal")]
/// <summary>
/// Get or set text flow from control.
/// </summary>
public System.Drawing.Drawing2D.LinearGradientMode GradientMode
{
get { return lineargradmode; }
set { lineargradmode = value; this.Invalidate(); }
}

No código acima o atributo Description adiciona uma descrição a caixa de controles no VS.NET.

Category, encaixa o propriedade em uma das categorias existentes na caixa de propriedades do controle e DefaultValue estabelece um valor inicial para a propriedade.

2 – Adicionando Funcionalidade II – Controlando acesso a propriedades

Em alguns casos é necessário remover o acesso a algumas propriedades. Isso pode ser feito facilmente através do atributo Browsable. Em nosso caso queremos remover o acesso a propriedade AutoSize, assim o consumidor ficará responsável por configurar o tamanho de nosso controle manualmente.

[Browsable(false),DefaultValue(false)]
public override bool AutoSize
{
get
{
return base.AutoSize;
}
set
{
base.AutoSize = value;
}
}

2 – Adicionando Funcionalidade III – Sobrescrevendo Métodos

Depois que já criamos todas as propriedades e removemos o acesso as propriedades indesejadas, só nos resta implementar a funcionalidade no código!

protected override void OnPaint(PaintEventArgs e)
{
//set init properties
base.OnPaint(e);
...

O método OnPaint é responsável pelo desenho do controle na tela, e é aqui que entra nosso código para desenha o fundo gradiente e posicionar o controle verticalmente na tela.

Quero ouvir seu feedback. Me enviem suas duvidas, comentários e criticas.

Abraços e até a próxima.