Programando uma classe para criar um controle VB.NET personalizado

Construir componentes personalizados completos pode ser um projeto muito avançado. Mas você pode criar uma classe VB.NET que possui muitas das vantagens de um componente da caixa de ferramentas com muito menos esforço. Aqui está como!

Para obter uma amostra do que você precisa fazer para criar um componente personalizado completo, tente esta experiência:

-> 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 do Solution Explorer.

Isso exibirá os arquivos que o Visual Studio cria para o seu projeto (para que você não precise). Como uma nota de rodapé histórica, o compilador VB6 fez as mesmas coisas, mas você nunca pôde acessar o código porque estava enterrado no "p-código" compilado. Também era possível desenvolver controles personalizados no VB6, mas era muito mais difícil e exigia um utilitário especial que a Microsoft fornecia apenas para esse fim.

Na forma

instagram viewer
Designer.vb, você encontrará que o código abaixo foi adicionado automaticamente nos locais certos para dar suporte ao componente CheckBox. (Se você tiver uma versão diferente do Visual Studio, seu código poderá ser um pouco diferente.) Esse é o código que o Visual Studio grava para você.

'Necessário pelos componentes privados do Windows Form Designer _ Como sistema. ComponentModel. IContainer'NOTA: O procedimento a seguir é obrigatório 'pelo Windows Form Designer'. Ele pode ser modificado usando o Windows Form Designer.'Não modifique usando o editor de código. _Private Sub InitializeComponent () Me. CheckBox1 = Novo sistema. Janelas. Formulários. CheckBox () Eu. SuspendLayout () '' CheckBox1 'Me. CheckBox1.AutoSize = True Me. CheckBox1.Location = Novo sistema. Desenhando. Ponto (29, 28) Eu. CheckBox1.Name = "CheckBox1".. . e assim por diante ...

Este é o código que você precisa adicionar ao seu programa para criar um controle personalizado. Lembre-se de que todos os métodos e propriedades do controle CheckBox real estão em uma classe fornecida pelo .NET Framework: Sistema. Janelas. Formulários. CheckBox. Isso não faz parte do seu projeto, porque está instalado no Windows para todos os programas .NET. Mas tem um muito disso.

Outro ponto a ter em atenção é que, se você estiver usando WPF (Windows Presentation Foundation), a classe .NET CheckBox vem de uma biblioteca completamente diferente chamada Sistema. Janelas. Controles. 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 uma pequena "cara feliz" em vez de exibir o pequeno gráfico de "verificação". Vamos criar uma classe que faça isso e mostrar como adicioná-la ao seu projeto. Embora isso possa ser útil por si só, o objetivo real é demonstrar o VB.NET herança.

Vamos começar a codificar

