973vistas

Buenas a ustedes señores lectores, después de muchísimo tiempo dedicado al trabajo, quiero compartir algo que desarrolle mientras estuve trabajando un pequeño proyecto. Se trata de un Control Personalizado trabajado en Visual Basic .Net; el cual le adicione algunas funciones utiles que estoy seguro les servirá a mas de uno. Por ultimo mencionar que lo desarrolle con .net 4.5.

Cuantas veces he querido que cuando el cursor o FOCUS se encuentra en un control TEXTBOX este sea mas llamativo. Pues bien ahora con este CONTROL lo será, además de poder tener las siguientes funcionalidades:

  • Color en el contorno del control, con la posibilidad de dos tipos de estilo: Simple(estatico) e Intermitente el cual cambiara entre dos colores los cuales los podras elegir: Color 1 y color 2.  Y por supuesto desactivar  este estilo. DEFAULT: SIMPLE
  • Automatizar el TAB con solo presionar la tecla ENTER. Esto es muy util cuando tienes un formulario con muchos controles y quieres que tu sistema sea muy facil y rapido de manejar. DEFAULT: SI

Pues ahora paso ha mostrar el codigo de la clase que creara el control.

1.- IMPORTAMOS REFERENCIAS NECESARIAS

Una vez creado el archivo de la clase(no explico esto por que asumo que ya tienen conocimiento de esto), importamos los recursos necesarios para las funcionalidades ya descritas dentro del TEXTBOXFOCUS. Esto ira en la parte inicial, en la zona de declaraciones.

Imports System.Timers
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms
	

2.- CODIFICANDO LA CLASE

Primero creamos la estructura principal, con el nombre de la clase(pueden escoger libremente), heredando las propiedades del TEXTBOX original. Y declarando las variables que se utilizaran.

Public Class ctrlTextFocus
    Inherits TextBox
	Private c As Integer, _focus As _Activafocus, _tipo As _TipoFocus, _color1 As Color = Color.Red, _color2 As Color = Color.Firebrick
    Private timerFocus As System.Timers.Timer
End Class
	

Ahora necesitaremos de las propiedades para poder configurar este control en tiempo de diseño.

' propiedades de control
    <Description("Especifica si se movera el Foco o cursor al control siguiente cuando se presiona la tecla Enter"), _ DisplayName("Stop Tab")> _
    Public Property ActivaFocus() As _Activafocus
        Get
            Return _focus
        End Get
        Set(value As _Activafocus)
            _focus = value
        End Set
    End Property
    <Description("Indica que tipo de Señal del Foco aparece al rededor del Control"), _ DisplayName("Tipo Focus")> _
    Public Property TipoFocus() As _TipoFocus
        Get
            Return _tipo
        End Get
        Set(value As _TipoFocus)
            _tipo = value
        End Set
    End Property
    <Description("Color Primario que aparecera al rededor del Control"), _ DisplayName("Color 1 Focus"), DefaultValue("Color.Red")> _
    Public Property ColorFocus1 As Color
        Get
            Return _color1
        End Get
        Set(value As Color)
            If Not value.IsEmpty Then
                _color1 = value
            Else
                _color1 = Color.Red
            End If
        End Set
    End Property
    <Description("Color Secundario que aparecera al rededor del Control"), DisplayName("Color 2 Focus"), DefaultValue("Color.Firebrick")> _
    Public Property ColorFocus2 As Color
        Get
            Return _color2
        End Get
        Set(value As Color)
            If Not value.IsEmpty Then
                _color2 = value
            Else
                _color2 = Color.Firebrick
            End If
        End Set
    End Property

    Public Enum _Activafocus
        SI
        NO
    End Enum
    Public Enum _TipoFocus
        SIMPLE
        INTERMITENTE
        NO
    End Enum
	

Ahora vamos a crear los metodos de la clase. Los cuales nos ayudara a crear las funcionalidades de este control.
El primer metodo es el mas importante, el cual nos servira para realizar el pintado del contorno del TEXTBOX.

