Uma introdução à programação de um controle VB.NET com herança
José Luis Pelaez/Getty Images
Construir componentes personalizados completos pode ser um projeto muito avançado. Mas você pode construir uma classe VB.NET que tenha muitas das vantagens de um componente de caixa de ferramentas com muito menos esforço. Aqui está como!
Para ter uma ideia do que você precisa fazer para criar um componente personalizado completo, faça este experimento:
-> Abra um novo projeto de aplicativo do Windows no VB.NET.
-> Adicione uma caixa de seleção da caixa de ferramentas ao formulário.
-> Clique no botão 'Mostrar todos os arquivos' na parte superior daExplorador de soluções.
Isso exibirá os arquivos que o Visual Studio cria para seu projeto (para que você não precise). Como nota de rodapé histórica, o compilador VB6 fazia muitas das mesmas coisas, mas você nunca poderia acessar o código porque ele estava enterrado em 'p-code' compilado. Você poderia desenvolver controles personalizados em VB6 também, mas era muito mais difícil e exigia um utilitário especial que a Microsoft forneceu apenas para essa finalidade.
Na forma Designer.vb arquivo, você descobrirá que o código abaixo foi adicionado automaticamente nos locais corretos para oferecer suporte ao componente CheckBox. (Se você tiver uma versão diferente do Visual Studio, seu código pode ser um pouco diferente.) Este é o código que o Visual Studio escreve para você.
|_+_||_+_|Este é o código que você precisa adicionar ao seu programa para criar um controle personalizado. Tenha em mente que todos os métodos e propriedades do controle CheckBox real estão em uma classe fornecida pelo .NET Framework: System.Windows.Forms.CheckBox . Isso não faz parte do seu projeto porque está instalado no Windows para todos os programas .NET. Mas há um muito disso.
Outro ponto a ser observado é que se você estiver usandoWPF(Windows Presentation Foundation), a classe .NET CheckBox vem de uma biblioteca completamente diferente chamada System.Windows.Controls . Este artigo funciona apenas para um aplicativo Windows Forms, mas os princípios de herança aqui funcionam para qualquer projeto VB.NET.
Suponha que seu projeto precise de um controle muito parecido com um dos controles padrão. Por exemplo, uma caixa de seleção que mudou de cor ou exibiu um pequeno 'rosto feliz' em vez de exibir o pequeno gráfico de 'cheque'. Vamos construir uma classe que faz isso e mostrar como adicioná-la ao seu projeto. Embora isso possa ser útil por si só, o objetivo real é demonstrar os recursos do VB.NET herança .
Vamos começar a codificar
Para começar, altere o nome do CheckBox que você acabou de adicionar caixa de seleção antiga . (Você pode querer parar de exibir 'Show All Files' novamente para simplificar o Solution Explorer.) Agora adicione uma nova classe ao seu projeto. Existem várias maneiras de fazer isso, incluindo clicar com o botão direito do mouse no projeto no Gerenciador de Soluções e selecionar 'Adicionar' e depois 'Classe' ou selecionar 'Adicionar classe' no item de menu Projeto. Altere o nome do arquivo da nova classe para newCheckBox para manter as coisas em ordem. Por fim, abra a janela de código para a classe e adicione este código:
|_+_||_+_|(Neste artigo e em outros no site, muitas continuações de linha são usadas para manter as linhas curtas para que caibam no espaço disponível na página da web.)
A primeira coisa a notar sobre seu novo código de classe é o Herda palavra-chave. Isso significa que todas as propriedades e métodos de um CheckBox do VB.NET Framework são automaticamente parte deste. Para apreciar quanto trabalho isso economiza, você deve ter tentado programar algo como um componente CheckBox do zero.
Há duas coisas importantes a serem observadas no código acima:
A primeira é o código usa Sobrepor para substituir o comportamento padrão do .NET que ocorreria para um OnPaint evento. Um evento OnPaint é acionado sempre que o Windows percebe que parte da tela precisa ser reconstruída. Um exemplo seria quando outra janela revela parte de sua tela. O Windows atualiza a exibição automaticamente, mas chama o evento OnPaint em seu código. (O evento OnPaint também é chamado quando o formulário é criado inicialmente.) Portanto, se Override OnPaint, podemos alterar a aparência das coisas na tela.
A segunda é a maneira como o Visual Basic cria o CheckBox. Sempre que o pai é 'Marcado' (ou seja, Eu. Verificado é Verdadeiro ), o novo código que fornecemos em nossa classe NewCheckBox recolorirá o centro do CheckBox em vez de desenhar uma marca de seleção.
O resto é o que se chama Código GDI+ . Esse código seleciona um retângulo exatamente do mesmo tamanho que o centro de uma caixa de seleção e o colore com chamadas de método GDI+. Os 'números mágicos' para posicionar o retângulo vermelho, 'Retângulo(3, 4, 10, 12)', foram determinados experimentalmente. Eu apenas mudei até que parecia certo.
Há uma etapa muito importante que você deseja garantir que não deixe de fora os procedimentos de substituição:
|_+_||_+_|Substituir significa que seu código fornecerá tudo do código do evento. Mas isso raramente é o que você quer. Assim, o VB fornece uma maneira de executar o código .NET normal que teria sido executado para um evento. Esta é a declaração que faz isso. Ele passa o mesmo parâmetro — pEvent — para o código de evento que teria sido executado se não tivesse sido substituído, MyBase.OnPaint.
Usando o novo controle
Como nosso novo controle não está em nossa caixa de ferramentas, ele deve ser criado no formulário com código. O melhor lugar para fazer isso é na forma Carregar procedimento do evento.
Abra a janela de código para o procedimento de evento de carregamento de formulário e adicione este código:
|_+_||_+_|Para colocar a nova caixa de seleção no formulário, aproveitamos o fato de que já existe uma e usamos apenas o tamanho e a posição dessa (ajustada para que a propriedade Text caiba). Caso contrário, teríamos que codificar a posição manualmente. Quando MyCheckBox foi adicionado ao formulário, nós o adicionamos à coleção Controls.
Mas este código não é muito flexível. Por exemplo, a cor vermelha é codificada permanentemente e alterar a cor requer a alteração do programa. Você também pode querer um gráfico em vez de uma marca de seleção.
Aqui está uma classe CheckBox nova e aprimorada. Este código mostra como dar alguns dos próximos passos em direção à programação orientada a objetos VB.NET.
|_+_||_+_|Por que a versão BetterCheckBox é melhor
Uma das principais melhorias é a adição de dois Propriedades . Isso é algo que a classe antiga não fazia.
As duas novas propriedades introduzidas são
|_+_||_+_|e
|_+_||_+_|Para ter uma ideia de como isso funciona no VB.NET, tente este experimento simples. Adicione uma classe a um projeto padrão e insira o código:
|_+_||_+_|Quando você pressiona Enter depois de digitar 'Get', o VB.NET Intellisense preenche todo o bloco de código de propriedade e tudo o que você precisa fazer é codificar as especificidades do seu projeto. (Os blocos Get e Set nem sempre são necessários a partir do VB.NET 2010, então você precisa pelo menos informar ao Intellisense isso para iniciá-lo.)
|_+_||_+_|Esses blocos foram concluídos no código acima. A finalidade desses blocos de código é permitir que os valores das propriedades sejam acessados de outras partes do sistema.
Com a adição de Métodos, você estaria no caminho certo para criar um componente completo. Para ver um exemplo bem simples de um Método, adicione este código abaixo das declarações de propriedade na classe betterCheckBox:
|_+_||_+_|Além de ajustar a fonte exibida em uma caixa de seleção, esse método também ajusta o tamanho da caixa e a localização do retângulo marcado para levar em conta o novo tamanho. Para usar o novo método, basta codificá-lo da mesma maneira que faria com qualquer método:
|_+_||_+_|E assim como Propriedades, o Visual Studio adiciona automaticamente o novo método ao Intellisense da Microsoft!
O objetivo principal aqui é simplesmente demonstrar como um método é codificado. Você pode estar ciente de que um controle CheckBox padrão também permite que a fonte seja alterada, portanto, esse método não adiciona muita função.
O próximo artigo desta série, Programando um controle VB.NET personalizado - além do básico!, mostra um método que faz isso e também explica como substituir um método em um controle personalizado.