En este post os voy a explicar como crear un textbox con efecto sombra.
El efecto sombra es un texto que explica para que sirve el textbox o que debe incluir en él, en la siguiente figura podéis ver un textbox con efecto sombra y otro que no lo tiene.
Si nuestro segundo textbox se convierte en el foco de la aplicación, la fuente y el color se convertirán a la del primero y el texto estará en blanco. Si una vez perdido el foco el cuadro de texto está vacío este se volverá a convertir en la sombra. En caso de no estar vacio se mantiene con lo que el usuario a escrito.
Lo primero que debemos hacer es crear un control de usuario que llamaremos AdvancedTextbox.
Una vez que este creado vamos al código del diseñador, AdvancedTextbox.Designer.vb (debemos activar la opción Mostrar todos los archivos del explorador de soluciones para poder verlo).
En la línea 2 eliminamos esto:
Inherits System.Windows.Forms.UserControl
Y lo cambiamos por esto:
Inherits System.Windows.Forms.TextBox
Con eso nuestro control de usuario pasa de ser heredado de System.Windows.Forms.UserControl, por System.Windows.Forms.Textbox.
Ahora ya tenemos nuestro control de usuario exactamente igual que el Textbox de .NET, ahora tendremos que darle personalidad a nuestro textbox “avanzado”.
Para ello vamos al código de nuestro textbox y añadimos el siguiente código (he comentado todo el código para su fácil lectura):
1 Public Class AdvancedTextbox
2
3 'Variable que guardará la fuente para el texto normal
4 Private _defaultFont As Font = Me.Font
5 'Al igual que la anterior esta guarda el color
6 Private _defaultColor As Color = Me.ForeColor
7 'Y este es el texto que tendrá la sombra
8 Private _defaulttext As String
9
10 'Con esta propiedad vamos a cambiar el texto de la sombra
11 Property DefaultText() As String
12 Get
13 'Retornamos el texto que tenemos guardado
14 Return _defaulttext
15 End Get
16 Set(ByVal value As String)
17 'Comprobamos si ya se está mostrando la sombra
18 If Me.Text = "" Or Me.Text = _defaulttext Then
19 'De ser así le cambiamos al nuevo texto
20 Me.Text = value
21 'Ponemos la fuente de la sombra
22 Me.Font = New Font(_defaultFont, FontStyle.Italic)
23 'Y también ponemos el color de la sombra
24 Me.ForeColor = Color.Gray
25 End If
26 'Por último guardamos el nuevo valor
27 _defaulttext = value
28 End Set
29 End Property
30
31 'Ahora se debe poner automáticamente la sombra
32
33 'Para ello, cuando AdvancedTextbox obtenga el foco quitamos la sombra
34 Private Sub AdvancedTextbox_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter
35 'Comprobamos si tiene la sombra
36 If Me.Text = DefaultText Then
37 'De ser así, vaciamos el textbox
38 Me.Text = ""
39 'Establecemos la fuente predeterminada
40 Me.Font = _defaultFont
41 'Y el color predeterminado
42 Me.ForeColor = _defaultColor
43 End If
44 End Sub
45
46 'En caso de perder el foco
47 Private Sub AdvancedTextbox_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
48 'Si está vacio el textbox
49 If Me.Text = "" Then
50 'Establecemos el texto de la sombra
51 Me.Text = _defaulttext
52 'Establecemos la fuente de la sombra
53 Me.Font = New Font(_defaultFont, FontStyle.Italic)
54 'Y su respectivo color
55 Me.ForeColor = Color.Gray
56 End If
57 End Sub
58
59 'Al cambiar el texto debemos asegurarnos de que se muestre o no la sombra
60 Private Sub AdvancedTextbox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.TextChanged
61 'Por eso cuando el texto cambie validaremos su contenido
62 If Me.Text = _defaulttext Then
63 'Si es igual al texto de la sombra
64 'cambiamos su fuente y su color al de la sombra
65 Me.Font = New Font(_defaultFont, FontStyle.Italic)
66 Me.ForeColor = Color.Gray
67 'En caso de estar vacio cambiamos su texto le damos el foco
68 'Asi conseguimos que solo este vacio cuando tenga el foco
69 ElseIf Me.Text = "" Then
70 Me.Focus()
71 Else
72 'Por último al no estar vacío ni contener el texto de la sombra
73 'Establecemos la fuente y el color predeterminados
74 Me.Font = _defaultFont
75 Me.ForeColor = _defaultColor
76 End If
77 End Sub
78 End Class
79
Debido a que es la primera versión de este código ciertas propiedades, como por ejemplo Font y ForeColor no se pueden cambiar, siendo necesario su cambio en las variables privadas de la clase.
Las pruebas que he hecho has sido satisfactorias, pero, como ya sabréis, si es el programador el propio tester no suele tener problemas, ya que lo usa para lo que lo ha hecho, deberia testearlo otra persona.
Si os animáis a probarlo no dudeis en comentar vuestras opiniones y si no, siempre podéis comentar lo que queráis[:P]