.NET Tutorial 18. Cómo crear propiedades personalizadas para cualquier control de Windows

En la entrada anterior vimos como cambiar el aspecto "visual" de un control de Windows. Hoy vamos a ir un paso más allá. Vamos a ver lo fácil que resulta crear propiedades "personalizadas" para cualquier control de Windows desde .NET.

Cuando añades un control de Windows en tu formulario, se nos muestran una serie de propiedades asociadas a dicho control, por ejemplo para una caja de texto:

Estas propiedades alteran el comportamiento de dicho control. Puede darse el caso en que por comodidad, necesitemos que un control haga algo "especial", lo típico, que por ejemplo una caja de texto sólo acepte números.

Para ello nos crearemos un nuevo control, al que llamaremos OllyTextBOX.vb:


(Haz click  para ampliar la imagen)

Tal y cómo mostramos en el tutorial anterior modificaremos el código de <nombre_del_control>.Designer.vb:


(Haz click para ampliar la imagen)

En este caso, modificaremos el código que genera Visual Studio y lo cambiaremos por el código que está resaltado.

Nota: Al hacer un Inherits System.Windows.Forms.TextBox, nuestro control va a heredar TODOS los eventos, propiedades y métodos del control TextBox.

Bien, una vez realizado este cambio y compilado el programa, veremos que tenemos disponible nuestro nuevo control en el "Cuadro de herramientas":

Ahora toca modificar la clase del control, que por defecto estará en blanco:

Añadiremos el siguiente código:

Si compilamos el programa e insertamos el nuevo control en el formulario, veremos que ahora tenemos una nueva propiedad, que se llama PropiedadNueva:

Obviamente, tal y como está el código, esta "propiedad" no hace nada. Más que nada la he puesto para que veais (esa gente de poca fé 😉 que dicha propiedad es "nueva"

Ahora bien, si añadimos el siguiente código a la clase:


(Haz click para agrandar la imagen)

Aquí véis que hemos añadido otra propiedad nueva, en este caso la hemos llamado OnlyNumbres y es de tipo booleano.

Si os fijáis, hemos "overraideado" el procedimiento OnKeyPress de tal forma que cuando la propiedad OnlyNumbers sea "True" solo se puedan introducir números en la caja de texto.

Si volvemos a compilar y metemos el nuevo control en nuestro formulario, vemos que efectivamente, tenemos una propiedad que se llama OnlyNumbers: (OMG, WTF, PQC!!!) :

Pero vamos a ir un paso más allá, vamos a definir dos nuevas propiedades. Una propiedad la llamaremos ActivarProteccion y otra la llamaremos MsgNoCopiar, donde la primera es de tipo booleano y la segunda es de tipo cadena (string)


(Haz click para agrandar la imagen)

Al mismo tiempo, lo que vamos a hacer es "Overraidear" el procedimiento WndProc de esta forma:


(Haz click para agrandar la imagen)

Los programadores de C / C++ estarán mas acostumbrados a ver el procedimiento WndProc que los programadores de Visual Basic. Básicamente, el procedimiento WndProc nos informa de los mensajes de Windows, existen un mogollón de mensajes, tal y como se puede ver en este link.

Pues bien, básicamente lo que hemos hecho es que cuando se detecte el mensaje "copiar texto", "pegar texto" o "botón derecho del ratón pulsado" (normalmente los pop-ups para copiar/pegar se sacan con el botón derecho del ratón) y además la propiedad ActivarProteccion sea verdadera, se impedira copiar o pegar texto en nuestro control. Si esto sucede, se muestra un Mensaje con el contenido de la nueva propiedad MsgNoCopiar.

Bien, aprovecharemos para declarar unos valores por defecto de esta forma:


(Haz click para agrandar la imagen)

Y dentro del InitializeComponent (que está dentro del <nombre_control>.Designer.vb) definiremos estos valores:


(Haz click para agrandar la imagen)

Bien, ahora compilaremos de nuevo el código e iremos a nuestro formulario en vista diseño y efectivamente, al añadir nuestro nuevo control al formulario vemos que éste tiene las propiedades ActivarProteccion:

Y MsgNoCopiar:

Como podéis apreciar, cuando hacemos click sobre esas propiedades nuevas que hemos definido no se muestra la descripción, únicamente el nombre de la propiedad.

Para solucionarlo, tendremos que añadir el NameSpace System.ComponetModel a nuestra clase y usar los /tags para documentar cada propiedad:


(Haz click para agrandar la imagen)

(Nota: Hay abundante información en la MSDN de cómo utilizar este NameSpace)

Una vez realizado dicho cambio, como podéis ver, ahora si que se muestra una "descripción" de lo que hace la propiedad "personalizada":

El código completo de la clase OllyTextBOX.

Bien, compilaremos de nuevo el programa y en nuestro formulario lo diseñaremos con dos "CheckBox" y un OllyTextBOX:

El "increible" código de nuestro formulario es este:


(Haz click para agrandar la imagen)

Prueba de hacer un CTRL+C, un CTRL+V dentro del OllyTextBOX cuando la propiedad ActivarProteccion sea True, o prueba de introducir letras cuando la propiedad OnlyNumbres está a True.

Como habrás podido ver, NO HEMOS ESCRITO ni una linea de código en nuestro formulario para impedir que la caja de texto solo acepte números o se pueda copiar y pegar texto.

Esta misma técnica se puede usar para lo que quieras, el límite lo pones tú 😉

Espero vuestros comentarios.

 

Saludos.
mov eax,ollydbg; Int 13h

 

Descargar proyecto .NET Tutorial 18
(41 KB. Visual Studio 2008)