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.
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.



