Você está na página 1de 28

Creacion de Controles Personalizados con VB.

Net
Jorge Barrientos Jorge.barrientos@gmail.com

La pregunta?

La pregunta siempre es la misma, como puedo crear mis propios controles?

Control propuesto

Crearemos un control label que pueda moverse en tiempo de ejecucion.

Control Label Reubicable

Crearemos un control creado por nosotros mismos a partir del control Label que viene integrado en el .Net Framework.

Control Label Reubicable

Tambien crearemos una aplicacion para probar nuestro control personalizado.

Control Label Reubicable

Especificaciones
Primero,

se requiere toda la funcionalidad que un control Label ofrece. Lo que adicionaremos es la habilidad para poder moverlo en tiempo de ejecucion. Regla No. 1, si ya existe un control que posee mas funcionalidad de la que necesita, herede de este.

Control Label Reubicable

Especificaciones
Necesitamos

mover nuestro control Label cuando el boton del raton este presionado sobre el. Necesitamos algun tipo de indicador para mostrar que nuestro control se puede mover cuando el cursor este sobre el. Tambien necesitamos cambiar el cursor cuando el cursor se encuentre sobre nuestro control para indicar que se esta en modo movimiento.

Control Label Reubicable

Lo primero en nuestra lista es obtener toda la funcionalidad de un control Label normal dentro de nuestro control al que bautizaremos con el nombre de MSNetSVEtiquetaMovil.

Control MSNetSVEtiquetaMovil
Para comenzar crearemos un nuevo proyecto Windows Control Library, y lo llamaremos Libreria de Controles Moviles MSNetSV. Cambiamos el nombre a la clase Class1.vb a MSNetSVEtiquetaMovil.vb

Control MSNetSVEtiquetaMovil
Con lo anterior tenemos nuestra libreria para controles moviles en tiempo de ejecucion. Si se desean desarrollar mas controles bastaria con agregar nuevas clases a esta libreria.

Control MSNetSVEtiquetaMovil
Antes de comenzar a trabajar con el codigo necesitamos importar un par de cosas, ya que estamos trabajando con controles para formularios Windows, . El namespace System.Windows.Forms, el cual nos da acceso al control estandar Label.

Control MSNetSVEtiquetaMovil

Ademas para obtener las coordenadas del mouse pasadas como parametros en los eventos de este, pasaran como una estructura Point. Asi que se necesitara el namespace System.Drawing para tener acceso a la estructura Point.

Control MSNetSVEtiquetaMovil

Con las referencias hechas, solamente necesitamos cambiar un poco el codigo para importar los namespaces que estos dos archivos exponen, e indicarle a nuestro control de donde heredara sus caracteristicas iniciales.

Control MSNetSVEtiquetaMovil
Imports System.Windows.Forms Imports System.Drawing Public Class MSNetSVEtiquetaMovil Inherits System.Windows.Forms.Label
End Class

Control MSNetSVEtiquetaMovil

Con esto tenemos una clase que hace exactamente lo mismo que un control Label normal.

Control MSNetSVEtiquetaMovil

Sin embargo no puede ser ejecutado, si se presiona F5 para ejecutar el proyecto nos lanzara una excepcion.

Control MSNetSVEtiquetaMovil

Debido a lo anterior adicionaremos un proyecto para poder probar nuestro poderoso control.

Control MSNetSVEtiquetaMovil

Agregamos un nuevo proyecto VB.Net Windows Application y lo llamaremos Prueba Controles Moviles.

Control MSNetSVEtiquetaMovil

Nuestro control debe dar algun tipo de indicacion al usuario. Debido a que nuestro control tiene dos estados Estatico y Movil, debemos indicarle al usuario en que estado esta nuestro control.

Control MSNetSVEtiquetaMovil
MODO MOVIL Es aca donde empieza a escribirse codigo. Necesitamos agregar soporte a nuestro control para cambiar el cursor cuando el boton izquierdo es presionado en nuestro control, y necesitamos restaurarlo una vez se deje de presionar el boton del mouse.

Control MSNetSVEtiquetaMovil

Esto es facil de manejar debido a que el control Label ya posee dos eventos MouseDown y MouseUp.

Control MSNetSVEtiquetaMovil

Para controlar nuestro cursor adicionaremos un atributo a nuestra clase.


Private _MiCursor As Cursor Public ReadOnly Property MiCursor() As Cursor Get Return Me._MiCursor End Get End Property

Control MSNetSVEtiquetaMovil

Ahora agregaremos codigo para controlar nuestro atributo para manejar el estado del cursor.

Control MSNetSVEtiquetaMovil Private Sub MSNetSVEtiquetaMovil_MouseDown( _


ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown If (e.Button = Windows.Forms.MouseButtons.Left) Then Me._MiCursor = MyBase.Cursor MyBase.Cursor = Cursors.SizeAll End If End Sub Private Sub MSNetSVEtiquetaMovil_MouseUp( _ ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) _ Handles Me.MouseUp MyBase.Cursor = Me.MiCursor End Sub

Control MSNetSVEtiquetaMovil
Private _PosicionRelativaDeCursor As Point Private _Moviendo As Boolean

Control MSNetSVEtiquetaMovil
Private Sub MSNetSVEtiquetaMovil_MouseDown( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles Me.MouseDown If (e.Button = Windows.Forms.MouseButtons.Left) Then Me._MiCursor = MyBase.Cursor MyBase.Cursor = Cursors.SizeAll '

Me._PosicionRelativaDeCursor = e.Location Me._Moviendo = True


End If End Sub

Control MSNetSVEtiquetaMovil
Private Sub MSNetSVEtiquetaMovil_MouseUp( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles Me.MouseUp _Moviendo = False MyBase.Cursor = Me.MiCursor End Sub

Control MSNetSVEtiquetaMovil
Private Sub MSNetSVEtiquetaMovil_MouseMove( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles Me.MouseMove If (Moviendo) Then Dim posicionCliente As Point = _ MyBase.Parent.PointToClient( _ System.Windows.Forms.Cursor.Position) Dim ajustarUbicacion As New Point( _ posicionCliente.X - Me._PosicionRelativaDeCursor.X, _ posicionCliente.Y - Me._PosicionRelativaDeCursor.Y) MyBase.Location = ajustarUbicacion End If End Sub

Você também pode gostar