none
Comment Changer la couleur de la bordure d'une combobox? RRS feed

  • Question

  • Bonjour,

    Tout est dans le titre :)

    Je ne vois pas comment changer la couleur de la bordure de mes combobox, listbox et textbox

    Avez vous une idée?

    Merci


    FB
    dimanche 5 décembre 2010 23:05

Réponses

  • J'ai simplifié un peu le code. Quand même fou d'être obligé d'appeler WndProc. Je ne comprends pas pourquoi...

     

      Private Const WM_PAINT As Integer = 15
    
      Private _couleur As Color = Color.Transparent 'inialiser la couleur à transparent
      Public Property BorderColor() As Color
        Get
          Return _couleur
        End Get
        Set(ByVal Value As Color)
          Me._couleur = Value
        End Set
      End Property
    
    
    
      Protected Overloads Overrides Sub WndProc(ByRef m As Message)
    
        Select Case m.Msg
    
          Case WM_PAINT
    
            MyBase.WndProc(m)
    
            OnPaint()
    
            ' break
    
          Case Else
    
            MyBase.WndProc(m)
    
            ' break
    
        End Select
    
      End Sub
    
    
    
      Protected Overloads Sub OnPaint()
    
        Try
    
          Dim rcItem As Rectangle = New Rectangle(0, 0, Me.Bounds.Width, Me.Bounds.Height)
    
          Dim e As Graphics = MyBase.CreateGraphics
    
          ControlPaint.DrawBorder(e, rcItem, _couleur, ButtonBorderStyle.Solid)
    
    
        Catch ex As Exception
    
    
        End Try
    
      End Sub
    
    

    FB
    • Marqué comme réponse Alex Petrescu lundi 13 décembre 2010 13:28
    lundi 6 décembre 2010 21:28

