none
Couleur de la bordure d'un GroupBox RRS feed

  • Question

  • Bonjour

    Peut-on choisir la couleur de la bordure d'un GroupBox ?

     J'ai essayé :

     

    Private Sub ChangeGrpBoxBorder()

     

    For Each Grpbx As GroupBox In Me.Controls

    Grpbx.borderbrush = Brushes.Black

     

    Next

     

    End Sub

    Mais j'ai l'erreur :
    Erreur 1 'borderbrush' n'est pas un membre de 'System.Windows.Forms.GroupBox'. 

    Merci


    http://www.scalpa.info
    dimanche 28 novembre 2010 08:57

Réponses

Toutes les réponses

  • Bonjour,

    Par défaut, il n'est pas possible de changer la couleur de la bordure d'un GroupBox. Par contre vous pouvez créer un contrôle dérivé de celui-ci et gérer votre logique de dessin. Voici un exemple de code en VB .NET qui permet de créer un contrôle GroupBox permettant de changer la couleur de la bordure : http://social.msdn.microsoft.com/forums/en-US/winforms/thread/cfd34dd1-b6e5-4b56-9901-0dc3d2ca5788/

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse scalpa dimanche 28 novembre 2010 11:30
    dimanche 28 novembre 2010 09:10
    Modérateur
  • Merci Gilles pour ce lien très instructif, du coup j'en profite pour comprendre les UserControls et leur comportement.
    Pourquoi d'ailleurs le UserControl ne se "rafraichit-il pas tout seul quand une de ses propriétés change ? Que faut-il ajouter au code suivant issu du lien que vous m'avez signalé et que j'ai un peu bidouillé (J'ai essayé d'ajouter le code des autres messages du thread pour avoir le rectangle aux bords arrondis) pour ne pas avoir le texte du label du GroupBox barré par la bordure quand le BackGround est transparent :
    Imports System.ComponentModel
    Imports System.Drawing.Drawing2D
    
    Public Class myGroupBox
      Inherits GroupBox
    
      Private m_bordColor As Color
      Private m_LblColor As Color
      Private m_backColor As Color = Color.Transparent
    
      Public Sub New()
        MyBase.New()
        Me.m_bordColor = Color.Black
        Me.BackColor = Color.Transparent
        Me.m_LblColor = Color.White
      End Sub
    
      <Browsable(False)> _
    Public Overrides Property BackColor() As Color
        Get
          Return MyBase.BackColor
        End Get
        Set(ByVal value As Color)
          MyBase.BackColor = value
        End Set
      End Property
      Public Property BorderColor() As Color
        Get
          Return Me.m_bordColor
        End Get
        Set(ByVal value As Color)
          Me.m_bordColor = value
        End Set
      End Property
      Public Property LabelColor() As Color
        Get
          Return Me.m_LblColor
        End Get
        Set(ByVal value As Color)
          Me.m_LblColor = value
        End Set
      End Property
      Public Property ActualBackColor() As Color
        Get
          Return Me.m_backColor
        End Get
    
        Set(ByVal value As Color)
          Me.m_backColor = value
        End Set
      End Property
    
    
      Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    
        Dim tSize As Size = TextRenderer.MeasureText(Me.Text, Me.Font)
        Dim borderRect As Rectangle = e.ClipRectangle
        borderRect.Y += tSize.Height / 2
        borderRect.Height -= tSize.Height / 2
    
        Dim gPath As GraphicsPath 
        gPath = CreatePath(0, borderRect.Y, CSng(Me.Width - 1), borderRect.Height - 1, 5, True, _
         True, True, True)
    
        e.Graphics.FillPath(New SolidBrush(ActualBackColor), gPath)
        e.Graphics.DrawPath(New Pen(Me.BorderColor), gPath)
    
        borderRect.X += 6
        borderRect.Y -= 7
    
        Dim textRect As Rectangle = e.ClipRectangle
        textRect.X = (textRect.X + 6)
        textRect.Width = tSize.Width
        textRect.Height = tSize.Height
    
        e.Graphics.FillRectangle(New SolidBrush(Me.LabelColor), textRect)
        e.Graphics.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), textRect)
      End Sub
    
    
      Public Function CreatePath(ByVal x As Single, ByVal y As Single, ByVal width As Single, _
                    ByVal height As Single, ByVal radius As Single, _
                    ByVal RoundTopLeft As Boolean, ByVal RoundTopRight As Boolean, _
                    ByVal RoundBottomRight As Boolean, ByVal RoundBottomLeft As Boolean) _
                    As GraphicsPath
    
        Dim xw As Single = x + width
        Dim yh As Single = y + height
        Dim xwr As Single = xw - radius
        Dim yhr As Single = yh - radius
        Dim xr As Single = x + radius
        Dim yr As Single = y + radius
        Dim r2 As Single = radius * 2
        Dim xwr2 As Single = xw - r2
        Dim yhr2 As Single = yh - r2
    
        Dim p As New GraphicsPath()
        p.StartFigure()
    
        'Top Left Corner
    
        If RoundTopLeft Then
          p.AddArc(x, y, r2, r2, 180, 90)
        Else
          p.AddLine(x, yr, x, y)
    
          p.AddLine(x, y, xr, y)
        End If
    
        'Top Edge
        p.AddLine(xr, y, xwr, y)
    
        'Top Right Corner
    
        If RoundTopRight Then
          p.AddArc(xwr2, y, r2, r2, 270, 90)
        Else
          p.AddLine(xwr, y, xw, y)
          p.AddLine(xw, y, xw, yr)
        End If
    
    
        'Right Edge
        p.AddLine(xw, yr, xw, yhr)
    
        'Bottom Right Corner
    
        If RoundBottomRight Then
          p.AddArc(xwr2, yhr2, r2, r2, 0, 90)
        Else
          p.AddLine(xw, yhr, xw, yh)
          p.AddLine(xw, yh, xwr, yh)
        End If
    
    
        'Bottom Edge
        p.AddLine(xwr, yh, xr, yh)
    
        'Bottom Left Corner      
    
        If RoundBottomLeft Then
          p.AddArc(x, yhr2, r2, r2, 90, 90)
        Else
          p.AddLine(xr, yh, x, yh)
          p.AddLine(x, yh, x, yhr)
        End If
    
        'Left Edge
        p.AddLine(x, yhr, x, yr)
    
        p.CloseFigure()
        Return p
      End Function
    End Class
    
    

    Merci

    PS : D'ailleurs est-ce autorisé de coller ici ce bout de code provenant d'un autre thread ?


    http://www.scalpa.info
    dimanche 28 novembre 2010 11:42
  • Bonjour,

    Vous pouvez coller du code dans les forums Microsoft tant que celui-ci provient d'une source qui vous l'autorise (Projets Open Source, forums,...etc).

    Lorsque vous changez la valeur d'une propriété et si cette dernière impact le dessin du contrôle, vous devez le notifier à Windows. Pour cela écrivez dans les Setter des propriétés :

    Set(ByVal value As Color)
       If Me.m_bordColor <> value Then
         Me.m_bordColor = value
         Me.Invalidate()
       End If
    End Set
    
    

    Ainsi, lorsque la valeur de la propriété réellement, on signale à Windows que le dessin du contrôle est invalide. Windows déclenchera dans ce cas, la méthode de dessin, et redessinera votre contrôle avec la bonne valeur.

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    dimanche 28 novembre 2010 11:50
    Modérateur