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!