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.LabelDesta 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")]<br /> /// <summary><br /> /// Get or set text flow from control.<br /> /// </summary><br /> public System.Drawing.Drawing2D.LinearGradientMode GradientMode<br /> {<br /> get { return lineargradmode; }<br /> set { lineargradmode = value; this.Invalidate(); }<br /> }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)]<br /> public override bool AutoSize<br /> {<br /> get<br /> {<br /> return base.AutoSize;<br /> }<br /> set<br /> {<br /> base.AutoSize = value;<br /> }<br /> }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)<br /> {<br /> //set init properties<br /> base.OnPaint(e);<br /> ...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.







