Hola como están.
Mi siguiente duda estoy tratado de hacer algo en un textbox que tenga un texto predeterminado pero que este se vea claro, de la siguiente forma.
(http://www.telerik.com/help/winforms/media/editors-textbox-overview001.png)
Como ven en user name y cuando se de click se quite ese texto y pueda ingresar datos.
Estaba leyendo MSDN pero son demasiadas funciones las que tiene me llevara un tiempo leerlas todas.
Espero puedan ayudarme gracias y saludos
PD: estoy trabajando en VB
Bueno yo en C++ aún no hice este tipo de formularios, pero te digo:
Ese texto es el "Placeholder".
MSDN-Textbox.placeholdertext (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.textbox.placeholdertext)
Cita de: ivancea96 en 21 Abril 2014, 01:22 AM
Bueno yo en C++ aún no hice este tipo de formularios, pero te digo:
Ese texto es el "Placeholder".
MSDN-Textbox.placeholdertext (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.textbox.placeholdertext)
Eso es si está trabajando con XAML, que no creo que sea el caso.
Por la pinta de ese formulario, yo diría que está trabajando con los controles nativos de .NET... lo que no queda claro es con qué versión.
En este caso, una opción sencilla es controlar los eventos de "foco" del control.
Lo suyo es crear una clase que derive de "TextBox" y controle los eventos de "foco", de tal forma que:
* si el control pierde el foco y no tiene contenido, se escriba ese texto en el fondo ( puedes empezar por hacer una versión sencilla escribiendo el contenido en su propiedad "Text" y cambiar el color de la fuente por un gris ).
* al recibir el foco el control, si su contenido es éste que tiene por defecto, se borre su contenido, permitiéndole al usuario una entrada limpia.
Este comportamiento es muy básico y se puede perfeccionar, por supuesto, pero como base sirve.
Mil gracias por contestar como siempre la los que se toman la molestia de contestar y alos que pasan por si pueden ayudar.
Bueno he estado investigando y viendo algunos videos
este es el codigo que tengo y lo estoy haciendo en una clase
Public Class MarcaDeAgua
Iterator TextBox
Dim MarcaDeAguatxt As String = "Por defecto"
Dim MarcaDeAguaclr As Color = Color.LightGray
Public Property MarcaDeAguaText() As String
Get
Return MarcaDeAguatxt
End Get
Set(value As String)
MarcaDeAguatxt = value
End Set
End Property
Public Property MarcaDeAguaColor() As Color
Get
Return MarcaDeAguaclr
End Get
Set(value As Color)
MarcaDeAguaclr = value
End Set
End Property
Private Sub MarcaDeAgua_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If Me.Text = MarcaDeAguatxt Then
Me.SelectionStar = 0
End If
End Sub
Private Sub MarcaDeAguaTextBox_KeyDown(ByVal sender As Object, ByVal e As System.EventArgs)
If e.KeyCode = 8 Then
If Me.Text. = MarcaDeAguatxt then
If Me.SelectionStar = Me.Text.Length Then
Me.SelectionStar = 0
End If
End If
End Sub
Private Sub MarcaDeAguaTextBox_KeyUp(ByVal sender As Object, ByVal e As System.EventArgs)
If Me.Text.Contains(MarcaDeAguatxt) Then
Me.Text = Remplace(Me.Text, MarcaDeAguatxt, "")
Me.SelectionStar() = Me.MarcaDeAguaText.Length
End If
End Sub
Private Sub MarcaDeAguaTextBox_ParentChange(ByVal sender As Object, ByVal e As System.EventArgs)
Me.SelectionStar() = 0
End Sub
Private Sub MarcaDeAguaTextBox_TextChange(ByVal sender As Object, ByVal e As System.EventArgs)
If Me.Text = MarcaDeAguatxt Then
Me.Font = New Font(Me.Font, FontStyle.Italic)
Me.ForeColor = MarcaDeAguaclr
Else
Me.Font = New Font((Me.Font, FontStyle.Style)
Me.ForeColor = Color.Black
End If
If Me.Text = "" Then
Me.Text = MarcaDeAguatxt
End If
End Sub
End Class
La idea es de aca pero no me sale.
https://www.youtube.com/watch?v=2sziyeOS8Ko (https://www.youtube.com/watch?v=2sziyeOS8Ko)
Aca una imagen de lo que tengo
(http://3.bp.blogspot.com/-AaC4lJPZH5o/U1UBZCz9TjI/AAAAAAAAAqs/Lv_XpXt8FcU/s1600/Forosdf.png)
disculpen si se ve mal estoy a la carrera
saludos y muchas gracias de nuevo
Con ese código estás haciendo que la marca de agua aparezca siempre que no haya texto en el control... es un tratamiento más refinado pero da más problemas.
En teoría con la gestión del foco te debería servir... además no tendrías que lidiar con las pulsaciones del teclado... con la opción "pegar" del menú contextual... etc.
Si quieres seguir con tu idea de que sea sensible al contenido del TextBox en edición quizás sería más sencillo "pintar" la marca de agua en el evento OnPaint en vez de pasarla al Text... la ventaja que consigues es que no saltan eventos cada vez que pones / quitas la marca de agua y no tienes que preocuparte por la posición del "caret".
' Set Control Hint
' ( By Elektro )
''' <summary>
''' Indicates the Textbox Hint.
''' </summary>
Private ReadOnly TextBoxHint As String = "I'm a control hint."
''' <summary>
''' Handles the Hint event of the TextBox control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
Private Sub TextBox_Leave(ByVal sender As Object, ByVal e As EventArgs) Handles _
TextBox1.Leave, TextBox1.HandleCreated
Select Case CStr(sender.Text)
Case Is = TextBoxHint
sender.text = String.Empty
Case Is = String.Empty
sender.text = TextBoxHint
End Select
End Sub
''' <summary>
''' Handles the Enter event of the TextBox control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
Private Sub TextBox_Enter(ByVal sender As Object, ByVal e As EventArgs) Handles _
TextBox1.Enter
Select Case CStr(sender.Text)
Case Is = TextBoxHint
sender.text = String.Empty
End Select
End Sub
O usando API's:
' Set Control Hint
' ( By Elektro )
'
' Usage Examples:
' SetControlHint(TextBox1, "I'm a text hint.")
''' <summary>
''' Messages to send to an Edit control, such a TextBox.
''' </summary>
Private Enum EditControlMessages As Integer
''' <summary>
''' Sets the textual cue, or tip, that is displayed by the edit control to prompt the user for information.
''' http://msdn.microsoft.com/en-us/library/windows/desktop/bb761639%28v=vs.85%29.aspx
''' </summary>
SetCueBanner = &H1501I
End Enum
''' <summary>
''' Sends the specified message to a window or windows.
''' The SendMessage function calls the window procedure for the specified window
''' and does not return until the window procedure has processed the message.
''' http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx
''' </summary>
''' <param name="hWnd">
''' A handle to the Control whose will receive the message.
''' </param>
''' <param name="msg">
''' The message to be sent.
''' </param>
''' <param name="wParam">
''' Additional message-specific information.
''' </param>
''' <param name="lParam">
''' Additional message-specific information.
''' </param>
''' <returns>
''' The return value specifies the result of the message processing; it depends on the message sent.
''' </returns>
<System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SendMessage",
CharSet:=System.Runtime.InteropServices.CharSet.Auto)>
Private Shared Function SendEditControlMessage(
ByVal hWnd As IntPtr,
ByVal msg As EditControlMessages,
ByVal wParam As IntPtr,
<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)>
ByVal lParam As String
) As UInteger
End Function
''' <summary>
''' Sets a text hint for an edit control such a TextBox.
''' </summary>
''' <param name="Control">Indicates the control.</param>
''' <param name="Hint">Indicates the text hint.</param>
''' <returns><c>true</c> if operation succeeds, <c>false</c> otherwise.</returns>
Private Function SetControlHint(ByVal [Control] As Control,
ByVal Hint As String) As Boolean
Return SendEditControlMessage([Control].Handle, EditControlMessages.SetCueBanner, IntPtr.Zero, Hint)
End Function
Saludos.
Gracias por responder a todos estoy probando lo que me comento eferion y ahi voy solo me falta probar lo de Eleкtro muchas gracias de nuevo saludos a todos.
Esto lo acabo de escribir para reemplazar a los dos métodos que te proporcioné antes y extender su funcionalidad,
es un ayudante (una helper class) bastante personalizable para asignar/eliminar hints/watermarks a los controles.
EDITO: Código Actualizado
' ***********************************************************************
' Author : Elektro
' Last Modified On : 04-22-2014
' ***********************************************************************
' <copyright file="ControlHintHelper.vb" company="Elektro Studios">
' Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************
#Region " Imports "
Imports System.Reflection
#End Region
''' <summary>
''' Helper Class that manages text-hints for Edit controls.
''' </summary>
Friend NotInheritable Class ControlHintHelper
#Region " Object members "
''' <summary>
''' Collection of currentlly handled controls and it's text-hint properties.
''' </summary>
Public Shared ControlHints As New Dictionary(Of Control, HintProperties)
''' <summary>
''' Collection of currentlly handled controls and it's default property values.
''' </summary>
Private Shared ControlHintsDefaults As New Dictionary(Of Control, HintProperties)
#End Region
#Region " Properties "
''' <summary>
''' Determines a text-hint and it's personalization properties.
''' </summary>
Public Class HintProperties
''' <summary>
''' Gets or sets the text-hint type.
''' </summary>
''' <value>The Hint type.</value>
Public Property HintType As HintType = ControlHintHelper.HintType.Normal
''' <summary>
''' Gets or sets the text-hint.
''' </summary>
''' <value>The hint-text.</value>
Public Property Text As String = String.Empty
''' <summary>
''' Gets or sets the text-hint font.
''' </summary>
''' <value>The text font.</value>
Public Property Font As Font = Nothing
''' <summary>
''' Gets or sets the text-hint color.
''' </summary>
''' <value>The text color.</value>
Public Property ForeColor As Color = Color.Empty
End Class
#End Region
#Region " Enums "
''' <summary>
''' Specifies the posssible Hint types.
''' </summary>
Public Enum HintType As Integer
''' <summary>
''' The Hint is removed when the Control gets focus.
''' </summary>
Normal = 0
''' <summary>
''' The Hint is not removed when the Control gets focus.
''' </summary>
Persistent = 1
End Enum
#End Region
#Region " Constructors "
''' <summary>
''' Prevents a default instance of the <see cref="ControlHintHelper" /> class from being created.
''' </summary>
Private Sub New()
End Sub
#End Region
#Region " Public Methods "
''' <summary>
''' Sets a new text-hint for an specific control.
''' </summary>
''' <param name="Control">Indicates the control.</param>
''' <param name="HintProperties">TheIndicates the text-hint properties.</param>
''' <exception cref="Exception">Text hint can't be null or empty.</exception>
Public Shared Sub SetHint(ByVal [Control] As Control,
ByVal [HintProperties] As HintProperties)
' Ensure and fix empty hint properties.
With [HintProperties]
If String.IsNullOrEmpty(.Text) Then
Throw New Exception("Text hint can't be null or empty.")
Exit Sub
End If
If .Font Is Nothing Then
.Font = GetPropertyValue([Control], "Font")
End If
If .ForeColor = Color.Empty Then
.ForeColor = GetPropertyValue([Control], "ForeColor")
End If
End With
' Set the default control property values to restore them when needed.
Dim Deaults As New HintProperties
With Deaults
.Text = String.Empty
.Font = GetPropertyValue([Control], "Font")
.ForeColor = GetPropertyValue([Control], "ForeColor")
End With
' Ready to handle the Control.
Select Case ControlHints.ContainsKey([Control])
Case True ' Control-hint is already set and handled.
' Just replace the new hint properties in the collection.
ControlHints([Control]) = [HintProperties]
Case False ' Control-hint is not set.
' Add the hint properties into collections.
ControlHints.Add([Control], [HintProperties])
ControlHintsDefaults.Add([Control], Deaults)
With [Control]
' Remove previouslly handled events (if any).
RemoveHandler .HandleCreated, AddressOf Control_HandleCreated
RemoveHandler .Enter, AddressOf Control_Enter
RemoveHandler .Leave, AddressOf Control_Leave
RemoveHandler .Disposed, AddressOf Control_Disposed
RemoveHandler .MouseDown, AddressOf Control_MouseDown
RemoveHandler .KeyDown, AddressOf Control_KeyDown
' Start handling the control events.
AddHandler .HandleCreated, AddressOf Control_HandleCreated
AddHandler .Enter, AddressOf Control_Enter
AddHandler .Leave, AddressOf Control_Leave
AddHandler .Disposed, AddressOf Control_Disposed
AddHandler .MouseDown, AddressOf Control_MouseDown
AddHandler .KeyDown, AddressOf Control_KeyDown
End With
End Select
End Sub
''' <summary>
''' Sets a new text-hint for various controls.
''' </summary>
''' <param name="Controls">Indicates the controls.</param>
''' <param name="HintProperties">TheIndicates the text-hint properties.</param>
Public Shared Sub SetHint(ByVal Controls As Control(),
ByVal [HintProperties] As HintProperties)
For Each [Control] As Control In Controls
SetHint([Control], [HintProperties])
Next [Control]
End Sub
''' <summary>
''' Removes a text-hint from a control.
''' </summary>
''' <param name="Control">Indicates the control.</param>
Public Shared Sub RemoveHint(ByVal [Control] As Control)
Select Case ControlHints.ContainsKey([Control])
Case True ' Control-hint is already set.
' Remove events from event handlers.
With [Control]
RemoveHandler .HandleCreated, AddressOf Control_HandleCreated
RemoveHandler .Enter, AddressOf Control_Enter
RemoveHandler .Leave, AddressOf Control_Leave
RemoveHandler .Disposed, AddressOf Control_Disposed
RemoveHandler .MouseDown, AddressOf Control_MouseDown
RemoveHandler .KeyDown, AddressOf Control_KeyDown
End With
If Not [Control].IsDisposed Then ' If the Control is not disposed then...
If [Control].Text.Trim = ControlHints([Control]).Text.Trim Then
' Restore it's default property values and clear the control text.
RestoreProperties([Control], ControlHintsDefaults([Control]))
Else
' Restore it's default property values and skip the control text.
RestoreProperties([Control], ControlHintsDefaults([Control]), SkipProperties:={"Text"})
End If
End If
' Remove the control-hints from hints collections.
ControlHints.Remove([Control])
ControlHintsDefaults.Remove([Control])
End Select
End Sub
''' <summary>
''' Removes a text-hint from a control.
''' </summary>
''' <param name="Controls">Indicates the controls.</param>
Public Shared Sub RemoveHint(ByVal Controls As Control())
For Each [Control] As Control In Controls
RemoveHint([Control])
Next [Control]
End Sub
#End Region
#Region " Private Methods "
''' <summary>
''' Gets the property value of an specific control through reflection.
''' </summary>
''' <param name="Control">Indicates the Control.</param>
''' <param name="PropertyName">Indicates the name of the property to get it's value.</param>
''' <returns>If the property is not found on the Control, the return value is 'Nothing',
''' Otherwise, the return value is the Control's property value.</returns>
Private Shared Function GetPropertyValue(ByVal [Control] As Control,
ByVal PropertyName As String) As Object
Dim Prop As PropertyInfo = [Control].GetType.GetProperty(PropertyName)
Select Case Prop Is Nothing
Case True
Return Nothing
Case Else
Return Prop.GetValue([Control], Nothing)
End Select
End Function
''' <summary>
''' Sets the properties of an specific control.
''' </summary>
''' <param name="Control">Indicates the Control.</param>
''' <param name="HintProperties">Indicates the properties to set it's values.</param>
''' <param name="SkipProperties">Indicates the properties to skip.</param>
Private Shared Sub SetProperties(ByVal [Control] As Object,
ByVal HintProperties As HintProperties,
Optional ByVal SkipProperties As String() = Nothing)
' Get the control type.
Dim ControlType As Type = [Control].GetType
Dim ExcludeProperties As String() = If(SkipProperties Is Nothing, {""}, SkipProperties)
' Loop through the 'HintProperties' properties to determine whether exist all the needed properties in the Control.
For Each HintProperty As PropertyInfo In HintProperties.GetType.GetProperties
Dim ControlProperty As PropertyInfo = ControlType.GetProperty(HintProperty.Name)
If Not ControlProperty Is Nothing AndAlso Not ExcludeProperties.Contains(ControlProperty.Name) Then
ControlProperty.SetValue([Control], HintProperty.GetValue(HintProperties, Nothing), Nothing)
End If
Next HintProperty
End Sub
''' <summary>
''' Restores the properties of an specific control.
''' </summary>
''' <param name="Control">Indicates the Control.</param>
''' <param name="DefaultProperties">Indicates the properties to reset it's values.</param>
''' <param name="SkipProperties">Indicates the properties to skip.</param>
Private Shared Sub RestoreProperties(ByVal [Control] As Object,
ByVal DefaultProperties As HintProperties,
Optional ByVal SkipProperties As String() = Nothing)
Dim ExcludeProperties As String() = If(SkipProperties Is Nothing, {""}, SkipProperties)
' Get the control type.
Dim ControlType As Type = [Control].GetType
' Loop through the 'DefaultProperties' properties to determine whether exist all the needed properties in the Control.
For Each DefaultProperty As PropertyInfo In DefaultProperties.GetType.GetProperties.Reverse
Dim ControlProperty As PropertyInfo = ControlType.GetProperty(DefaultProperty.Name)
If Not ControlProperty Is Nothing AndAlso Not ExcludeProperties.Contains(ControlProperty.Name) Then
ControlProperty.SetValue([Control], DefaultProperty.GetValue(DefaultProperties, Nothing), Nothing)
End If
Next DefaultProperty
End Sub
#End Region
#Region "Event Handlers "
''' <summary>
''' Handles the HandleCreated event of the Control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
Private Shared Sub Control_HandleCreated(ByVal sender As Object, ByVal e As EventArgs)
Dim [Control] As Control = DirectCast(sender, Control)
Dim [HintProperties] As HintProperties = ControlHints([Control])
SetProperties([Control], [HintProperties])
End Sub
''' <summary>
''' Handles the Enter event of the Control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
Private Shared Sub Control_Enter(ByVal sender As Object, ByVal e As EventArgs)
Dim [Control] As Control = DirectCast(sender, Control)
Dim [HintProperties] As HintProperties = ControlHints([Control])
Select Case [HintProperties].HintType
Case HintType.Normal
If [Control].Text.Trim = [HintProperties].Text.Trim Then ' Restore it's default values.
RestoreProperties([Control], ControlHintsDefaults([Control]))
End If
End Select
End Sub
''' <summary>
''' Handles the Leave event of the control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
Private Shared Sub Control_Leave(ByVal sender As Object, ByVal e As EventArgs)
Dim [Control] As Control = DirectCast(sender, Control)
Dim [HintProperties] As HintProperties = ControlHints([Control])
Select Case [HintProperties].HintType
Case HintType.Normal
Select Case [Control].Text.Trim
Case Is = [HintProperties].Text.Trim ' Restore it's default values.
RestoreProperties([Control], ControlHintsDefaults(sender))
Case Is = String.Empty ' Set the hint values.
SetProperties([Control], [HintProperties])
End Select
Case HintType.Persistent
Select Case [Control].Text.Trim
Case Is = String.Empty ' Set the hint values.
SetProperties([Control], [HintProperties])
End Select
End Select
End Sub
''' <summary>
''' Handles the MouseDown event of the control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="MouseEventArgs" /> instance containing the event data.</param>
Private Shared Sub Control_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
Dim [Control] As Control = DirectCast(sender, Control)
Dim [HintProperties] As HintProperties = ControlHints([Control])
Select Case [HintProperties].HintType
Case HintType.Persistent
If [Control].Text.Trim = [HintProperties].Text.Trim Then
' Get the 'Select' Control's Method (if exist).
Dim Method = sender.GetType.GetMethod("Select",
BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod,
Nothing,
{GetType(Integer), GetType(Integer)},
Nothing)
If Not Method Is Nothing Then ' Select the zero length.
Method.Invoke(sender, {0I, 0I})
End If
End If
End Select
End Sub
''' <summary>
''' Handles the KeyDown event of the Control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="KeyEventArgs"/> instance containing the event data.</param>
Private Shared Sub Control_KeyDown(sender As Object, e As KeyEventArgs)
Dim [Control] As Control = DirectCast(sender, Control)
Dim [HintProperties] As HintProperties = ControlHints([Control])
Select Case [HintProperties].HintType
Case HintType.Persistent
Select Case [Control].Text.Trim
Case Is = [HintProperties].Text.Trim ' Restore the control values.
RestoreProperties([Control], ControlHintsDefaults([Control]))
Case Is = String.Empty
RestoreProperties([Control], ControlHintsDefaults([Control]), SkipProperties:={"Text"})
End Select
Case HintType.Normal
Select Case [Control].Text.Trim
Case Is = String.Empty ' Restore the control values.
RestoreProperties([Control], ControlHintsDefaults([Control]))
Case Else
' Do nothing.
End Select
End Select
End Sub
''' <summary>
''' Handles the Disposed event of the control.
''' </summary>
''' <param name="sender">The source of the event.</param>
''' <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
Private Shared Sub Control_Disposed(ByVal sender As Object, ByVal e As EventArgs)
RemoveHint(DirectCast(sender, Control))
End Sub
#End Region
End Class
Ejemplo de uso:
Public Class Form1
''' <summary>
''' Initializes a new instance of the <see cref="Form1"/> class.
''' </summary>
Public Sub New()
' This call is required by the designer.
InitializeComponent()
ControlHintHelper.SetHint(TextBox1, New ControlHintHelper.HintProperties With {
.HintType = ControlHintHelper.HintType.Persistent,
.Text = "I'm a persistent hint.",
.ForeColor = Color.Gray})
ControlHintHelper.SetHint({TextBox2, TextBox3}, New ControlHintHelper.HintProperties With {
.Text = "I've set this hint on multiple controls at once!",
.ForeColor = Color.Gray})
ControlHintHelper.SetHint(RichTextBox1, New ControlHintHelper.HintProperties With {
.Text = "Write something here...",
.Font = New Font("lucida console", 15),
.ForeColor = Color.YellowGreen})
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ControlHintHelper.RemoveHint(TextBox1)
ControlHintHelper.RemoveHint({RichTextBox1})
End Sub
End Class
Hola primera mente.
Como siempre digo hay que agradecer a el grupo de personas que se toman el tiempo de ver y aun más a los que se toman el tiempo de ayudar a otro.
Muchas gracias.
Dicho esto estoy ya estudiando el código que tuviste la gentileza de compartir y tratando de entender muchas cosas que desconozco, también trate de probar lo que me comento eferion de la gestiones de foco probé une ejemplo que está en msdn y no me funciono no sé si será por la versión del VB pero me tiraba errores por todos lados.
Nota: La gestión de foco si no me equivoco hacia relación al Gotfocus y LostFocus si no me equivoco.
Con el código que comparte Eleкtro solo tienen que crear una clase y funciona de maravilla.
Acá la prueba y como el mismo menciona muy muy modificable.
(http://2.bp.blogspot.com/--bN7EY7Xs44/U1Yxp7S8DEI/AAAAAAAAAq8/39uMroYp124/s1600/ForoMarca.png)
Solo me falta agradecer de nuevo y para los curiosos esto va genial ya que hay poca información en cuanto a las marcas de agua
Saludos a todos y un ;-) para todos los que ayudan a los demás. Cuídense.
PD: pueden recomendarme alguna pagina o libro que trate este tipo cosas se que parece meramente estetica pero aveces no lo son. Saludos.
Cita de: nolasco281 en 22 Abril 2014, 11:29 AMDicho esto estoy ya estudiando el código que tuviste la gentileza de compartir y tratando de entender muchas cosas que desconozco
El código podría ser MUCHO más sencillo ...muchisimo más, pero decidí usar
Reflection para compatibilizar la propiedad
TextAlign con otros controles de los que carecen de dicha propiedad y otros usan una enumeración distinta (de todas formas la propiedad al final decidí eliminar del código porque me estaba dando por culo al intentar restaurar el valor original del control al suscribirme al evento
KeyDown del Textbox y quedaba un efecto muy feo xD), y también para los controles que no tuvieran propiedades como Font, Forecolor, etc...
A raíz de usar
Reflection lo bueno es que los métodos
SetProperties y RestoreProperties son bastante dinámicos y para extender la funcionalidad de la Class en general solo deberías añadir más nombres de propedades en la (sub)Class "HintProperties", y usar el parámetro
SkipProperties al llamar a los métodos
SetProperties/RestoreProperties (en caso de que sea necesario omitir alguna propiedad).
Eso sí, no le añadí ningún
Error-Handling (try/catch) ya que creo haber tenido todos los posibles conflictos en cuenta, mientras la Class se use con controles nativos de .NET framework no debería saltar ninguna excepción (espero que no).
¿Información sobre watermarks en controles?, no sabría decirte... tampoco yo creo que existe mucha documentación al respecto, puedes buscar y estudiar otros sources aquí: http://www.google.com/search?q=codeproject+control+watermark&ie=utf-8&oe=utf-8&lr=lang_en#lr=lang_en&q=codeproject+control+watermark&safe=active&tbs=lr:lang_1en hay varios métodos para hacerlo (por ejemplo, con Brushes)
Saludos!
Gracias por toda la ayuda proporcionada.
Saludos y muchisimas gracias.