Programación de una clase para crear un control VB.NET personalizado

La construcción de componentes personalizados completos puede ser un proyecto muy avanzado. Pero puede crear una clase VB.NET que tenga muchas de las ventajas de un componente de caja de herramientas con mucho menos esfuerzo. ¡Así es cómo!

Para tener una idea de lo que necesita hacer para crear un componente personalizado completo, intente este experimento:

-> Abra un nuevo proyecto de aplicación de Windows en VB.NET.
-> Agregue un CheckBox del cuadro de herramientas al formulario.
-> Haga clic en el botón "Mostrar todos los archivos" en la parte superior de Explorador de la solución.

Esto mostrará los archivos que Visual Studio crea para su proyecto (para que no tenga que hacerlo). Como nota al pie histórica, el compilador VB6 hizo muchas de las mismas cosas, pero nunca se pudo acceder al código porque estaba enterrado en el "código p" compilado. También podría desarrollar controles personalizados en VB6, pero fue mucho más difícil y requirió una utilidad especial que Microsoft suministró solo para ese propósito.

instagram viewer

En la forma Designer.vb encontrará que el código siguiente se ha agregado automáticamente en las ubicaciones correctas para admitir el componente CheckBox. (Si tiene una versión diferente de Visual Studio, su código puede ser ligeramente diferente). Este es el código que Visual Studio escribe para usted.

'Requerido por los componentes privados de Windows Form Designer _ Como sistema. Componente Modelo. IContainer'NOTA: Se requiere el siguiente procedimiento 'por parte del Diseñador de formularios de Windows' Se puede modificar con el Diseñador de formularios de Windows '. No lo modifique con el editor de código. _Private Sub InitializeComponent () Me. CheckBox1 = Nuevo sistema. Windows Formas CheckBox () Yo. SuspendLayout () '' CheckBox1 'Me. CheckBox1.AutoSize = True Me. CheckBox1.Location = Nuevo sistema. Dibujo. Punto (29, 28) Yo. CheckBox1.Name = "CheckBox1".. . Etcétera ...

Este es el código que debe agregar a su programa para crear un control personalizado. Tenga en cuenta que todos los métodos y propiedades del control CheckBox real están en una clase proporcionada por .NET Framework: Sistema. Windows Formas Caja. Esto no es parte de su proyecto porque está instalado en Windows para todos los programas .NET. Pero hay un lote de eso.

Otro punto a tener en cuenta es que si está utilizando WPF (Windows Presentation Foundation), la clase .NET CheckBox proviene de una biblioteca completamente diferente llamada Sistema. Windows Control S. Este artículo solo funciona para una aplicación de formularios Windows Forms, pero los principios de herencia aquí funcionan para cualquier proyecto VB.NET.

Supongamos que su proyecto necesita un control que se parezca mucho a uno de los controles estándar. Por ejemplo, una casilla de verificación que cambió de color o mostró una pequeña "cara feliz" en lugar de mostrar el pequeño gráfico de "verificación". Vamos a construir una clase que haga esto y le mostraremos cómo agregarlo a su proyecto. Si bien esto podría ser útil por sí solo, el objetivo real es demostrar los VB.NET herencia.

Comencemos a codificar

Para comenzar, cambie el nombre del CheckBox que acaba de agregar a oldCheckBox. (Es posible que desee dejar de mostrar "Mostrar todos los archivos" nuevamente para simplificar el Explorador de soluciones). Ahora agregue una nueva clase a su proyecto. Hay varias formas de hacer esto, incluyendo hacer clic derecho en el proyecto en el Explorador de soluciones y seleccionar "Agregar" y luego "Clase" o seleccionar "Agregar clase" debajo del elemento del menú Proyecto. Cambie el nombre del archivo de la nueva clase a nuevoCheckBox para mantener las cosas en orden. Finalmente, abra la ventana de código para la clase y agregue este código:

