Escolar Documentos
Profissional Documentos
Cultura Documentos
Net
Jorge Barrientos Jorge.barrientos@gmail.com
La pregunta?
Control propuesto
Crearemos un control creado por nosotros mismos a partir del control Label que viene integrado en el .Net Framework.
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.
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.
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
Control MSNetSVEtiquetaMovil
Ahora agregaremos codigo para controlar nuestro atributo para manejar el estado del cursor.
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 '
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