Muchas veces los programadores nos hemos visto en la necesidad de indicar de forma más explicita, las tareas que se desea que el usuario realice en ciertos controles, como por ejemplo indicarle que debe ingresar algún texto en un TextBox, pues bien, hoy quiero presentarles el Text Box con Marca de agua, que permite diseñar un control reusble de TextBox, con la funcionalidad añadida de permitirnos (mediante el seteo de una propiedad) ingresar un texto de ayuda que indique al usuario qué se debe ingresar en dicho cuadro de texto, tal y como lo muestra la imagen adjunta al artículo, imagen que tome de un proyecto que desarrolle aquí en la institución en la que laboro, sin mas preámbulos vamos a codificar...
- Hacemos Clic, en el menú ARCHIVO/NUEVO/PROYECTO
- Seleccionamos en las Plantillas de C#, la plantilla Biblioteca de Clases, le damos un nombre y aceptamos la creación del Proyecto
- Eliminamos el componente que nos crea por omisión y agregamos uno nuestro, al que llamaremos TextBoxCue, para esto una vez eliminado el componente, hacemos clic derecho sobre el proyecto, y hacemos clic en AGREGAR/COMPONENTE, y abrimos el codigo
- Ahora bien lo primero que debemos hacer es agregar las siguientes referencias:
- using System;
- using System.ComponentModel;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- le indicamos al visual que la clase componente que vamos a extender, extiende del TextoBox esto lo hacemos en la declaración de la clase, de la siguiente forma:
- public partial class TextBoxConTextoDefault : TextBox
- para enviarle el mensaje a los controles de vamos a utilizar la siguiente constante de la API de Windows:
- private static uint EM_SETCUEBANNER = 0x1501;
- Asi mismo vamos a utilizar la libreria "user32.dll", y de esta la función SendMessage
- [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
- private static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, String lParam);
- Ahora vamos a declarar el atributo que seteara el mensaje a mostrar en el control
- private string _marcaAguaText = "Ingrese un Dato...";
- lo siguiente es la Propiedad que modificara y seteara el atributo:
- /// <summary>
- /// Obtiene o setea el texto <see cref="TextBox"/> que mostrará el texto ayuda al usuario.
- /// </summary>
- [Description("El Texto que se mostrará como ayuda al usuario.")]
- [Category("Appearance")]
- [DefaultValue("")]
- [Localizable(true)]
- public string MarcaAguaText
- {
- get { return _marcaAguaText; }
- set
- {
- if (value == null)
- {
- value = String.Empty;
- }
- if (!_marcaAguaText.Equals(value, StringComparison.CurrentCulture))
- {
- _marcaAguaText = value;
- UpdateCue();
- OnMarcaAguaTextChanged(EventArgs.Empty);
- }
- }
- }
- Definimos el evento que se disparará cuando la propiedad Text cambie y su Handler
- /// <summary>
- /// Ocurre cuando el valor de la propiedad de <see cref="MarcaAguaText"/> cambie.
- /// </summary>
- public event EventHandler MarcaAguaTextChanged;
- [EditorBrowsable(EditorBrowsableState.Advanced)]
- protected virtual void OnMarcaAguaTextChanged(EventArgs e)
- {
- EventHandler handler = MarcaAguaTextChanged;
- if (handler != null)
- {
- handler(this, e);
- }
- }
- Creamos la propiedad que permitirá en tiempo de diseño establecer, si queremos que la marca de agua se mantenga o no visible aun cuando el control tenga el enfoque
- private bool _mostrarMarcaAguaConEnfoque = false;
- /// <summary>
- ///Obtiene o setea un valor que indica si el <see cref="TextBox"/> mostrará la marca de agua, aun cuando el control tenga el enfoque
- /// </summary>
- [Description("Indica si el Control mostrará la marca de agua, aun cuando el control tenga el enfoque.")]
- [Category("Appearance")]
- [DefaultValue(false)]
- [Localizable(true)]
- public bool MostrarMarcaAguaConEnfoque
- {
- get { return _mostrarMarcaAguaConEnfoque; }
- set
- {
- if (_mostrarMarcaAguaConEnfoque != value)
- {
- _mostrarMarcaAguaConEnfoque = value;
- UpdateCue();
- OnMostrarMarcaAguaConEnfoqueChanged(EventArgs.Empty);
- }
- }
- }
- Generamos el evento que se disparará cuando se realice un cambio en la propiedad junto con su manejador
- /// <summary>
- /// Ocurre cuando la propiedad <see cref="MostrarMarcaAguaConEnfoque"/> cambia de valor.
- /// </summary>
- public event EventHandler MostrarMarcaAguaConEnfoqueChanged;
- [EditorBrowsable(EditorBrowsableState.Advanced)]
- protected virtual void OnMostrarMarcaAguaConEnfoqueChanged(EventArgs e)
- {
- EventHandler handler = MostrarMarcaAguaConEnfoqueChanged;
- if (handler != null)
- {
- handler(this, e);
- }
- }
- sobreescribimos el Manejador OnHandleCreated:
- protected override void OnHandleCreated(EventArgs e)
- {
- UpdateMensaje();
- base.OnHandleCreated(e);
- }
- y por ultimo creamos la función que envia el mensaje de actualización del mensaje al control:
- private void UpdateMensaje()
- {
- // Si el manejador no se ha creado
- // este sera llamado cuando sea creado
- if (this.IsHandleCreated)
- {
- SendMessage(new HandleRef(this, this.Handle), EM_SETCUEBANNER, (_mostrarMarcaAguaConEnfoque) ? new IntPtr(1) : IntPtr.Zero, _marcaAguaText);
- }
- }
Bien, con esto hemos completado la creación de nuestro control, ahora solo nos queda agregar la dll a nuestros proyectos, agregar el elemento a la barra de herramientas y empezar a disfrutar de este control, hasta un nuevo POST...chaop...
homeicaro@hotmail.com
homeicaro@hotmail.com
Me sirvió mucho en mi proyecto.. es un claro ejemplo de la reutilización de código a través de las dll.
ResponderEliminarSaludos y gracias por tu aporte.
Buen Post amigo...
ResponderEliminarUna alternativa muy buena para que el usuario observe que es lo que debe de ingresar y como debe ingresarlo. Buen aporte...
ResponderEliminarBuen post, sigue aportando con estos temas..!
ResponderEliminarPrueba de correo deshabilitado
ResponderEliminarMi sirvió de maravilla, muchas gracias.
ResponderEliminar