Toutes les réponses

  • > Bonjour,
     
    Bonjour,
     
    > Je ne vois pas comment changer la couleur de la bordure de mes combobox,
    > listbox et textbox
    >
    > Avez vous une idée?
     
    Une méthode consiste à créer un UserControl dans lequel on place le
    contrôle Windows sans bordure.
    On peut dessiner une bordure de la couleur souhaitée sur le UserControl.
    Pas de méthode très simple à ma connaissance.
     --
    Fred
    foleide@free.fr
     
    lundi 6 décembre 2010 08:10
  • J'ai en effet essayé ainsi, en commençant avec la combobox

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

     Sub New()
        MyBase.New()
        Me.SetStyle(ControlStyles.UserPaint, False)
        Me.SetStyle(ControlStyles.DoubleBuffer, True)
      End Sub
    
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, m_BorderColor,
        ButtonBorderStyle.Solid)
        MyBase.OnPaint(e)
      End Sub

    Mais le paint ne se déclenche pas à priori...

    Avez vous un exemple de code s'il vous plait? j'ai déjà pas mal développé de usercontrol dans les versions précédentes mais j'avoue que la je suis un peu perdu...


    FB

    lundi 6 décembre 2010 09:11
  • voici le code de ta classe contrôle utilisateur (ta classe doit hériter de system.windows.form.Combobox)

     '--Couleur de la bordure
     Private Const WM_PAINT As Integer = 15
    
     Private _couleur As Color = Color.Transparent 'inialiser la couleur à transparent
     Public Property BorderColor() As Color
      Get
       Return _couleur
      End Get
      Set(ByVal Value As Color)
       Me._couleur = Value
      End Set
     End Property
    
     <DllImport("user32")> _
    Private Shared Function GetWindowDC(ByVal hWnd As IntPtr) As IntPtr
     End Function
    
     Protected Overloads Overrides Sub WndProc(ByRef m As Message)
      Select Case m.Msg
       Case WM_PAINT
        MyBase.WndProc(m)
        OnPaint()
        ' break
       Case Else
        MyBase.WndProc(m)
        ' break
      End Select
     End Sub
    
     Protected Overloads Sub OnPaint()
      Try
       Dim rcItem As Rectangle = New Rectangle(0, 0, Me.Bounds.Width, Me.Bounds.Height)
       Dim gfx As Graphics = MyBase.CreateGraphics
       DrawBorder(gfx, rcItem, _couleur)
       gfx.Dispose()
       gfx = Nothing
      Catch ex As Exception
       '--NE rien faire pour le moement
      End Try
     End Sub
    
     Private Sub DrawBorder(ByVal arGfx As Graphics, ByVal arRC As Rectangle, _
       ByVal arcColor As Color)
    
      Dim lpPen As Pen = New Pen(arcColor, 1)
      Dim hDC As IntPtr = Me.Handle
    
      arGfx.DrawLine(lpPen, arRC.X, arRC.Y + arRC.Height - 1, arRC.X, arRC.Y)
      arGfx.DrawLine(lpPen, arRC.X, arRC.Y, arRC.X + arRC.Width - 1, arRC.Y)
      If Not (arRC.Width = 0) Then
       arGfx.DrawLine(lpPen, arRC.X + arRC.Width - 1, arRC.Y, arRC.X + arRC.Width - 1, arRC.Top + arRC.Height - 1)
       arGfx.DrawLine(lpPen, arRC.X + arRC.Width - 1, arRC.Top + arRC.Height - 1, arRC.X, arRC.Top + arRC.Height - 1)
      End If
      lpPen.Dispose()
      lpPen = Nothing
     End Sub

    Quand tu ajoutes ce userContrôle à ton interface tu vas trouver toutes les propriétés d'un comboBox + la nouvelle propriété BorderColor.

    lundi 6 décembre 2010 11:22
  • J'ai en effet essayé ainsi, en commençant avec la combobox

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

     Sub New()
    
      MyBase.New()
    
      Me.SetStyle(ControlStyles.UserPaint, False)
    
      Me.SetStyle(ControlStyles.DoubleBuffer, True)
    
     End Sub
    
    
    
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    
      ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle, m_BorderColor,
    
      ButtonBorderStyle.Solid)
    
      MyBase.OnPaint(e)
    
     End Sub
    
    

    Mais le paint ne se déclenche pas à priori...

    Avez vous un exemple de code s'il vous plait? j'ai déjà pas mal développé de usercontrol dans les versions précédentes mais j'avoue que la je suis un peu perdu...

     


     

    FB


    Bonjour,

    Mettez à True la propriété ControlStyles.UserPaint :

    Me.SetStyle(ControlStyles.UserPaint, True)
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 6 décembre 2010 20:15
    Modérateur
  • Bonsoir Gilles,

     

    J'avais essayé et ça fonctionne en effet pour la textbox.

    Pour la combobox, la flèche et les item ont disparu


    FB
    lundi 6 décembre 2010 20:37
  • voici le code de ta classe contrôle utilisateur (ta classe doit hériter de system.windows.form.Combobox)

     '--Couleur de la bordure
    
     Private Const WM_PAINT As Integer = 15
    
    
    
     Private _couleur As Color = Color.Transparent 'inialiser la couleur à transparent
    
     Public Property BorderColor() As Color
    
     Get
    
      Return _couleur
    
     End Get
    
     Set(ByVal Value As Color)
    
      Me._couleur = Value
    
     End Set
    
     End Property
    
    
    
     <DllImport("user32")> _
    
    Private Shared Function GetWindowDC(ByVal hWnd As IntPtr) As IntPtr
    
     End Function
    
    
    
     Protected Overloads Overrides Sub WndProc(ByRef m As Message)
    
     Select Case m.Msg
    
      Case WM_PAINT
    
      MyBase.WndProc(m)
    
      OnPaint()
    
      ' break
    
      Case Else
    
      MyBase.WndProc(m)
    
      ' break
    
     End Select
    
     End Sub
    
    
    
     Protected Overloads Sub OnPaint()
    
     Try
    
      Dim rcItem As Rectangle = New Rectangle(0, 0, Me.Bounds.Width, Me.Bounds.Height)
    
      Dim gfx As Graphics = MyBase.CreateGraphics
    
      DrawBorder(gfx, rcItem, _couleur)
    
      gfx.Dispose()
    
      gfx = Nothing
    
     Catch ex As Exception
    
      '--NE rien faire pour le moement
    
     End Try
    
     End Sub
    
    
    
     Private Sub DrawBorder(ByVal arGfx As Graphics, ByVal arRC As Rectangle, _
    
      ByVal arcColor As Color)
    
    
    
     Dim lpPen As Pen = New Pen(arcColor, 1)
    
     Dim hDC As IntPtr = Me.Handle
    
    
    
     arGfx.DrawLine(lpPen, arRC.X, arRC.Y + arRC.Height - 1, arRC.X, arRC.Y)
    
     arGfx.DrawLine(lpPen, arRC.X, arRC.Y, arRC.X + arRC.Width - 1, arRC.Y)
    
     If Not (arRC.Width = 0) Then
    
      arGfx.DrawLine(lpPen, arRC.X + arRC.Width - 1, arRC.Y, arRC.X + arRC.Width - 1, arRC.Top + arRC.Height - 1)
    
      arGfx.DrawLine(lpPen, arRC.X + arRC.Width - 1, arRC.Top + arRC.Height - 1, arRC.X, arRC.Top + arRC.Height - 1)
    
     End If
    
     lpPen.Dispose()
    
     lpPen = Nothing
    
     End Sub
    
    

    Quand tu ajoutes ce userContrôle à ton interface tu vas trouver toutes les propriétés d'un comboBox + la nouvelle propriété BorderColor.


    Ce code fonctionne en effet.

    J'avoue que j'aurais préféré mon autre solution

    Le fait de devoir appeler GetWindowDC me gene un peu...


    FB
    lundi 6 décembre 2010 20:58
  • J'ai simplifié un peu le code. Quand même fou d'être obligé d'appeler WndProc. Je ne comprends pas pourquoi...

     

      Private Const WM_PAINT As Integer = 15
    
      Private _couleur As Color = Color.Transparent 'inialiser la couleur à transparent
      Public Property BorderColor() As Color
        Get
          Return _couleur
        End Get
        Set(ByVal Value As Color)
          Me._couleur = Value
        End Set
      End Property
    
    
    
      Protected Overloads Overrides Sub WndProc(ByRef m As Message)
    
        Select Case m.Msg
    
          Case WM_PAINT
    
            MyBase.WndProc(m)
    
            OnPaint()
    
            ' break
    
          Case Else
    
            MyBase.WndProc(m)
    
            ' break
    
        End Select
    
      End Sub
    
    
    
      Protected Overloads Sub OnPaint()
    
        Try
    
          Dim rcItem As Rectangle = New Rectangle(0, 0, Me.Bounds.Width, Me.Bounds.Height)
    
          Dim e As Graphics = MyBase.CreateGraphics
    
          ControlPaint.DrawBorder(e, rcItem, _couleur, ButtonBorderStyle.Solid)
    
    
        Catch ex As Exception
    
    
        End Try
    
      End Sub
    
    

    FB
    • Marqué comme réponse Alex Petrescu lundi 13 décembre 2010 13:28
    lundi 6 décembre 2010 21:28