none
VB2010 4.0 - Como crear un textbox personalizado

Answers

  • Hola Marco,

    pase revisando y veo que aun no hay respuesta de tu parte sobre esta consulta, no se si lo lograstes hacer, pero aqui te dejo un projecto de prueba para que lo revises.

    te explico:

    si hacemos un acercamiento podremos ver mejor los bordes del cuadro de texto que has puesto de ejemplo

    en si, el TextBox como otros controles tiene un Non-Client Area de 2 pixeles (Top, Right, Bottom, Left) donde se dibuja el borde del Control

    como podemos notar en la imagen, si cambiamos la propiedad BackColor del control a un color diferente que nos permita notar esta area de los bordes nos daremos cuenta. Area de bordes marca en rojo.

    bien... el Link que te pase, en si es para un formulario, pero como lo necesitamos para un TextBox podemos hacer caso omiso de mucho código, no es necesario calcular el Non-Client Area ya que según veras el código en el projecto que te paso, el Message que usamos para cambiar el Borde es WM_NCPAINT

    dejamos que el control nos provea el non-client area por default y lo que hacemos es saber con un Flag cuando pintar el borde como nosotros quedramos.

    he leido las sugerencias de otros, lo que sugieren es cambiar la propiedad BorderStyle a None para poder dibujar los bordes que es identico a lo que he hecho en este projecto (aún que no llegue a probarlo de esa manera), pero no es igual ya que si queres usar los bordes por default lo podemos hacer facilmente.

    lo primero es sobre escribir el Metodo WndProc del TextBox, con el objetivo de intersectar el Mensaje WM_NCPAINT.

     

      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    
        Select Case m.Msg
          Case NativeMethods.WM_NCPAINT
            WmNCPaint(m)
          Case Else
            MyBase.WndProc(m)
        End Select
    
      End Sub
    

     


    si lo dejamos de esta manera

     

      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    
        Select Case m.Msg
          Case NativeMethods.WM_NCPAINT
            WmNCPaint(m)
        End Select
    
        MyBase.WndProc(m)
    
      End Sub
    

     


    el control dijubara su propio borde, sobreescribiendo el nuestro, cosa que no queremos, solo si asi lo deceamos, pero esto ya estaria condicionado en el metodo WmNCPaint()

    ejemplo:

     

      Private Sub WmNCPaint(ByVal m As Message)
    
        If Not UseCustomBorder Then
    
          MyBase.WndProc(m)
          Exit Sub
    
        End If
    
        ' Paint custom border
        End If
    
      End Sub
    
    

     


    UseCustomBorder es una propieda que he puesto en el control TextBox personalizado para poder seleccionar entre pintar nuestro propio borde o usar el borde del control.

    ya en funcionamiento podremos ver:

    y un acercamiento al nuevo borde del control:

    quedando así a tu entera disposición sobre cualquier duda que llegaras a tener.

    Salu2


    Marvin E. Pineda

    ComboBoxMultiColumns

    NetBarControl

     

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Tuesday, June 21, 2011 9:40 PM
    Moderator