Para começar, altere o nome da caixa de seleção que você acabou de adicionar a oldCheckBox. (Você pode parar de exibir "Mostrar todos os arquivos" 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 Solution Explorer e selecionar "Adicionar" e "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 da classe e adicione este código:

Classe pública newCheckBox herda CheckBox Private CenterSquareColor As Color = Color. Vermelho protegido substitui Sub OnPaint (ByVal pEvent _ Como PaintEventArgs) Dim CenterSquare _ Como novo retângulo (3, 4, 10, 12) MyBase. OnPaint (pEvent) Se eu. Verificado e depois pEvento. Gráficos. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End Classe SubEnd

(Neste artigo e em outros no site, muitas continuações de linha são usadas para manter as linhas curtas, para que elas se ajustem ao espaço disponível na página da web.)

A primeira coisa a observar sobre o seu novo código de classe é o Herda palavra-chave Isso significa que todas as propriedades e métodos de um VB.NET Framework CheckBox fazem parte automaticamente 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:

O primeiro é o código usa Sobrepor para substituir o comportamento padrão do .NET que ocorreria por um OnPaint evento. Um evento OnPaint é acionado sempre que o Windows perceber que parte da tela precisa ser reconstruída. Um exemplo seria quando outra janela descobrir parte da sua exibição. O Windows atualiza a exibição automaticamente, mas depois chama o evento OnPaint no seu código. (O evento OnPaint também é chamado quando o formulário é criado inicialmente.) Portanto, se substituirmos o OnPaint, podemos alterar a aparência das coisas na tela.

A segunda é a maneira como o Visual Basic cria a CheckBox. Sempre que o pai estiver "marcado" (ou seja, Eu. Verificado é Verdade), 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 é chamado 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 as chamadas do 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é parecer certo.

Há uma etapa muito importante que você deseja certificar-se de não deixar de fora dos procedimentos de substituição:

MyBase. OnPaint (pEvent)

Substituir significa que seu código fornecerá todos do código para o evento. Mas isso raramente é o que você deseja. Portanto, o VB fornece uma maneira de executar o código .NET normal que teria sido executado para um evento. Esta é a afirmação que faz isso. Ele passa o mesmo parâmetro - pEvent - para o código do 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 Carga procedimento de evento.

Abra a janela de código para o procedimento de evento de carregamento de formulário e adicione este código:

Private Sub frmCustCtrlEx_Load (remetente ByVal como sistema. Objeto, ByVal e As System. EventArgs) Lida com MyBase. Carregar Dim customCheckBox como novo newCheckBox () Com customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Esquerda .Top = oldCheckBox. Top + oldCheckBox. Height .Size = Novo tamanho (oldCheckBox. Tamanho. Largura + 50, oldCheckBox. Tamanho. Altura) Terminar com controles. Adicionar (customCheckBox) End Sub

Para colocar a nova caixa de seleção no formulário, aproveitamos o fato de já existir uma e usamos 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, o adicionamos à coleção Controls.

Mas esse código não é muito flexível. Por exemplo, a cor Vermelho é codificada e a alteração da cor requer alteração do programa. Você também pode querer um gráfico em vez de uma marca de seleção.

Aqui está uma nova classe CheckBox aprimorada. Este código mostra como executar algumas das próximas etapas para a programação orientada a objetos do VB.NET.

Classe pública betterCheckBox herda CheckBox Private CenterSquareColor As Color = Color. Azul Private CenterSquareImage como bitmap Private CenterSquare como novo retângulo (3, 4, 10, 12) Protegido Substitui Sub OnPaint _ (ByVal pEvent As _ System. Janelas. Formulários. (PaintEventArgs) MyBase. OnPaint (pEvent) Se eu. Verificado em seguida, se CenterSquareImage for Nothing, então pEvent. Gráficos. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Outro evento. Gráficos. DrawImage (CenterSquareImage, CenterSquare) End If End If End Propriedade pública sub FillColor () como cor Get FillColor = CenterSquareColor End Get Set (valor ByVal como cor) CenterSquareColor = Valor Final da propriedade final da propriedade Propriedade pública FillImage () como bitmap obtido FillImage = CenterSquareImage final obtido (valor ByVal valor como bitmap) CenterSquareImage = Valor final definido final da propriedade PropertyEnd Classe

Por que a versão BetterCheckBox é melhor

Uma das principais melhorias é a adição de duas Propriedades. Isso é algo que a classe antiga não fez.

As duas novas propriedades introduzidas são

FillColor

e

FillImage

Para ter uma idéia de como isso funciona no VB.NET, tente este experimento simples. Adicione uma classe a um projeto padrão e digite o código:

Propriedade pública

Quando você pressiona Enter após digitar "Get", o VB.NET Intellisense preenche todo o bloco de códigos de propriedades 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 dizer isso ao Intellisense para iniciá-lo.)

Propriedade pública Whatever Get End Get Set (valor ByVal) End SetEnd Propriedade

Esses blocos foram concluídos no código acima. O objetivo desses blocos de código é permitir que valores de propriedade sejam acessados ​​de outras partes do sistema.

Com a adição de Métodos, você estaria no bom caminho para criar um componente completo. Para ver um exemplo muito simples de um método, adicione este código abaixo das declarações de propriedade na classe betterCheckBox:

Sub-ênfase pública () Eu. Fonte = Novo sistema. Desenhando. Fonte (_ "Microsoft Sans Serif", 12.0!, _ Sistema. Desenhando. Estilo de fonte. Negrito) Eu. Tamanho = Novo sistema. Desenhando. Tamanho (200, 35) CenterSquare. Deslocamento (CenterSquare. Esquerda - 3, CenterSquare. Principal + 3) End Sub

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 considerar o novo tamanho. Para usar o novo método, basta codificá-lo da mesma maneira que faria com qualquer método:

MyBetterEmphasizedBox. Enfatizar()

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ê deve 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, Programação de 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.