Draw inefficace dans une PictureBox d'un TabPage

Résolu
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010 - 14 avril 2010 à 14:44
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010 - 15 avril 2010 à 10:49
Bonjour,

J'ai besoin de dessiner des lignes dans une PictureBox (contenant une image), dans une TabPage.

J'utilise donc pour cela la fonction DrawLine :

Dim g As Graphics
g = PictureBox3.CreateGraphics
g.DrawLine(.....)
g.Dispose()

Tout fonctionne sous une Form classique mais si je place ma PictureBox dans une TabPage, il ne se passe rien, ou plutôt il semble que le dessin se fasse mais qu'il disparraisse immédiatement. Je gère le dessin par l'événement Paint de la TabPage.

Petite précision, le dessin s'affiche dans la TabPage si je ne passe pas par une PictureBox, mais du coup, je n'ai pas le fond qu'il me faut (j'ai même du coup essayé en plaçant mon image dans le background de la TabPage et donc sans passer par une PictureBox mais c'est pareil).

Donc c'est lié à la TabPage (puisque dans une Form ça fonctionne) mais aussi à une image (puisque sans fond, ça fonctionne)...

Quelqu'un à t'il une idée du problème ???

Merci beaucoup et bonne journée !

9 réponses

lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
15 avril 2010 à 09:58
Bonjour,
Dans mon exemple, nous prenons une pictureBox de base et nous réécrivons sa méthode OnPaint (d'où le Overrides).

 MyBase.OnPaint(e)

Cela signifie que l'on demande à la méthode OnPaint de PictureBox de s'exécuter, ensuite nous rajoutons notre code.


Je me suis aperçu d'une petit erreur dans le code fournis hier, il faut remplacer cette ligne :
g = PictureBox3.CreateGraphics


Par :

g = e.Graphics


En effet, nous dessinons directement sur le graphic utilisé par la classe (Surtout il est illogique d'appelé une instance de classe dans la classe elle même)

Tu peux enlever :
g.Dispose()


On devrait se retrouver avec un code comme celui-ci :
Public Class pb
    Inherits PictureBox

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Cursor.Current = Cursors.WaitCursor

        Dim g As Graphics
        Dim i As Integer

        Dim BluePen As New Pen(Color.Blue, 2)
        Dim RedPen As New Pen(Color.Red, 2)
        Dim x0, y0 As Integer

        x0 = Me.Size.Width / 2
        y0 = Me.Size.Height / 2

        g = e.Graphics

        For i = 0 To Delta_uv_ord.Length - 1
            g.DrawLine(BluePen, x0, y0, CInt(x0 + Delta_uv_ord(i).up * 200), CInt(y0 + Delta_uv_ord(i).vp * 200))
        Next


        Cursor.Current = Cursors.Default


    End Sub

End Class



Bonne Prog
3
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
14 avril 2010 à 16:28
Bonjour,

Peut-on avoir le code complet? (Utilises les balises pour le code)


Si je comprend bien, tu as une pictureBox avec une image dedans et tu veux dessiner par dessus?

Bonne Prog
0
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010
14 avril 2010 à 16:43
0
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010
14 avril 2010 à 16:56
Salut lesdis,

Désolé, je n'ai donc pas été assez clair...
Je vais réessayer avant d'afficher le code car il est énorme... (utiliser les balises? )

Oui, je veux dessiner sur une PictureBox avec une image dedans.
Avec un DrawLine.
Le code fonctionne parfaitement mais pas dans une TabPage.
Et forcement, j'en ai besoin dans une TabPage, pas de bol...

Pour essayer de cerner le problème j'ai essayé plusieurs choses :
1/ Sans image de fond : pareil, NotOK
2/ Sans PictureBox (direct dans la TabPage) : OK
3/ Comme déjà dit, à l'extérieur d'une TabPage : OK

Donc en fait, la combinaison TabPage+PictureBox (avec ou sans image) n'affiche pas mes DrawLines (mais ils sont tracés, puis immédiatement ils disparraissent).

Allez, un petit bout de code tout de même :

Private Sub TabPage4_Paint(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage4.Paint
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010
14 avril 2010 à 16:59
Désolé, le message est parti...

La suite :

Private Sub TabPage4_Paint(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage4.Paint

Cursor.Current = Cursors.WaitCursor

Dim g As Graphics
Dim i As Integer

Dim BluePen As New Pen(Color.Blue, 2)
Dim RedPen As New Pen(Color.Red, 2)
Dim x0, y0 As Integer

x0 = PictureBox3.Size.Width / 2
y0 = PictureBox3.Size.Height / 2

g = PictureBox3.CreateGraphics

For i = 0 To Delta_uv_ord.Length - 1
g.DrawLine(BluePen, x0, y0, CInt(x0 + Delta_uv_ord(i).up * 200), CInt(y0 + Delta_uv_ord(i).vp * 200))
Next

g.Dispose()
Cursor.Current = Cursors.Default
End Sub
0
lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Dernière intervention 7 août 2020
14 avril 2010 à 17:50
Et en faisant un objet hérité de picturebox et en surchargeant la méthode paint?

Public Class MyPictureBox
Inherits PictureBox

 Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)

Cursor.Current = Cursors.WaitCursor

Dim g As Graphics
Dim i As Integer

Dim BluePen As New Pen(Color.Blue, 2)
Dim RedPen As New Pen(Color.Red, 2)
Dim x0, y0 As Integer

x0 = PictureBox3.Size.Width / 2
y0 = PictureBox3.Size.Height / 2

g = PictureBox3.CreateGraphics

For i = 0 To Delta_uv_ord.Length - 1
g.DrawLine(BluePen, x0, y0, CInt(x0 + Delta_uv_ord(i).up * 200), CInt(y0 + Delta_uv_ord(i).vp * 200))
Next

g.Dispose()
Cursor.Current = Cursors.Default
End Sub

End Class


Je ne pourrais faire de test avant demain n'ayant pas d'accès a VS aujourd'hui

Bonne Prog
0
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010
15 avril 2010 à 09:12
Merci lesdis !

Par contre j'avoue que je ne comprends pas ton code, je suis nul sur les objets hérités, je vais me renseigner la dessus. Parce que du coup, j'ai copié sauvagement ton code mais ça ne fonctionne pas...
0
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010
15 avril 2010 à 10:13
Ok, merci !!!

Ça fonctionne même dans mon code, sans héritage !

En modifiant :
ByVal e As System.Windows.Forms.PaintEventArgs
g = e.Graphics

T'es trop fort !

Merci beaucoup !!!

PS : personne ne répond à mon post http://www.vbfrance.com/forum/sujet-APPEL-DLL-SOUS-VB-2008-EXPRESS-DEVCPLUSPLUS-OK_1422710.aspx
t'aurais pas une idée vu que t'es trop fort
0
Feanor06 Messages postés 34 Date d'inscription jeudi 18 février 2010 Statut Membre Dernière intervention 23 juillet 2010
15 avril 2010 à 10:49
J'ai modifié le titre et le thème de mon autre post, du coup ça répond un peu !
http://www.vbfrance.com/forum/sujet-DEFINITION-POINT-ENTREE-SUR-DLL-CPLUSPLUS_1426198.aspx
0
Rejoignez-nous