Clase pública newCheckBox hereda CheckBox Private CenterSquareColor As Color = Color. Red Protected Overrides Sub OnPaint (ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Comprobado Entonces evento. Gráficos. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End SubEnd Class

(En este artículo y en otros en el sitio, se utilizan muchas continuaciones de línea para mantener las líneas cortas para que quepan en el espacio disponible en la página web).

Lo primero que debe notar sobre su nuevo código de clase es el Hereda palabra clave. Eso significa que todas las propiedades y métodos de un VB.NET Framework CheckBox son automáticamente parte de este. Para apreciar cuánto trabajo ahorra, debe haber intentado programar algo como un componente CheckBox desde cero.

Hay dos cosas clave para notar en el código anterior:

El primero es el código que usa Anular para reemplazar el comportamiento estándar de .NET que tendría lugar para un OnPaint evento. Un evento OnPaint se activa cada vez que Windows nota que parte de su pantalla tiene que ser reconstruida. Un ejemplo sería cuando otra ventana destapa parte de su pantalla. Windows actualiza la pantalla automáticamente, pero luego llama al evento OnPaint en su código. (El evento OnPaint también se llama cuando el formulario se crea inicialmente). Entonces, si anulamos OnPaint, podemos cambiar la apariencia de las cosas en la pantalla.

La segunda es la forma en que Visual Basic crea CheckBox. Cada vez que el padre está "marcado" (es decir, Yo. Comprobado es Cierto), entonces el nuevo código que proporcionamos en nuestra clase NewCheckBox volverá a colorear el centro de CheckBox en lugar de dibujar una marca de verificación.

El resto es lo que se llama Código GDI +. Este código selecciona un rectángulo del mismo tamaño que el centro de una casilla de verificación y lo colorea con llamadas al método GDI +. Los "números mágicos" para colocar el rectángulo rojo, "Rectángulo (3, 4, 10, 12)", se determinaron experimentalmente. Simplemente lo cambié hasta que se veía bien.

Hay un paso muy importante que debe asegurarse de no dejar de lado los procedimientos de anulación:

MyBase OnPaint (pEvent)

Anular significa que su código proporcionará todos del código para el evento. Pero esto rara vez es lo que quieres. Por lo tanto, VB proporciona una forma de ejecutar el código .NET normal que se habría ejecutado para un evento. Esta es la declaración que hace eso. Pasa el mismo parámetro, pEvent, al código de evento que se habría ejecutado si no se hubiera anulado, MyBase. OnPaint.

Usando el nuevo control

Debido a que nuestro nuevo control no está en nuestra caja de herramientas, debe crearse en forma con código. El mejor lugar para hacerlo es en la forma Carga procedimiento de evento

Abra la ventana de código para el procedimiento de evento de carga de formulario y agregue este código:

Private Sub frmCustCtrlEx_Load (remitente ByVal como sistema. Objeto, ByVal e como sistema. EventArgs) maneja MyBase. Cargue Dim customCheckBox como New newCheckBox () Con customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Izquierda. Arriba = oldCheckBox. Top + oldCheckBox. Altura. Tamaño = Nuevo tamaño (oldCheckBox. Talla. Ancho + 50, antiguoCheckBox. Talla. Altura) Finalizar con controles. Agregar (customCheckBox) End Sub

Para colocar la nueva casilla de verificación en el formulario, hemos aprovechado el hecho de que ya existe una y solo hemos utilizado el tamaño y la posición de esa (ajustada para que la propiedad Text se ajuste). De lo contrario, tendríamos que codificar la posición manualmente. Cuando MyCheckBox se ha agregado al formulario, lo agregamos a la colección Controls.

Pero este código no es muy flexible. Por ejemplo, el color Rojo está codificado y cambiar el color requiere cambiar el programa. También es posible que desee un gráfico en lugar de una marca de verificación.

Aquí hay una nueva y mejorada clase CheckBox. Este código muestra cómo dar algunos de los siguientes pasos hacia la programación orientada a objetos VB.NET.

Clase pública betterCheckBox hereda CheckBox Private CenterSquareColor As Color = Color. Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle (3, 4, 10, 12) Anulaciones protegidas Sub OnPaint _ (Evento ByVal como _ Sistema. Windows Formas PaintEventArgs) MyBase. OnPaint (pEvent) If Me. Marcado entonces si CenterSquareImage no es nada, entonces pEvent. Gráficos. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Else pEvent. Gráficos. DrawImage (CenterSquareImage, CenterSquare) End If End End End Sub Public Property FillColor () As Color Get FillColor = CenterSquareColor End Get Set (ByVal Value As Color) CenterSquareColor = Valor Fin Establecer propiedad final Propiedad pública FillImage () Como mapa de bits Obtener FillImage = CenterSquareImage Fin Obtener Conjunto (Por valor de valor como Bitmap) CenterSquareImage = Valor Fin Establecer Establecer Fin Propiedad Fin Clase

Por qué la versión BetterCheckBox es mejor

Una de las principales mejoras es la adición de dos Propiedades. Esto es algo que la vieja clase no hizo en absoluto.

Las dos nuevas propiedades introducidas son

Color de relleno

y

FillImage

Para tener una idea de cómo funciona esto en VB.NET, pruebe este sencillo experimento. Agregue una clase a un proyecto estándar y luego ingrese el código:

Propiedad pública Lo que consiga

Cuando presiona Enter después de escribir "Obtener", VB.NET Intellisense llena todo el bloque de código de Propiedad y todo lo que tiene que hacer es codificar los detalles de su proyecto. (Los bloques Get y Set no siempre se requieren a partir de VB.NET 2010, por lo que al menos tiene que decirle esto a Intellisense para iniciarlo).

Propiedad pública Lo que sea Get End Get Set (valor ByVal) End SetEnd Property

Estos bloques se han completado en el código anterior. El propósito de estos bloques de código es permitir el acceso a los valores de propiedad desde otras partes del sistema.

Con la adición de Métodos, estaría en camino de crear un componente completo. Para ver un ejemplo muy simple de un Método, agregue este código debajo de las Declaraciones de propiedad en la clase betterCheckBox:

Public Sub Énfasis () Yo. Fuente = Nuevo sistema. Dibujo. Fuente (_ "Microsoft Sans Serif", 12.0!, _ Sistema. Dibujo. Estilo de fuente. Negrita) Yo. Tamaño = nuevo sistema. Dibujo. Tamaño (200, 35) Centro Cuadrado. Desplazamiento (CenterSquare. Izquierda - 3, CenterSquare. Top + 3) Fin Sub

Además de ajustar la fuente que se muestra en un cuadro de verificación, este método también ajusta el tamaño del cuadro y la ubicación del rectángulo marcado para tener en cuenta el nuevo tamaño. Para usar el nuevo método, solo codifíquelo de la misma manera que lo haría con cualquier método:

MyBetterEmphasizedBox. Enfatizar()

¡Y al igual que Propiedades, Visual Studio agrega automáticamente el nuevo método a Intellisense de Microsoft!

El objetivo principal aquí es simplemente demostrar cómo se codifica un método. Es posible que sepa que un control CheckBox estándar también permite cambiar la Fuente, por lo que este método realmente no agrega mucha función.

El siguiente artículo de esta serie, Programación de un control VB.NET personalizado: ¡Más allá de lo básico!, muestra un método que sí lo hace y también explica cómo anular un método en un control personalizado.

instagram story viewer