Meilleure methode pour afficher une forme sur une image

[Résolu]
Signaler
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonjour,

Je souhaite afficher une forme (cercle ou rectangle) sur une image.
L'affichage ou pas de la forme m'est donné par une connexion réseau.

Quelle est la meilleur méthode pour afficher cette forme ?

Merci de votre aide

Vincnet68

14 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Vu que tu utilises l'event _Paint,
pas besoin de faire un DrawRectangle dans ton Button2_Click

de plus, n'utilises pas :
Me.PictureBox1.CreateGraphic
utilises celui qui t'es fournit en parametre:
e.Graphics

au final, j'ai placé trois checkBoxes qui permettent d'afficher/masquer un rectangle :
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PictureBox1.ImageLocation = "C:\...\...jpg"
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        If CheckBox1.Checked Then
            e.Graphics.DrawRectangle(Pens.Red, 0, 0, 20, 20)
        End If
        If CheckBox2.Checked Then
            e.Graphics.DrawRectangle(Pens.Green, 40, 0, 20, 20)
        End If
        If CheckBox3.Checked Then
            e.Graphics.DrawRectangle(Pens.Blue, 80, 0, 20, 20)
        End If
    End Sub

    Private Sub CheckBox_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged
        PictureBox1.Invalidate()
    End Sub



Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
"Meilleure", c'est selon les contraintes que tu as...

mais pour dessiner un cercle :

msdn.microsoft.com/fr-fr/library/system.drawing.graphics.drawellipse(VS.80).aspx

et un rectangle:

msdn.microsoft.com/fr-fr/library/system.drawing.graphics.drawrectangle(VS.80).aspx

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
Salut Renfield,

Cette fonction (apparemment) ne peux être utilisé que sur un évenement "draw" d'un contrôle.

Mon but est de créer des objets forme lors du l'initialisation du programme que je peux rendre visible ou non par la suite.

Merci de ton aide.

Vincnet68
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Au pire, tu dessine, quand tu veux le supprimer, tu effaces et ne le redessine pas ^^


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
J'ai 64 éléments à afficher/enlever de manière totalement asynchrone. Ca ne vas pas être un peu lourd (et lent) de parcourir les 64 éléments ?

Merci.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
au contraire, ca me semble plus ideal.

a voir ce que sotn ces elements exactement, mais c'est toujours moins long de dessiner que de s'amuser a allourdir la form avec 64 controles que windows et le framework devront gérer de manière plus lourde


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
J'ai un phénomène bizzare. Il arrive que lorsque je dessine un rectangle il disparaisse aussitôt.
Pourtant je redessine tous mes rectangle sur l'évènement "paint".

Peux-tu m'aider

Merci


Vincnet68
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
Voilà le code
 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.PictureBox1.CreateGraphics.Clear(Color.White)
        Me.PictureBox1.Image = System.Drawing.Image.FromFile(Application.StartupPath & "" & "PC030001-2.jpg")
  Me.PictureBox1.CreateGraphics.DrawRectangle(Shape.Couleur, Shape.Localisation)
    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
      Me.PictureBox1.CreateGraphics.DrawRectangle(Shape.Couleur, Shape.Localisation)
    End Sub


Je ne comprends pas.

Merci @+
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
Nickel, Merci beaucoup.

Ca fonctionne à merveille.

Je pourrais dormir tranquillement (lol)

@+

Vincnet68
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
Salut Renfield,

J'ai un petit soucis, j'ai l'impression que mon programme pas sans arrêt dans l'évènement Paint de PictureBox.

Et je n'ai que 16 rectangles (j'en aurai plus de 64 au final)

As-tu une solution ?

Merci

@+

Vincnet68
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
a voir si tu ne provoque pas ce refresh...

quel est ton code ?

(simple a voir en breakpoint en regardant la callstack )

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
Pour être plus exact, il passe 39 fois dans l'évènement pas seconde (vite mesuré)
Messages postés
100
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
24 mai 2013
1
Voilà mon code
Private Sub DrawShapes(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        lblTest.Text = CInt(lblTest.Text) + 1
        Dim camera As ISDisplay_Host
        For Each camera In Me.Cameras
            Dim Shape As ShapeDisplay
            For Each Shape In camera.Shapes
                If Shape.Visible Then
                    e.Graphics.DrawRectangle(Shape.Couleur, Shape.Localisation)
                End If
            Next
        Next
    End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
le plus simple pour 'non pas savoir la cause' mais 'tenter de comprendre' est d'ajouter :

Debug.Print Date.Now

ainsi, tu aura dans la fenetre de sortie l'heure de chaque refresh.

Renfield - Admin CodeS-SourceS - MVP Visual Basic