OVH Cloud OVH Cloud

Redessiner une zone

6 réponses
Avatar
AlexC
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

6 réponses

Avatar
David Bouchard
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



Avatar
AlexC
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







Avatar
David Bouchard
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











Avatar
AlexC
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















Avatar
David Bouchard
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



















Avatar
AlexC
Oui merci cela deviens plus clair :)
Je pense maintenant pouvoir me débrouiller :) Même si tout ne marche pas à
merveille ( icone et transparence )
mais bon je finirais bien par trouver !

Merci beaucoup pour ton aide !

"David Bouchard" a écrit dans le message de news:

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