Private Sub DrawRectangle(clr As Color)
        Dim d As Integer = 2
        Dim pt As New Point(Me.Location.X - d, Me.Location.Y - d)
        Dim sz As New Size(Me.Width + (2 * d), Me.Height + (2 * d))
        ' Formulario contenedor del control
        Dim frm As Control = Me.Parent
        If (Not frm Is Nothing) Then
            Using g As Graphics = frm.CreateGraphics
                Dim rect As New Rectangle(pt, sz)
                Dim p As New Pen(clr, 2)
                g.DrawRectangle(p, rect)
                p.Dispose()
            End Using
        End If
    End Sub
	

Ahora el metodo que nos ayudara a enviar el focus o cursor al siguiente control, ojo que debe estar espeficiado el orden de la tabulacion de los controles en el formulario. Recordemos que esto es como si fuera un tab.

Protected Overrides Function ProcessDialogKey(keyData As Keys) As Boolean
		'Se evalua si la opcion de ACTIVAR FOCUS ES "SI"
        If _focus = _Activafocus.SI Then
            'SE EVALUA SI LO QUE SE PRECIONA ES LA TECLA ENTER SI ES ASI, SE REALIZA EL TAB
            If CInt(keyData) = CInt(Keys.Enter) Then  'PUEDEN AÑADIR LA TECLA INTRO
                Return MyBase.ProcessDialogKey(Keys.Tab)
            Else
                ' SI NO SOLO DEJA PASAR LA TECLA PRESIOSANADA
                Return MyBase.ProcessDialogKey(keyData)
            End If
        End If
    End Function

Ahora tendremos que codificar la parte del efecto de cuando el focus o cursor esta en el TEXTBOXFOCUS o cuando se pierde dicho foco.

Protected Overrides Sub OnEnter(e As EventArgs)
        MyBase.OnEnter(e)
		' SE EVALUA QUE TIPO DE ESTILO DE FOCUS SE UTILIZARA
        If _tipo = _TipoFocus.INTERMITENTE Then ' SI ES INTERMITENTE, SE UTILIZARA EL TIMER
            focusTextBox()
            timerFocus.AutoReset = True
            timerFocus.Enabled = True
        ElseIf _tipo = _TipoFocus.SIMPLE Then ' SI ES SIMPLE SOLO SE COLOREARA UNA VEZ
            DrawRectangle(_color1)
        Else
            Dim frm As Control = Me.Parent ' SI ESTA DESACTIVADO SIMPLEMENTE SE PINTARA DEL MISMO FONDO DEL COLOR DEL FORMULARIO
            DrawRectangle(frm.BackColor)
        End If
    End Sub

    Protected Overrides Sub OnLeave(e As EventArgs)
        MyBase.OnLeave(e)
		' SI SE PIERDE EL FOCO PUES SE DETIENE TODO.
        If (Not timerFocus Is Nothing) Then
            timerFocus.Stop()
            timerFocus.Enabled = False
        End If
        ' Formulario contenedor del control
        Dim frm As Control = Me.Parent
        DrawRectangle(frm.BackColor)
    End Sub

    Private Sub focusTextBox()
		'ESTE METODO ESTA ENLAZADO AL TIMER PARA QUE SE DISPARE CUANDO ESTE FUNCIONE
        timerFocus = New System.Timers.Timer(500)
        AddHandler timerFocus.Elapsed, AddressOf OnTimedEvent
    End Sub
	Private Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
        c = c + 1
        If (c Mod 2) = 0 Then
            DrawRectangle(_color1)
        Else
            DrawRectangle(_color2)
        End If
    End Sub

3.- COMPILACIÓN

Bien ahora una vez finalizado, solo nos queda agregar esta clase a nuestro proyecto, compilar y agregarlo como referencia a nuestro proyecto windows form.
Cualquier consulta espero poder apoyarlos en sus consultas de los comentarios.
Y si te gusto el articulo calificalo y compartelo en tus redes soaciles. GRACIAS!

Shares