All replies

  • pero en la imagen no se ve diferencia a un textbox comun

    que tiene de personalizado ?

     

    para crear un control custom podrias empezar con una clase que herede de un TextBox comun

     

    Public Class CustomTextBox Inherits TextBox

    End Class

    si compilas veras que en la toolbox aparecera el control

    despues de aqui puedes agregar propiedades sobreescribir la funcionalidad existente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Sunday, June 12, 2011 12:29 AM
  • "Leandro Tuttini" escribió:

    > para crear un control custom podrias empezar con una
    > clase que herede de un TextBox comun
    >
    > Public Class CustomTextBox Inherits TextBox
    >
    > End Class

    ¡Ay con las prisas por responder! Mejor así:

       Public Class CustomTextBox : Inherits TextBox

       End Class

    O también:

       Public Class CustomTextBox

           Inherits TextBox

       End Class

     

     


    Enrique Martínez
      [MS MVP - VB]


    Sunday, June 12, 2011 2:11 PM
    Moderator
  • Tengo problemas para crear mi textbox, mi idea es personalizar el borde del control que tenga un color particular:

     

    Imports System.Windows.Forms.TextBox
    Imports System.ComponentModel
    
    Public Class UITextBox
      Inherits UserControl
    
      Private _BorderColor As System.Drawing.Color = Color.FromArgb(141, 178, 227)
    
      ''' <summary>Gets or sets the color of the control's border.</summary>
      <Category("Appearance"), Description("This feature will allow you to change the color of the control's border.")> _
      Public Property BorderColor() As System.Drawing.Color
        Get
          Return _BorderColor
        End Get
        Set(ByVal value As System.Drawing.Color)
          _BorderColor = value
          Invalidate()
        End Set
      End Property
    
      Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
    
        'Agregue su código personalizado de dibujo aquí
      End Sub
    
      Public Sub New()
    
        SetStyle(ControlStyles.ResizeRedraw, True)
        SetStyle(ControlStyles.Selectable, False)
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        SetStyle(ControlStyles.SupportsTransparentBackColor, True)
    
        ' Llamada necesaria para el diseñador.
        InitializeComponent()
    
        Me.SuspendLayout()
        '
        'UIGroupBox
        '
        Me.Name = "UITextBox"
        Me.ResumeLayout(False)
        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
      End Sub
    End Class
    

     

    Sunday, June 12, 2011 4:01 PM
  • porque haces heredar el control que creas directo de UserControl y no de TextBox ?

    pienso que seria mas simple si lo harias desde un control existente

    Public Class UITextBox  

        Inherits TextBox

    End Class

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Sunday, June 12, 2011 5:35 PM
  • Hola Marco,

    esta no es una tarea facil, tampoco dificil, hay que indagar mucho, probar codigo, aprender a usar el diccionario Google para saber buscar... pero bien aqui te voy a dejar un Link donde explican como hacer lo que quieres hacer, ahora!!!.. esta en C# pero si lo traduces bien a VB creeme que con este Link puedes hacer mucho más que eso que quieres hacer.

    Drawing Custom Borders in Windows Form

    no te dejes engañar por el titulo... ya que un TextBox es una ventana... osea... aplica tambien para un TextBox... buscando para mejorar mi control NetBarControl para poder darle la opcion de cambiar el PaintStyle(ExplorerBar, SideBar, NavigationPanel) encontre este articulo, excelente.... espero que te sirva a ti o a otro...

     

    Salu2,


    Marvin E. Pineda

    ComboBoxMultiColumns

    NetBarControl

     

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Monday, June 13, 2011 2:00 AM
    Moderator
  • Mira, este es uno de los usos que le puedes dar al codigo en el articulo que te pase...

    lo hize al rapido solo para que vieras, luego lo termino y lo publico en mi blog ya que hay dos maneras de hacer este tipo de control, directamente usando el TextBox como este caso o Creando un Control agregando un textbox interno y controlar su posición.

    Salu2,


    Marvin E. Pineda

    ComboBoxMultiColumns

    NetBarControl

     

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Monday, June 13, 2011 5:11 AM
    Moderator
  • Hola Marco,

    pase revisando y veo que aun no hay respuesta de tu parte sobre esta consulta, no se si lo lograstes hacer, pero aqui te dejo un projecto de prueba para que lo revises.

    te explico:

    si hacemos un acercamiento podremos ver mejor los bordes del cuadro de texto que has puesto de ejemplo

    en si, el TextBox como otros controles tiene un Non-Client Area de 2 pixeles (Top, Right, Bottom, Left) donde se dibuja el borde del Control

    como podemos notar en la imagen, si cambiamos la propiedad BackColor del control a un color diferente que nos permita notar esta area de los bordes nos daremos cuenta. Area de bordes marca en rojo.

    bien... el Link que te pase, en si es para un formulario, pero como lo necesitamos para un TextBox podemos hacer caso omiso de mucho código, no es necesario calcular el Non-Client Area ya que según veras el código en el projecto que te paso, el Message que usamos para cambiar el Borde es WM_NCPAINT

    dejamos que el control nos provea el non-client area por default y lo que hacemos es saber con un Flag cuando pintar el borde como nosotros quedramos.

    he leido las sugerencias de otros, lo que sugieren es cambiar la propiedad BorderStyle a None para poder dibujar los bordes que es identico a lo que he hecho en este projecto (aún que no llegue a probarlo de esa manera), pero no es igual ya que si queres usar los bordes por default lo podemos hacer facilmente.

    lo primero es sobre escribir el Metodo WndProc del TextBox, con el objetivo de intersectar el Mensaje WM_NCPAINT.

     

      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    
        Select Case m.Msg
          Case NativeMethods.WM_NCPAINT
            WmNCPaint(m)
          Case Else
            MyBase.WndProc(m)
        End Select
    
      End Sub
    

     


    si lo dejamos de esta manera

     

      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    
        Select Case m.Msg
          Case NativeMethods.WM_NCPAINT
            WmNCPaint(m)
        End Select
    
        MyBase.WndProc(m)
    
      End Sub
    

     


    el control dijubara su propio borde, sobreescribiendo el nuestro, cosa que no queremos, solo si asi lo deceamos, pero esto ya estaria condicionado en el metodo WmNCPaint()

    ejemplo:

     

      Private Sub WmNCPaint(ByVal m As Message)
    
        If Not UseCustomBorder Then
    
          MyBase.WndProc(m)
          Exit Sub
    
        End If
    
        ' Paint custom border
        End If
    
      End Sub
    
    

     


    UseCustomBorder es una propieda que he puesto en el control TextBox personalizado para poder seleccionar entre pintar nuestro propio borde o usar el borde del control.

    ya en funcionamiento podremos ver:

    y un acercamiento al nuevo borde del control:

    quedando así a tu entera disposición sobre cualquier duda que llegaras a tener.

    Salu2


    Marvin E. Pineda

    ComboBoxMultiColumns

    NetBarControl

     

    Marvin's Blog
    San Pedro Sula
    Honduras. C.A.


    Tuesday, June 21, 2011 9:40 PM
    Moderator