IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[usercontrol] bordures : avoir une bordure unique lorsque 2 contrôles sont côte-à-côte.


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut [usercontrol] bordures : avoir une bordure unique lorsque 2 contrôles sont côte-à-côte.
    Hello,

    Toujours occupé avec ma création de usercontrol, je veux lui faire une jolie bordure histoire qu'il ressemble à quelque chose.

    J'ai donc ce code dans son event Paint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        Private Sub EmptySlot_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            'drawing borders
            'top
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(0, 0), New Drawing.Point(Width, 0))
            'bottom
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(0, Height), New Drawing.Point(Width, Height))
            'left
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(0, 0), New Drawing.Point(0, Height))
            'right
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(Width, 0), New Drawing.Point(Width, Height))
            'drawing text if any
            If Text IsNot Nothing Then
                e.Graphics.DrawString(Text, New Drawing.Font(Drawing.FontFamily.GenericSansSerif, 8), Drawing.Brushes.Black, ClientRectangle)
            End If
        End Sub
    Avec ce code, j'ai bien les bordures supérieures et gauches mais pas les autres (basses et droites donc).

    Si je modifie le code comme ce qui suit, j'ai bien toutes les bordures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        Private Sub EmptySlot_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            'drawing borders
            'top
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(0, 0), New Drawing.Point(Width, 0))
            'bottom
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(0, Height - 1), New Drawing.Point(Width, Height - 1))
            'left
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(0, 0), New Drawing.Point(0, Height))
            'right
            e.Graphics.DrawLine(Drawing.Pens.LightSlateGray, New Drawing.Point(Width - 1, 0), New Drawing.Point(Width - 1, Height))
            'drawing text if any
            If Text IsNot Nothing Then
                 e.Graphics.DrawString(Text, New  Drawing.Font(Drawing.FontFamily.GenericSansSerif, 8),  Drawing.Brushes.Black, ClientRectangle)
            End If
        End Sub
    Seulement avec ce code, si je mets 2 de mes usercontrols côte-à-côte, ça me fait une grosse bordure au milieu et c'est moche .

    Même problème si, à place de dessiner les bordures une à une, j'utilise ControlPaint.DrawBorder comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            ControlPaint.DrawBorder(e.Graphics, ClientRectangle, Drawing.Color.LightSlateGray, ButtonBorderStyle.Solid)
    J'ai l'intuition qu'il n'y a pas vraiment de solution vu que les controles ne se chevauche pas, je vais la bordure de l'un et, juste à côté, la bordure de l'autre...

    Comment feriez-vous ?
    Kropernic

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Ce n'est pas que les 2 controls ne se chauvechent pas mais ils ne "connaissent" pas leur voisin de palier à droite ou à gauche...ou du bas ou du haut ..
    Cela ne peut se faire qu'au design-time comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    Imports System.Drawing.Drawing2D
     
    Public Class UserControl1
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
            Dim bord As Rectangle = Me.ClientRectangle
            bord.Inflate(-1, -1)
            Dim p1, p2, p3, p4 As Point
            p1 = New Point(bord.Left, bord.Top)
            p2 = New Point(bord.Right, bord.Top)
            p3 = New Point(bord.Right, bord.Bottom)
            p4 = New Point(bord.Left, bord.Bottom)
     
            Dim gr As Graphics = e.Graphics
            Dim pp As New Pen(Brushes.SlateGray)
     
            If ShowBorderTop Then
                gr.DrawLine(pp, p1, p2)
            End If
            If ShowBorderRight Then
                gr.DrawLine(pp, p2, p3)
            End If
            If ShowBorderBottom Then
                gr.DrawLine(pp, p3, p4)
            End If
            If ShowBorderLeft Then
                gr.DrawLine(pp, p4, p1)
            End If
     
     
     
     
     
     
     
     
            If Text IsNot Nothing Then
                gr.DrawString(Text, New Font(FontFamily.GenericSansSerif, 8), Brushes.Black, ClientRectangle)
            End If
     
        End Sub
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.Text = "my control"
            SetStyle(ControlStyles.ResizeRedraw, True)
        End Sub
        Private m_brTop As Boolean
        Public Property ShowBorderTop As Boolean
            Get
                Return m_brTop
            End Get
            Set(ByVal value As Boolean)
                m_brTop = value
                Me.Invalidate()
            End Set
        End Property
        Private m_brLeft As Boolean
        Public Property ShowBorderLeft As Boolean
            Get
                Return m_brLeft
            End Get
            Set(ByVal value As Boolean)
                m_brLeft = value
                Me.Invalidate()
     
            End Set
        End Property
        Private m_brRight As Boolean
        Public Property ShowBorderRight As Boolean
            Get
                Return m_brRight
            End Get
            Set(ByVal value As Boolean)
                m_brRight = value
                Me.Invalidate()
            End Set
        End Property
        Private m_brBottom As Boolean
        Public Property ShowBorderBottom As Boolean
            Get
                Return m_brBottom
            End Get
            Set(ByVal value As Boolean)
                m_brBottom = value
                Me.Invalidate()
     
            End Set
        End Property
    End Class
    bon code...

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Je regarde cela lundi.

    Quoi qu'il en soit, un grand merci pour ce code qui, j'en suis sûr, me sera très instructif
    Kropernic

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Hello,

    Bon alors j'ai regardé et soit je ne comprends pas, soit ça ne résout rien.

    Déjà, le MyBase.OnPaint(e) fait tout planté* ^^ (StackOverFlowException)

    * mais c'est p-e en conjonction avec un autre morceau de code. Je ne me suis pas amusé à tout nettoyer ce que j'avais déjà fait...

    Ensuite, bord.Inflate(-1,-1) fait que tous les bords du rectangle se rapprochent de 1 pixel du centre du rectangle. Ce qui, quand on met 2 contrôles côte-à-côte, fait qu'on voit distinctement 2 lignes avec un espace de 2 pixels entre-elles. Ce qui n'est pas du tout l'effet désiré.

    Sans le Inflate(-1,-1), en mettant 2 contrôles côte-à-côté, on a 2 lignes côte-à-côte ce qui visuellement donne une grosse ligne de 2 pixels de large.

    Ce que j'aimerais parvenir à faire, c'est faire que les bords des contrôles se superposent pour ne voir qu'une seule ligne de 1 pixel de large.

    A part ça, c'est un code propre avec des propriétés pour montrer les bordures ou non (ce dont je n'ai pas besoin non plus ^^).

    Bref, je me répète mais plus j'y réfléchis, plus je me dis que ce n'est pas possible...

    En bonus, des screenshots :
    1. "1e extrait" qui correspond au visuel de mon premier extrait de code
    2. "2e extrait" qui correspond au visuel de mon second extrait de code
    3. "inflate" qui correspond au visuel du code de mabrouiki


    N.B. : Au niveau du design, les colonnes sont des panels qui sont garnis avec mes UC.
    Images attachées Images attachées    
    Kropernic

Discussions similaires

  1. Avoir une bordure image
    Par many84 dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 17/06/2015, 18h29
  2. comment detecter une bordure dans une image??
    Par gronaze dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 17/11/2008, 01h10
  3. Réponses: 1
    Dernier message: 11/06/2007, 21h31
  4. Comment définir qu'une bordure d'une cellule de mon tableau ?
    Par nouida dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 28/05/2007, 01h22
  5. Réponses: 5
    Dernier message: 15/08/2006, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo