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 :

Problème de schintillement avec un changement de gradient. vb2008


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut Problème de schintillement avec un changement de gradient. vb2008
    Bonjour,

    j'essaie de faire mon propre contrôle de bouton, mais j'ai un petit problème de scintillement, et ce qui est bizarre, c'est que ça ne scintille pas si j'utilises des couleurs pleines au lieu de dégradé, on dirait que c'est la brosse qui à un problème ou quelque chose comme ça.

    J'ai pourtant mit le doubleBuffered et tout ce qui peut aider, j'ai même créé un buffer sur lequel je dessines et je le recopie sur le contrôle une fois terminé, mais rien à faire, aussitôt que je cliques la souris pour faire le changement d'état, il scintille au moment de passer de l'un à l'autre. Je suis à cours d'idée et toutes les recherches sur google amène comme solution d'utiliser le doublebuffered et c'est pourtant ce que je fais. Quelqu'un aurait-il une piste ?

    Voici mon code:

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    Imports System.ComponentModel
    Imports System.Drawing.Drawing2D
     
     
    Public Class XpButton
        Inherits System.Windows.Forms.UserControl
        Private buffer As BufferedGraphics
        Public Enum ButtonState
            Normal
            Pressed
        End Enum
     
        Private HasFocus As Boolean
        Private IsMouseHover As Boolean
        Private mState As ButtonState
     
        Public Sub New()
     
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
     
            ' Add any initialization after the InitializeComponent() call.
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            Me.SetStyle(ControlStyles.DoubleBuffer, True)
            Me.SetStyle(ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(ControlStyles.ResizeRedraw, True)
            Me.UpdateStyles()
     
        End Sub
     
        <Category("Appearance"), Browsable(True), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
         Public Overrides Property Text() As String
            Get
                Return MyBase.Text
            End Get
            Set(ByVal Value As String)
                If MyBase.Text <> Value Then
                    MyBase.Text = Value
                    Call Refresh()
                End If
            End Set
        End Property
     
        Private Sub XpButton_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.GotFocus
            If Enabled Then
                HasFocus = True
                Call Refresh()
            End If
        End Sub
     
        Private Sub XpButton_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
            If Enabled Then
                HasFocus = False
                Call Refresh()
            End If
        End Sub
     
        Private Sub XpButton_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
            If Enabled Then
                IsMouseHover = True
                Call Refresh()
            End If
        End Sub
     
        Private Sub XpButton_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
            If Enabled Then
                IsMouseHover = False
                Call Refresh()
            End If
        End Sub
     
        Private Sub XpButton_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
     
     
            Dim dc As Graphics = e.Graphics
            Dim r As New Rectangle(0, 0, Me.Width, Me.Height)
     
            Dim ColorNormal1 As Color = Color.FromArgb(251, 248, 231)
            Dim ColorNormal2 As Color = Color.FromArgb(221, 218, 201)
     
            Dim ColorPressed1 As Color = Color.FromArgb(236, 233, 216)
            Dim ColorPressed2 As Color = Color.FromArgb(255, 255, 246)
            Dim Color1 As Color
            Dim Color2 As Color
     
            Dim brush1 As LinearGradientBrush
            Dim brush2 As LinearGradientBrush
     
            If mState = ButtonState.Normal Then
                Color1 = ColorNormal1
                Color2 = ColorNormal2
                brush1 = New LinearGradientBrush(r, Color1, Color2, LinearGradientMode.Vertical)
                buffer.Graphics.FillRectangle(brush1, r)
            Else
                Color1 = ColorPressed1
                Color2 = ColorPressed2
                brush2 = New LinearGradientBrush(r, Color1, Color2, LinearGradientMode.Vertical)
                buffer.Graphics.FillRectangle(brush2, r)
            End If
     
            buffer.Render(dc)
     
        End Sub
     
        Private Sub XpButton_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' Créer le buffer
            Dim Context As BufferedGraphicsContext = BufferedGraphicsManager.Current
     
            Context.MaximumBuffer = Me.ClientSize
            buffer = Context.Allocate(Me.CreateGraphics, Me.ClientRectangle)
        End Sub
     
        Private Sub XpButton_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
            If Enabled Then
                mState = ButtonState.Pressed
                Call Refresh()
            End If
        End Sub
     
        Private Sub XpButton_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
            If Enabled Then
                mState = ButtonState.Normal
                Call Refresh()
            End If
        End Sub
    End Class

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 196
    Par défaut
    deja au lieu de Inherits UserControl, il vaut mieux faire inherits control

    dans un héritage, on utilises pas de handles mais des overrides

    moi sur mon control j'ai mis ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Me.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, True)
    Me.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, False)
    Me.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, False)
    Me.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, True)

    et sur l'overrides de paint (donc pas le handles ^^) il ne faut pas remplir le buffer et faire le render
    le remplissage du buffer doit se faire en cas de changement de propriété (ou sur un evenement particulier) qui aurait un impact sur le rendu
    et ne faire que render dans le paint

    paint est appellé plein de fois dont plein de fois pour rien (surtout sur win xp), dessiner prend du temps render prend moins d'une milliseconde
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut
    Ok

    J'ai essayé ce que tu m'as dit, j'ai fait overrides au lieu des handles, mais là aucun affichage se fait lol

    J'ai essayé de faire un call refresh à la fin de mon DrawControl, mais j'ai toujours le même problème de scintillement.

    Voici le code:

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    Imports System.ComponentModel
    Imports System.Drawing.Drawing2D
     
     
    Public Class XpButton
        Inherits System.Windows.Forms.Control
     
        Private buffer As BufferedGraphics
        Public Enum ButtonState
            Normal
            Pressed
        End Enum
     
        Private HasFocus As Boolean
        Private IsMouseHover As Boolean
        Private mState As ButtonState
     
        Public Sub New()
     
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
     
            ' Add any initialization after the InitializeComponent() call.
            'Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            'Me.SetStyle(ControlStyles.DoubleBuffer, True)
            'Me.SetStyle(ControlStyles.UserPaint, True)
            'Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            'Me.SetStyle(ControlStyles.ResizeRedraw, True)
            Me.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.Opaque, True)
            Me.UpdateStyles()
     
        End Sub
     
        Protected Overrides Sub OnPaintBackground(ByVal p As System.Windows.Forms.PaintEventArgs)
     
        End Sub
     
     
        <Category("Appearance"), Browsable(True), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
         Public Overrides Property Text() As String
            Get
                Return MyBase.Text
            End Get
            Set(ByVal Value As String)
                If MyBase.Text <> Value Then
                    MyBase.Text = Value
                    Call DrawControl()
                End If
            End Set
        End Property
     
        Private Sub XpButton_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.GotFocus
            If Enabled Then
                HasFocus = True
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
            If Enabled Then
                HasFocus = False
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
            If Enabled Then
                IsMouseHover = True
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
            If Enabled Then
                IsMouseHover = False
                Call DrawControl()
            End If
        End Sub
     
        Private Sub DrawControl()
            Dim r As New Rectangle(0, 0, Me.Width, Me.Height)
     
            Dim ColorNormal1 As Color = Color.FromArgb(251, 248, 231)
            Dim ColorNormal2 As Color = Color.FromArgb(221, 218, 201)
     
            Dim ColorPressed1 As Color = Color.FromArgb(236, 233, 216)
            Dim ColorPressed2 As Color = Color.FromArgb(255, 255, 246)
            Dim Color1 As Color
            Dim Color2 As Color
     
            Dim brush1 As LinearGradientBrush
            Dim brush2 As LinearGradientBrush
     
     
            buffer.Graphics.Clear(Color.Black)
            buffer.Graphics.PageUnit = GraphicsUnit.Pixel
     
            If mState = ButtonState.Normal Then
                Color1 = ColorNormal1
                Color2 = ColorNormal2
                brush1 = New LinearGradientBrush(r, Color1, Color2, LinearGradientMode.Vertical)
                buffer.Graphics.FillRectangle(brush1, r)
            Else
                Color1 = ColorPressed1
                Color2 = ColorPressed2
                brush2 = New LinearGradientBrush(r, Color1, Color2, LinearGradientMode.Vertical)
                buffer.Graphics.FillRectangle(brush2, r)
            End If
     
        End Sub
     
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
     
     
     
            buffer.Render(e.Graphics)
     
        End Sub
     
        Private Sub XpButton_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' Créer le buffer
            Dim Context As BufferedGraphicsContext = BufferedGraphicsManager.Current
     
            Context.MaximumBuffer = Me.ClientSize
     
            buffer = Context.Allocate(Me.CreateGraphics, Me.ClientRectangle)
        End Sub
     
        Private Sub XpButton_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
            If Enabled Then
                mState = ButtonState.Pressed
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
            If Enabled Then
                mState = ButtonState.Normal
                Call DrawControl()
            End If
        End Sub
     
    End Class

    Citation Envoyé par sperot51 Voir le message
    deja au lieu de Inherits UserControl, il vaut mieux faire inherits control

    dans un héritage, on utilises pas de handles mais des overrides

    moi sur mon control j'ai mis ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Me.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, True)
    Me.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, False)
    Me.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, False)
    Me.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, True)

    et sur l'overrides de paint (donc pas le handles ^^) il ne faut pas remplir le buffer et faire le render
    le remplissage du buffer doit se faire en cas de changement de propriété (ou sur un evenement particulier) qui aurait un impact sur le rendu
    et ne faire que render dans le paint

    paint est appellé plein de fois dont plein de fois pour rien (surtout sur win xp), dessiner prend du temps render prend moins d'une milliseconde

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 196
    Par défaut
    il manque une notion importante, l'allocation du buffer ne peut pas se faire dans le new, les dimensions ne sont pas initialisées et en plus ca peut changer

    il faut réallouer sur onsizechanged

    et tu ne déssines pas le texte ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut
    Voici le nouveau code, mais ça ne fonctionne pas plus

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    Imports System.ComponentModel
    Imports System.Drawing.Drawing2D
     
     
    Public Class XpButton
        Inherits System.Windows.Forms.Control
     
        Private buffer As BufferedGraphics
        Public Enum ButtonState
            Normal
            Pressed
        End Enum
     
        Private HasFocus As Boolean
        Private IsMouseHover As Boolean
        Private mState As ButtonState
     
        Public Sub New()
     
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
     
            ' Add any initialization after the InitializeComponent() call.
            'Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            'Me.SetStyle(ControlStyles.DoubleBuffer, True)
            'Me.SetStyle(ControlStyles.UserPaint, True)
            'Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            'Me.SetStyle(ControlStyles.ResizeRedraw, True)
            Me.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.Opaque, True)
            Me.UpdateStyles()
     
        End Sub
     
        Protected Overrides Sub OnPaintBackground(ByVal p As System.Windows.Forms.PaintEventArgs)
     
        End Sub
     
     
        <Category("Appearance"), Browsable(True), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
         Public Overrides Property Text() As String
            Get
                Return MyBase.Text
            End Get
            Set(ByVal Value As String)
                If MyBase.Text <> Value Then
                    MyBase.Text = Value
                    Call DrawControl()
                End If
            End Set
        End Property
     
        Private Sub XpButton_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.GotFocus
            If Enabled Then
                HasFocus = True
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
            If Enabled Then
                HasFocus = False
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
            If Enabled Then
                IsMouseHover = True
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
            If Enabled Then
                IsMouseHover = False
                Call DrawControl()
            End If
        End Sub
     
        Private Sub DrawControl()
            Dim r As New Rectangle(0, 0, Me.Width, Me.Height)
     
            Dim ColorNormal1 As Color = Color.FromArgb(251, 248, 231)
            Dim ColorNormal2 As Color = Color.FromArgb(221, 218, 201)
     
            Dim ColorPressed1 As Color = Color.FromArgb(236, 233, 216)
            Dim ColorPressed2 As Color = Color.FromArgb(255, 255, 246)
            Dim Color1 As Color
            Dim Color2 As Color
     
            Dim brush1 As LinearGradientBrush
            Dim brush2 As LinearGradientBrush
     
     
            buffer.Graphics.Clear(Color.Black)
            buffer.Graphics.PageUnit = GraphicsUnit.Pixel
     
            If mState = ButtonState.Normal Then
                Color1 = ColorNormal1
                Color2 = ColorNormal2
                brush1 = New LinearGradientBrush(r, Color1, Color2, LinearGradientMode.Vertical)
                buffer.Graphics.FillRectangle(brush1, r)
            Else
                Color1 = ColorPressed1
                Color2 = ColorPressed2
                brush2 = New LinearGradientBrush(r, Color1, Color2, LinearGradientMode.Vertical)
                buffer.Graphics.FillRectangle(brush2, r)
            End If
     
            Call Refresh()
     
        End Sub
     
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
     
     
     
            buffer.Render(e.Graphics)
     
        End Sub
     
        Private Sub XpButton_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' Créer le buffer
            Dim Context As BufferedGraphicsContext = BufferedGraphicsManager.Current
     
            Context.MaximumBuffer = Me.ClientSize
     
            buffer = Context.Allocate(Me.CreateGraphics, Me.ClientRectangle)
        End Sub
     
        Private Sub XpButton_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
            If Enabled Then
                mState = ButtonState.Pressed
                Call DrawControl()
            End If
        End Sub
     
        Private Sub XpButton_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
            If Enabled Then
                mState = ButtonState.Normal
                Call DrawControl()
            End If
        End Sub
     
    End Class
    Mais pourquoi il ne faut pas utiliser des Handles ? Pour le mouse_Up par exemple, c'est ok ou si je devrais faire un override ?

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 196
    Par défaut
    overrider une méthode, c'est résolu au moment de la compilation, la sub fait un truc en plus en gros

    utiliser un handles c'est géré au moment de l'execution, ca va vérifier dans une collection s'il faut appeler une sub et ca l'appelle via un delegue à priori
    c'est plus complexe donc surement moins performant, et en plus c'est non managé il parrait

    microsoft préconise dans msdn d'utiliser des overrides en cas d'héritage (une form est un héritage aussi au passage)


    sinon voici le code qui fonctionne :
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    Imports System.ComponentModel
    Imports System.Drawing.Drawing2D
     
     
    Public Class XpButton
        Inherits System.Windows.Forms.Control
     
     
     
        Private Shared ColorNormal1 As Color = Color.FromArgb(251, 248, 231)
        Private Shared ColorNormal2 As Color = Color.FromArgb(221, 218, 201)
     
        Private Shared ColorPressed1 As Color = Color.FromArgb(236, 233, 216)
        Private Shared ColorPressed2 As Color = Color.FromArgb(255, 255, 246)
     
     
        Private Shared BrushNormal As LinearGradientBrush
        Private Shared BrushPressed As LinearGradientBrush
     
     
     
        Public Enum ButtonState
            Normal
            Pressed
        End Enum
     
        Private buffer As BufferedGraphics
        Private HasFocus As Boolean
        Private IsMouseHover As Boolean
        Private mState As ButtonState
     
     
     
     
        Public Sub New()
     
            Me.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.Opaque, True)
            Me.UpdateStyles()
     
        End Sub
     
     
     
        Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
            DrawControl()
            MyBase.OnTextChanged(e)
        End Sub
     
        Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
            HasFocus = False
            DrawControl()
            MyBase.OnLostFocus(e)
        End Sub
     
        Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
            HasFocus = True
            DrawControl()
            MyBase.OnGotFocus(e)
        End Sub
     
        Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
            IsMouseHover = True
            DrawControl()
            MyBase.OnMouseEnter(e)
        End Sub
     
        Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
            IsMouseHover = False
            DrawControl()
            MyBase.OnMouseLeave(e)
        End Sub
     
     
        Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
            mState = ButtonState.Pressed
            DrawControl()
            MyBase.OnMouseDown(e)
        End Sub
     
        Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
            mState = ButtonState.Normal
            DrawControl()
            MyBase.OnMouseUp(e)
        End Sub
     
     
     
     
        Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
            MyBase.OnSizeChanged(e)
            buffer = System.Drawing.BufferedGraphicsManager.Current.Allocate(Me.CreateGraphics, Me.ClientRectangle)
            BrushNormal = New LinearGradientBrush(Me.ClientRectangle, ColorNormal1, ColorNormal2, LinearGradientMode.Vertical)
            BrushPressed = New LinearGradientBrush(Me.ClientRectangle, ColorPressed1, ColorPressed2, LinearGradientMode.Vertical)
            DrawControl()
        End Sub
     
     
     
     
     
        Private Sub DrawControl()
            If buffer Is Nothing Then Exit Sub
     
            buffer.Graphics.Clear(Color.Black)
     
            If mState = ButtonState.Normal Then
                buffer.Graphics.FillRectangle(BrushNormal, Me.ClientRectangle)
            Else
                buffer.Graphics.FillRectangle(BrushPressed, Me.ClientRectangle)
            End If
     
            Me.Invalidate()
     
        End Sub
     
     
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            If buffer Is Nothing Then Exit Sub
            buffer.Render(e.Graphics)
        End Sub
     
     
        Protected Overrides Sub OnPaintBackground(ByVal p As System.Windows.Forms.PaintEventArgs)
            If buffer Is Nothing Then Exit Sub
            buffer.Render(p.Graphics)
        End Sub
     
     
    End Class

    plusieurs modifs par rapport à ton code, déjà plus de handles
    les couleurs si c'est tout le temps les meme, ca sert à rien de les déclarer à chaque fois, et de les setter
    au passage je les ai mis shared, ca prend moins de ram (meme si pour des couleurs c'est anecdotique, c'est pour le principe)
    le brush, la aussi tant que la taille n'est pas modifiée, ca sert à rien de le recalculer

    les If buffer Is Nothing Then Exit Sub c'est pour un peu de sécurité
    le mieux en .net est de toujours tester si les variables existent avant de les utiliser (sinon ca plante)

    et ca serait du code à moi, il y aurait des try catch dans la moitié des subs

    voilà, testé fonctionnel
    si t'as des questions n'hésite pas



    EDIT : et on dirait qu'il manque les mybase.onpaint et onpaintbackground
    ils peuvent etre utiles ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut
    Ok, je vais l'essayer quand je serais de retour à la maison

    Il y a certains trucs que je ne saisi pas encore très bien en .net Par exemple le Mybase à quoi il fait référence et à quoi sert le 'e'

    Pourquoi apelles-tu invalidate après avoir dessiné dans le buffer ?

    merci

    Citation Envoyé par sperot51 Voir le message
    overrider une méthode, c'est résolu au moment de la compilation, la sub fait un truc en plus en gros

    utiliser un handles c'est géré au moment de l'execution, ca va vérifier dans une collection s'il faut appeler une sub et ca l'appelle via un delegue à priori
    c'est plus complexe donc surement moins performant, et en plus c'est non managé il parrait

    microsoft préconise dans msdn d'utiliser des overrides en cas d'héritage (une form est un héritage aussi au passage)


    sinon voici le code qui fonctionne :
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    Imports System.ComponentModel
    Imports System.Drawing.Drawing2D
     
     
    Public Class XpButton
        Inherits System.Windows.Forms.Control
     
     
     
        Private Shared ColorNormal1 As Color = Color.FromArgb(251, 248, 231)
        Private Shared ColorNormal2 As Color = Color.FromArgb(221, 218, 201)
     
        Private Shared ColorPressed1 As Color = Color.FromArgb(236, 233, 216)
        Private Shared ColorPressed2 As Color = Color.FromArgb(255, 255, 246)
     
     
        Private Shared BrushNormal As LinearGradientBrush
        Private Shared BrushPressed As LinearGradientBrush
     
     
     
        Public Enum ButtonState
            Normal
            Pressed
        End Enum
     
        Private buffer As BufferedGraphics
        Private HasFocus As Boolean
        Private IsMouseHover As Boolean
        Private mState As ButtonState
     
     
     
     
        Public Sub New()
     
            Me.SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.ResizeRedraw, False)
            Me.SetStyle(System.Windows.Forms.ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.Opaque, True)
            Me.UpdateStyles()
     
        End Sub
     
     
     
        Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
            DrawControl()
            MyBase.OnTextChanged(e)
        End Sub
     
        Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
            HasFocus = False
            DrawControl()
            MyBase.OnLostFocus(e)
        End Sub
     
        Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
            HasFocus = True
            DrawControl()
            MyBase.OnGotFocus(e)
        End Sub
     
        Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
            IsMouseHover = True
            DrawControl()
            MyBase.OnMouseEnter(e)
        End Sub
     
        Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
            IsMouseHover = False
            DrawControl()
            MyBase.OnMouseLeave(e)
        End Sub
     
     
        Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
            mState = ButtonState.Pressed
            DrawControl()
            MyBase.OnMouseDown(e)
        End Sub
     
        Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
            mState = ButtonState.Normal
            DrawControl()
            MyBase.OnMouseUp(e)
        End Sub
     
     
     
     
        Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
            MyBase.OnSizeChanged(e)
            buffer = System.Drawing.BufferedGraphicsManager.Current.Allocate(Me.CreateGraphics, Me.ClientRectangle)
            BrushNormal = New LinearGradientBrush(Me.ClientRectangle, ColorNormal1, ColorNormal2, LinearGradientMode.Vertical)
            BrushPressed = New LinearGradientBrush(Me.ClientRectangle, ColorPressed1, ColorPressed2, LinearGradientMode.Vertical)
            DrawControl()
        End Sub
     
     
     
     
     
        Private Sub DrawControl()
            If buffer Is Nothing Then Exit Sub
     
            buffer.Graphics.Clear(Color.Black)
     
            If mState = ButtonState.Normal Then
                buffer.Graphics.FillRectangle(BrushNormal, Me.ClientRectangle)
            Else
                buffer.Graphics.FillRectangle(BrushPressed, Me.ClientRectangle)
            End If
     
            Me.Invalidate()
     
        End Sub
     
     
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            If buffer Is Nothing Then Exit Sub
            buffer.Render(e.Graphics)
        End Sub
     
     
        Protected Overrides Sub OnPaintBackground(ByVal p As System.Windows.Forms.PaintEventArgs)
            If buffer Is Nothing Then Exit Sub
            buffer.Render(p.Graphics)
        End Sub
     
     
    End Class

    plusieurs modifs par rapport à ton code, déjà plus de handles
    les couleurs si c'est tout le temps les meme, ca sert à rien de les déclarer à chaque fois, et de les setter
    au passage je les ai mis shared, ca prend moins de ram (meme si pour des couleurs c'est anecdotique, c'est pour le principe)
    le brush, la aussi tant que la taille n'est pas modifiée, ca sert à rien de le recalculer

    les If buffer Is Nothing Then Exit Sub c'est pour un peu de sécurité
    le mieux en .net est de toujours tester si les variables existent avant de les utiliser (sinon ca plante)

    et ca serait du code à moi, il y aurait des try catch dans la moitié des subs

    voilà, testé fonctionnel
    si t'as des questions n'hésite pas



    EDIT : et on dirait qu'il manque les mybase.onpaint et onpaintbackground
    ils peuvent etre utiles ...

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 196
    Par défaut
    tu appelais refresh, j'ai regardé avec reflector, refresh appelle invalidate et update

    invalidate, je savais que ca déclenchait le paint dans la foulée



    dans le code d'une classe, me fait référence à l'instance qui est en train d'executer le code
    mybase fait référence à la classe dont on hérite
    par exemple si une classe A possède une sub nommée write qui ecrit un texte
    la classe B hérite de A et possède un overrides de la sub write
    mybase.write permet de dire qu'on veut executer le code d'origine en gros, auquel on peut rajouter du code
    alors que si on mets du code et qu'on appelle mybase, le code d'origine n'est pas executé


    e je l'ai déja expliqué dans un autre post mais bon ...
    sur vb6, un evement ramenait x paramètres, par exemple sur mousemove, on avait x as integer, y as integer, button ...
    sur vb.net, microsoft a voulu harmoniser, et donc tous leurs evements ont 2 paramètres, sender et e :
    - sender contient l'appelant de l'evement
    en effet il est possible de ramener plusieurs evenement sur une seule sub
    private masub (sender as object, e) handles button1.click, button2.click
    sender contient donc button1 ou button2
    on peut tester avec
    if sender is button1
    mais des fois, on créé aussi plusieurs controles par code, et on les ramène tous à un evenement via
    dim b as new button
    addhandler b.click, addressof telleSub

    - e est une classe qui contient tous les parametres
    sur mousemove, tu as e.x, e.y et e.button

    sender est as object, car ca peut contenir différente chose
    mais si tu veux appeler une sub onclick par exemple, tu peux l'appeler me.onclick(nothing,nothing) tant que dans ta sub tu n'utilises ni sender, ni e
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/01/2015, 16h46
  2. Problème avec le changement de valeur d'une combo
    Par justgreat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/06/2010, 12h05
  3. Problème avec le changement de scheme - plugin Eclipse
    Par mina86 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 28/09/2009, 16h26
  4. Réponses: 1
    Dernier message: 22/03/2009, 17h00
  5. Réponses: 7
    Dernier message: 06/05/2007, 18h11

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