Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a écrit
dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#alexandre.claverie@latelec.fr(@Anti-Spam)#> a écrit
dans le message de news: u$kIB00tEHA.3972@TK2MSFTNGP15.phx.gbl...
Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a écrit
dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a écrit
dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" <boutchmusic@hotmail.com> a écrit dans le message de
news: OmdgTW5tEHA.1576@TK2MSFTNGP10.phx.gbl...
Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#alexandre.claverie@latelec.fr(@Anti-Spam)#> a écrit
dans le message de news: u$kIB00tEHA.3972@TK2MSFTNGP15.phx.gbl...
Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a écrit
dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: uxP$humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a
écrit dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)alexandre.claverie@latelec.com#NOSPAM)> a écrit dans le
message de news: uxP$WM6tEHA.948@tk2msftngp13.phx.gbl...
humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" <boutchmusic@hotmail.com> a écrit dans le message de
news: OmdgTW5tEHA.1576@TK2MSFTNGP10.phx.gbl...
Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#alexandre.claverie@latelec.fr(@Anti-Spam)#> a
écrit dans le message de news: u$kIB00tEHA.3972@TK2MSFTNGP15.phx.gbl...
Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: uxP$humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a
écrit dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
OnPaint ? connais pas ... Je dessine dans l'évènement Paint, directement
sur le controle...
en récupérant l'objet graphics ...
J'utilise le clear de l'objet graphics par ce que je ne sait pas quoi
utiliser d'autre !!!
GDI+ est tres flou dans msdn essayer de faire quelque chose n'ai pas chose
aisée !
j'y arrive mais le résultat n'est pas toujours celui attendu....
voici le code ( que je te donne aussi pour la question que j'ai posé sur
la transparence ) :
Private GValeur, GMax, GMin As Integer
Public Property Valeur() As Integer
Get
Return GValeur
End Get
Set(ByVal Value As Integer)
GValeur = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Max() As Integer
Get
Return GMax
End Get
Set(ByVal Value As Integer)
GMax = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Min() As Integer
Get
Return GMin
End Get
Set(ByVal Value As Integer)
GMin = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Private Sub Jauge_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
DrawJauge(e.Graphics)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
SurfaceDeDessin.Clear(Me.BackColor)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width -
1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / GMax
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
End Sub
J'ai vu que certaines personnes utilisait un objet bmp, il dessine dans le
fichier bmp puit dessinent le bmp sur le controle.
Est-ce une bonne méthode ? moi je trouve ca un peu contraignant
"David Bouchard" a écrit dans le message de
news:Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: uxP$humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a
écrit dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
OnPaint ? connais pas ... Je dessine dans l'évènement Paint, directement
sur le controle...
en récupérant l'objet graphics ...
J'utilise le clear de l'objet graphics par ce que je ne sait pas quoi
utiliser d'autre !!!
GDI+ est tres flou dans msdn essayer de faire quelque chose n'ai pas chose
aisée !
j'y arrive mais le résultat n'est pas toujours celui attendu....
voici le code ( que je te donne aussi pour la question que j'ai posé sur
la transparence ) :
Private GValeur, GMax, GMin As Integer
Public Property Valeur() As Integer
Get
Return GValeur
End Get
Set(ByVal Value As Integer)
GValeur = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Max() As Integer
Get
Return GMax
End Get
Set(ByVal Value As Integer)
GMax = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Min() As Integer
Get
Return GMin
End Get
Set(ByVal Value As Integer)
GMin = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Private Sub Jauge_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
DrawJauge(e.Graphics)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
SurfaceDeDessin.Clear(Me.BackColor)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width -
1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / GMax
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
End Sub
J'ai vu que certaines personnes utilisait un objet bmp, il dessine dans le
fichier bmp puit dessinent le bmp sur le controle.
Est-ce une bonne méthode ? moi je trouve ca un peu contraignant
"David Bouchard" <boutchmusic@hotmail.com> a écrit dans le message de
news: edvwAkEuEHA.2624@TK2MSFTNGP11.phx.gbl...
Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)alexandre.claverie@latelec.com#NOSPAM)> a écrit dans le
message de news: uxP$WM6tEHA.948@tk2msftngp13.phx.gbl...
humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" <boutchmusic@hotmail.com> a écrit dans le message de
news: OmdgTW5tEHA.1576@TK2MSFTNGP10.phx.gbl...
Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#alexandre.claverie@latelec.fr(@Anti-Spam)#> a
écrit dans le message de news: u$kIB00tEHA.3972@TK2MSFTNGP15.phx.gbl...
Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
OnPaint ? connais pas ... Je dessine dans l'évènement Paint, directement
sur le controle...
en récupérant l'objet graphics ...
J'utilise le clear de l'objet graphics par ce que je ne sait pas quoi
utiliser d'autre !!!
GDI+ est tres flou dans msdn essayer de faire quelque chose n'ai pas chose
aisée !
j'y arrive mais le résultat n'est pas toujours celui attendu....
voici le code ( que je te donne aussi pour la question que j'ai posé sur
la transparence ) :
Private GValeur, GMax, GMin As Integer
Public Property Valeur() As Integer
Get
Return GValeur
End Get
Set(ByVal Value As Integer)
GValeur = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Max() As Integer
Get
Return GMax
End Get
Set(ByVal Value As Integer)
GMax = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Min() As Integer
Get
Return GMin
End Get
Set(ByVal Value As Integer)
GMin = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Private Sub Jauge_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
DrawJauge(e.Graphics)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
SurfaceDeDessin.Clear(Me.BackColor)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width -
1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / GMax
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
End Sub
J'ai vu que certaines personnes utilisait un objet bmp, il dessine dans le
fichier bmp puit dessinent le bmp sur le controle.
Est-ce une bonne méthode ? moi je trouve ca un peu contraignant
"David Bouchard" a écrit dans le message de
news:Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: uxP$humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a
écrit dans le message de news: u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Imports System.Drawing.Drawing2D
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
#Region " Code généré par le Concepteur Windows Form "
Public Sub New()
MyBase.New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
_Valeur = 1
_Max = 1
_Min = 1
End Sub
'La méthode substituée Dispose du UserControl pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer
'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
Private _Valeur, _Max, _Min As Integer
Public Property Valeur() As Integer
Get
Return _Valeur
End Get
Set(ByVal Value As Integer)
_Valeur = Value
Me.Invalidate()
End Set
End Property
Public Property Max() As Integer
Get
Return _Max
End Get
Set(ByVal Value As Integer)
_Max = Value
Me.Invalidate()
End Set
End Property
Public Property Min() As Integer
Get
Return _Min
End Get
Set(ByVal Value As Integer)
_Min = Value
Me.Invalidate()
End Set
End Property
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
DrawJauge(e.Graphics)
e.Graphics.DrawImage(Bitmap, 0, 0)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / _Max
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width -
1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Pinceau.Dispose()
End Sub
End Class
Voici ton code corriger et tout fonctionne très bien. J'ai changé quelque
petite chose, comme par exemple, à la fin de ta fonction, tu dois libéré
les resource pour ton pinceau comme ceci.
Pinceau.Dispose()
Pour rafraichir l'état d'affichage d'un control, utilise toujours
me.Invalidate
La procédure OnPaint est en faite un overrides de la procédure de base de
usercontrol. Ceci fait presque que la même chose que ton code sauf que
habituellement, on utilise les évènement comme tu l'as fait seulement au
niveau du formulaire qui contient ce control. Mais lorsque tu hérite d'un
control, tu utilises toujours par convention les On... comme OnPaint,
OnClick puisque c'est eux qui vont appelé ton évènement Paint et Click
dans la formulaire qui contient ton control. Pour avoir la liste de ces
procédure, regarde dans le menu déroulant en haut à gauche du code, il y a
une section Overrides qui elle t'amène dans la liste de droite toute les
fonctions existantes associé à la classe que tu hérites. Ainsi, tu click
sur celle que tu veux et il te code automatiquement la fonction ou la
procédure vide. Pour ce qui est de ta question par rapport au bitmap, je
te répond que c'est très intéressant d'utiliser cette façon dans certain
cas puisque lorsque tu dessine quelque chose qui nécessite beaucoup de
traitement, il pourrait y avoir un scintillement comme tu ne veux pas que
ceci arrive. Donc, en dessinant directement dans la bitmap, ce problème
n'arrive pas puisque lors de l'appelle de ta méthode OnPaint, tu n'exécute
pas toute le traitement du dessin mais seulement la fonction qui dessine
une bitmap comme ceci.
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(Bitmap, 0, 0)
End Sub
Ainsi, si le traitement est très lourd du côté de la fonction de dessin,
l'image n'est pas affecté puisque la bitmap gardera l'aspect précédent
jusqu'à ce que la fonction de dessin est terminé. Voici de quoi le code
aurait l'air
Imports System.Drawing.Drawing2D
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
#Region " Code généré par le Concepteur Windows Form "
Public Sub New()
MyBase.New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
_Valeur = 1
_Max = 1
_Min = 1
_Bitmap = New Bitmap(Me.Width, Me.Height)
DrawJauge()
End Sub
'La méthode substituée Dispose du UserControl pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
_Bitmap.Dispose()
MyBase.Dispose(disposing)
End Sub
'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer
'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
Private _Valeur, _Max, _Min As Integer
Public Property Valeur() As Integer
Get
Return _Valeur
End Get
Set(ByVal Value As Integer)
_Valeur = Value
DrawJauge()
End Set
End Property
Public Property Max() As Integer
Get
Return _Max
End Get
Set(ByVal Value As Integer)
_Max = Value
DrawJauge()
End Set
End Property
Public Property Min() As Integer
Get
Return _Min
End Get
Set(ByVal Value As Integer)
_Min = Value
DrawJauge()
Me.Invalidate()
End Set
End Property
Private _Bitmap As Bitmap
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(_Bitmap, 0, 0)
End Sub
Private Sub DrawJauge()
Dim g As Graphics = Graphics.FromImage(_Bitmap)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / _Max
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
g.FillRectangle(Pinceau, JaugeRectangle)
g.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
g.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
g.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
g.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width - 1,
Me.Height - 1)
g.DrawLine(New Pen(Color.White), 0, Me.Height - 1, Me.Width - 1,
Me.Height - 1)
Pinceau.Dispose()
Me.Invalidate()
End Sub
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
_Bitmap = New Bitmap(Me.Width, Me.Height)
DrawJauge()
End Sub
End Class
Donc sur ce, j'espère t'avoir aider.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: %OnPaint ? connais pas ... Je dessine dans l'évènement Paint, directement
sur le controle...
en récupérant l'objet graphics ...
J'utilise le clear de l'objet graphics par ce que je ne sait pas quoi
utiliser d'autre !!!
GDI+ est tres flou dans msdn essayer de faire quelque chose n'ai pas
chose aisée !
j'y arrive mais le résultat n'est pas toujours celui attendu....
voici le code ( que je te donne aussi pour la question que j'ai posé sur
la transparence ) :
Private GValeur, GMax, GMin As Integer
Public Property Valeur() As Integer
Get
Return GValeur
End Get
Set(ByVal Value As Integer)
GValeur = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Max() As Integer
Get
Return GMax
End Get
Set(ByVal Value As Integer)
GMax = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Min() As Integer
Get
Return GMin
End Get
Set(ByVal Value As Integer)
GMin = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Private Sub Jauge_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
DrawJauge(e.Graphics)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
SurfaceDeDessin.Clear(Me.BackColor)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height -
1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0,
Me.Width - 1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / GMax
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
End Sub
J'ai vu que certaines personnes utilisait un objet bmp, il dessine dans
le fichier bmp puit dessinent le bmp sur le controle.
Est-ce une bonne méthode ? moi je trouve ca un peu contraignant
"David Bouchard" a écrit dans le message de
news:Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: uxP$humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a
écrit dans le message de news:
u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Imports System.Drawing.Drawing2D
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
#Region " Code généré par le Concepteur Windows Form "
Public Sub New()
MyBase.New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
_Valeur = 1
_Max = 1
_Min = 1
End Sub
'La méthode substituée Dispose du UserControl pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer
'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
Private _Valeur, _Max, _Min As Integer
Public Property Valeur() As Integer
Get
Return _Valeur
End Get
Set(ByVal Value As Integer)
_Valeur = Value
Me.Invalidate()
End Set
End Property
Public Property Max() As Integer
Get
Return _Max
End Get
Set(ByVal Value As Integer)
_Max = Value
Me.Invalidate()
End Set
End Property
Public Property Min() As Integer
Get
Return _Min
End Get
Set(ByVal Value As Integer)
_Min = Value
Me.Invalidate()
End Set
End Property
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
DrawJauge(e.Graphics)
e.Graphics.DrawImage(Bitmap, 0, 0)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / _Max
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width -
1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Pinceau.Dispose()
End Sub
End Class
Voici ton code corriger et tout fonctionne très bien. J'ai changé quelque
petite chose, comme par exemple, à la fin de ta fonction, tu dois libéré
les resource pour ton pinceau comme ceci.
Pinceau.Dispose()
Pour rafraichir l'état d'affichage d'un control, utilise toujours
me.Invalidate
La procédure OnPaint est en faite un overrides de la procédure de base de
usercontrol. Ceci fait presque que la même chose que ton code sauf que
habituellement, on utilise les évènement comme tu l'as fait seulement au
niveau du formulaire qui contient ce control. Mais lorsque tu hérite d'un
control, tu utilises toujours par convention les On... comme OnPaint,
OnClick puisque c'est eux qui vont appelé ton évènement Paint et Click
dans la formulaire qui contient ton control. Pour avoir la liste de ces
procédure, regarde dans le menu déroulant en haut à gauche du code, il y a
une section Overrides qui elle t'amène dans la liste de droite toute les
fonctions existantes associé à la classe que tu hérites. Ainsi, tu click
sur celle que tu veux et il te code automatiquement la fonction ou la
procédure vide. Pour ce qui est de ta question par rapport au bitmap, je
te répond que c'est très intéressant d'utiliser cette façon dans certain
cas puisque lorsque tu dessine quelque chose qui nécessite beaucoup de
traitement, il pourrait y avoir un scintillement comme tu ne veux pas que
ceci arrive. Donc, en dessinant directement dans la bitmap, ce problème
n'arrive pas puisque lors de l'appelle de ta méthode OnPaint, tu n'exécute
pas toute le traitement du dessin mais seulement la fonction qui dessine
une bitmap comme ceci.
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(Bitmap, 0, 0)
End Sub
Ainsi, si le traitement est très lourd du côté de la fonction de dessin,
l'image n'est pas affecté puisque la bitmap gardera l'aspect précédent
jusqu'à ce que la fonction de dessin est terminé. Voici de quoi le code
aurait l'air
Imports System.Drawing.Drawing2D
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
#Region " Code généré par le Concepteur Windows Form "
Public Sub New()
MyBase.New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
_Valeur = 1
_Max = 1
_Min = 1
_Bitmap = New Bitmap(Me.Width, Me.Height)
DrawJauge()
End Sub
'La méthode substituée Dispose du UserControl pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
_Bitmap.Dispose()
MyBase.Dispose(disposing)
End Sub
'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer
'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
Private _Valeur, _Max, _Min As Integer
Public Property Valeur() As Integer
Get
Return _Valeur
End Get
Set(ByVal Value As Integer)
_Valeur = Value
DrawJauge()
End Set
End Property
Public Property Max() As Integer
Get
Return _Max
End Get
Set(ByVal Value As Integer)
_Max = Value
DrawJauge()
End Set
End Property
Public Property Min() As Integer
Get
Return _Min
End Get
Set(ByVal Value As Integer)
_Min = Value
DrawJauge()
Me.Invalidate()
End Set
End Property
Private _Bitmap As Bitmap
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(_Bitmap, 0, 0)
End Sub
Private Sub DrawJauge()
Dim g As Graphics = Graphics.FromImage(_Bitmap)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / _Max
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
g.FillRectangle(Pinceau, JaugeRectangle)
g.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
g.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
g.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
g.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width - 1,
Me.Height - 1)
g.DrawLine(New Pen(Color.White), 0, Me.Height - 1, Me.Width - 1,
Me.Height - 1)
Pinceau.Dispose()
Me.Invalidate()
End Sub
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
_Bitmap = New Bitmap(Me.Width, Me.Height)
DrawJauge()
End Sub
End Class
Donc sur ce, j'espère t'avoir aider.
David
"AlexC" <#NOSPAM)alexandre.claverie@latelec.com#NOSPAM)> a écrit dans le
message de news: %23QkSCjRuEHA.2072@tk2msftngp13.phx.gbl...
OnPaint ? connais pas ... Je dessine dans l'évènement Paint, directement
sur le controle...
en récupérant l'objet graphics ...
J'utilise le clear de l'objet graphics par ce que je ne sait pas quoi
utiliser d'autre !!!
GDI+ est tres flou dans msdn essayer de faire quelque chose n'ai pas
chose aisée !
j'y arrive mais le résultat n'est pas toujours celui attendu....
voici le code ( que je te donne aussi pour la question que j'ai posé sur
la transparence ) :
Private GValeur, GMax, GMin As Integer
Public Property Valeur() As Integer
Get
Return GValeur
End Get
Set(ByVal Value As Integer)
GValeur = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Max() As Integer
Get
Return GMax
End Get
Set(ByVal Value As Integer)
GMax = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Min() As Integer
Get
Return GMin
End Get
Set(ByVal Value As Integer)
GMin = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Private Sub Jauge_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
DrawJauge(e.Graphics)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
SurfaceDeDessin.Clear(Me.BackColor)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height -
1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0,
Me.Width - 1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / GMax
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
End Sub
J'ai vu que certaines personnes utilisait un objet bmp, il dessine dans
le fichier bmp puit dessinent le bmp sur le controle.
Est-ce une bonne méthode ? moi je trouve ca un peu contraignant
"David Bouchard" <boutchmusic@hotmail.com> a écrit dans le message de
news: edvwAkEuEHA.2624@TK2MSFTNGP11.phx.gbl...
Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)alexandre.claverie@latelec.com#NOSPAM)> a écrit dans le
message de news: uxP$WM6tEHA.948@tk2msftngp13.phx.gbl...
humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" <boutchmusic@hotmail.com> a écrit dans le message de
news: OmdgTW5tEHA.1576@TK2MSFTNGP10.phx.gbl...
Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#alexandre.claverie@latelec.fr(@Anti-Spam)#> a
écrit dans le message de news:
u$kIB00tEHA.3972@TK2MSFTNGP15.phx.gbl...
Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses
Imports System.Drawing.Drawing2D
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
#Region " Code généré par le Concepteur Windows Form "
Public Sub New()
MyBase.New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
_Valeur = 1
_Max = 1
_Min = 1
End Sub
'La méthode substituée Dispose du UserControl pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer
'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
Private _Valeur, _Max, _Min As Integer
Public Property Valeur() As Integer
Get
Return _Valeur
End Get
Set(ByVal Value As Integer)
_Valeur = Value
Me.Invalidate()
End Set
End Property
Public Property Max() As Integer
Get
Return _Max
End Get
Set(ByVal Value As Integer)
_Max = Value
Me.Invalidate()
End Set
End Property
Public Property Min() As Integer
Get
Return _Min
End Get
Set(ByVal Value As Integer)
_Min = Value
Me.Invalidate()
End Set
End Property
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
DrawJauge(e.Graphics)
e.Graphics.DrawImage(Bitmap, 0, 0)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / _Max
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width -
1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Pinceau.Dispose()
End Sub
End Class
Voici ton code corriger et tout fonctionne très bien. J'ai changé quelque
petite chose, comme par exemple, à la fin de ta fonction, tu dois libéré
les resource pour ton pinceau comme ceci.
Pinceau.Dispose()
Pour rafraichir l'état d'affichage d'un control, utilise toujours
me.Invalidate
La procédure OnPaint est en faite un overrides de la procédure de base de
usercontrol. Ceci fait presque que la même chose que ton code sauf que
habituellement, on utilise les évènement comme tu l'as fait seulement au
niveau du formulaire qui contient ce control. Mais lorsque tu hérite d'un
control, tu utilises toujours par convention les On... comme OnPaint,
OnClick puisque c'est eux qui vont appelé ton évènement Paint et Click
dans la formulaire qui contient ton control. Pour avoir la liste de ces
procédure, regarde dans le menu déroulant en haut à gauche du code, il y a
une section Overrides qui elle t'amène dans la liste de droite toute les
fonctions existantes associé à la classe que tu hérites. Ainsi, tu click
sur celle que tu veux et il te code automatiquement la fonction ou la
procédure vide. Pour ce qui est de ta question par rapport au bitmap, je
te répond que c'est très intéressant d'utiliser cette façon dans certain
cas puisque lorsque tu dessine quelque chose qui nécessite beaucoup de
traitement, il pourrait y avoir un scintillement comme tu ne veux pas que
ceci arrive. Donc, en dessinant directement dans la bitmap, ce problème
n'arrive pas puisque lors de l'appelle de ta méthode OnPaint, tu n'exécute
pas toute le traitement du dessin mais seulement la fonction qui dessine
une bitmap comme ceci.
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(Bitmap, 0, 0)
End Sub
Ainsi, si le traitement est très lourd du côté de la fonction de dessin,
l'image n'est pas affecté puisque la bitmap gardera l'aspect précédent
jusqu'à ce que la fonction de dessin est terminé. Voici de quoi le code
aurait l'air
Imports System.Drawing.Drawing2D
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
#Region " Code généré par le Concepteur Windows Form "
Public Sub New()
MyBase.New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
_Valeur = 1
_Max = 1
_Min = 1
_Bitmap = New Bitmap(Me.Width, Me.Height)
DrawJauge()
End Sub
'La méthode substituée Dispose du UserControl pour nettoyer la liste des
composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
_Bitmap.Dispose()
MyBase.Dispose(disposing)
End Sub
'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer
'REMARQUE : la procédure suivante est requise par le Concepteur Windows
Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
Private _Valeur, _Max, _Min As Integer
Public Property Valeur() As Integer
Get
Return _Valeur
End Get
Set(ByVal Value As Integer)
_Valeur = Value
DrawJauge()
End Set
End Property
Public Property Max() As Integer
Get
Return _Max
End Get
Set(ByVal Value As Integer)
_Max = Value
DrawJauge()
End Set
End Property
Public Property Min() As Integer
Get
Return _Min
End Get
Set(ByVal Value As Integer)
_Min = Value
DrawJauge()
Me.Invalidate()
End Set
End Property
Private _Bitmap As Bitmap
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawImage(_Bitmap, 0, 0)
End Sub
Private Sub DrawJauge()
Dim g As Graphics = Graphics.FromImage(_Bitmap)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / _Max
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
g.FillRectangle(Pinceau, JaugeRectangle)
g.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
g.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height - 1)
g.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
g.DrawLine(New Pen(Color.White), Me.Width - 1, 0, Me.Width - 1,
Me.Height - 1)
g.DrawLine(New Pen(Color.White), 0, Me.Height - 1, Me.Width - 1,
Me.Height - 1)
Pinceau.Dispose()
Me.Invalidate()
End Sub
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
_Bitmap = New Bitmap(Me.Width, Me.Height)
DrawJauge()
End Sub
End Class
Donc sur ce, j'espère t'avoir aider.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: %OnPaint ? connais pas ... Je dessine dans l'évènement Paint, directement
sur le controle...
en récupérant l'objet graphics ...
J'utilise le clear de l'objet graphics par ce que je ne sait pas quoi
utiliser d'autre !!!
GDI+ est tres flou dans msdn essayer de faire quelque chose n'ai pas
chose aisée !
j'y arrive mais le résultat n'est pas toujours celui attendu....
voici le code ( que je te donne aussi pour la question que j'ai posé sur
la transparence ) :
Private GValeur, GMax, GMin As Integer
Public Property Valeur() As Integer
Get
Return GValeur
End Get
Set(ByVal Value As Integer)
GValeur = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Max() As Integer
Get
Return GMax
End Get
Set(ByVal Value As Integer)
GMax = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Public Property Min() As Integer
Get
Return GMin
End Get
Set(ByVal Value As Integer)
GMin = Value
DrawJauge(Me.CreateGraphics)
End Set
End Property
Private Sub Jauge_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
DrawJauge(e.Graphics)
End Sub
Private Sub DrawJauge(ByVal SurfaceDeDessin As Graphics)
SurfaceDeDessin.Clear(Me.BackColor)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, 0, Me.Height -
1)
SurfaceDeDessin.DrawLine(New Pen(Color.SlateGray), 0, 0, Me.Width - 1, 0)
SurfaceDeDessin.DrawLine(New Pen(Color.White), Me.Width - 1, 0,
Me.Width - 1, Me.Height - 1)
SurfaceDeDessin.DrawLine(New Pen(Color.White), 0, Me.Height - 1,
Me.Width - 1, Me.Height - 1)
Dim JaugeRectangle As New Rectangle(0, 0, Me.Width - 1, Me.Height - 1)
Dim Hauteur, Pourcentage As Integer
Pourcentage = (Valeur * 100) / GMax
Hauteur = (Pourcentage * (Me.Height - 1)) / 100
Hauteur = (Me.Height - 1) - Hauteur
Dim MaskRect As New Rectangle(0, 0, Me.Width, Hauteur)
Dim Pinceau As New LinearGradientBrush(JaugeRectangle, Color.Red,
Color.Lime, LinearGradientMode.Vertical)
SurfaceDeDessin.FillRectangle(Pinceau, JaugeRectangle)
SurfaceDeDessin.FillRectangle(New SolidBrush(Me.BackColor), MaskRect)
End Sub
J'ai vu que certaines personnes utilisait un objet bmp, il dessine dans
le fichier bmp puit dessinent le bmp sur le controle.
Est-ce une bonne méthode ? moi je trouve ca un peu contraignant
"David Bouchard" a écrit dans le message de
news:Mais pourquoi fais tu me.creategraphics.clear(color.white). J'ai
l'impression que c'est la le problème. De quels facon dessine tu sur ton
control, est-ce que tu dessine directement dans OnPaint.
David
"AlexC" <#NOSPAM)#NOSPAM)> a écrit dans le
message de news: uxP$humm ca n'arrange rien malheuresement ... :'(
"David Bouchard" a écrit dans le message de
news:Place dans le constructeur
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
David
"AlexC" <(@Anti-Spam)#(@Anti-Spam)#> a
écrit dans le message de news:
u$Bonjour,
Sur mon control utilisateur avant de tout redessiner je fait un
me.creategraphics.clear(color.white)
mais lorsque le rafraichissement est trop rapide il y a un effet de
"clignotement"
comment peut on eviter ceci ?
merci d'avance pour vos réponses