Evenement click sur polygone [Résolu]

Signaler
Messages postés
28
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
2 octobre 2012
-
Messages postés
28
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
2 octobre 2012
-
bonjour a tous,
j'ai une petite question :
y a t'il moyen de rendre un polygone "clickable" ?
en fait j'aimerais dessiner plusieurs polygones dans un picturebox et declencher un evenement quand je click a l'interieur d'un des polygone.
bonne soiree,
laurent.

5 réponses


Tu peux faire le test rapidement en changeant un peu le code ci-dessus en celui-là (bon ça met un peu plus de temps mais ca reste acceptable) :

Option Strict On
Public Class Form1
    Dim rd As New Random

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.WindowState = FormWindowState.Maximized
        '301 formes
        For x = 0 To 300
            'liste de points
            Dim pts As New List(Of Point)
            'ajout des points
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))
            pts.Add(New Point(rd.Next(300), rd.Next(300)))

            'nouvelle instance de classe
            Dim pct As New clsPiece(pts, x.ToString)
            'paramètres
            With pct
                .BackColor = Color.FromArgb(rd.Next(255), rd.Next(255), rd.Next(255))
                .Location = New Point(rd.Next(1000), rd.Next(1000))
                .Size = New Size(300, 300)
            End With
            'événements
            AddHandler pct.MouseEnter, AddressOf pct_MouseEnter
            AddHandler pct.MouseLeave, AddressOf pct_MouseLeave
            AddHandler pct.Click, AddressOf pct_Click
            'ajout au formulaire
            Me.Controls.Add(pct)
        Next
    End Sub


    'événements picturebox
    Private Sub pct_Click(sender As Object, e As EventArgs)
        MessageBox.Show(DirectCast(sender, PictureBox).Name)
    End Sub

    Private Sub pct_MouseEnter(sender As Object, e As EventArgs)
        Cursor = Cursors.Hand
    End Sub

    Private Sub pct_MouseLeave(sender As Object, e As EventArgs)
        Cursor = Cursors.Default
    End Sub

End Class


Public Class clsPiece
    Inherits PictureBox

    Sub New(points As List(Of Point), Nom As String)
        Me.Name = Nom
        Dim _region(points.Count - 1) As Byte
        For x = 0 To points.Count - 1
            _region(x) = CType(Drawing2D.PathPointType.Line, Byte)
        Next
        'déclaration du graphic path
        Dim path As New Drawing2D.GraphicsPath(points.ToArray, _region)
        'régionage du picturebox
        Me.Region = New Region(path)
    End Sub

End Class
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
49
Salut
et declencher un evenement quand je click


pas trop compris
le click c'est un évènement
l'évènement click du piucturebox est relevé quand on clique le picture box

explique ce que tu veux faire
tu peux conserver les left top de tes polygones
et savoir quand tu cliques le picturebox selon
la position de la souris dans quel polygon tu as cliqué

Bonsoir,

Voici une soklution; elle vaut ce qu'elle vaut.
Tu peux te servir du régionage d'un contrôle cliquable pour arriver à tes fins. Tout dépend du nombre de polygones que tu veux dessiner.
Voici une solution qui pourra peut-être t'aider :
Option Strict On
Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        'nouveau picturebox (on peut prendre n'importe quel controle cliquable)
        Dim pct As New PictureBox With {.BackColor Color.Red, .Size Me.ClientSize}
        'abonnement aux événements
        AddHandler pct.Click, AddressOf pct_Click
        AddHandler pct.MouseEnter, AddressOf pct_MouseEnter
        AddHandler pct.MouseLeave, AddressOf pct_MouseLeave
        'liste de points
        Dim pts As New List(Of Point)
        'ajout des points
        pts.Add(New Point(5, 100))
        pts.Add(New Point(50, 10))
        pts.Add(New Point(100, 10))
        pts.Add(New Point(200, 100))
        pts.Add(New Point(200, 180))
        pts.Add(New Point(100, 200))
        pts.Add(New Point(20, 100))
        'type de liaison ligne
        Dim _region(pts.Count - 1) As Byte
        For x = 0 To pts.Count - 1
            _region(x) = CType(Drawing2D.PathPointType.Line, Byte)
        Next
        'déclaration du graphic path
        Dim path As New Drawing2D.GraphicsPath(pts.ToArray, _region)
        'régionage du picturebox
        pct.Region = New Region(path)
        'ajout au formulaire
        Me.Controls.Add(pct)
    End Sub

    'événements picturebox
    Private Sub pct_Click(sender As Object, e As EventArgs)
        MessageBox.Show("ok")
    End Sub

    Private Sub pct_MouseEnter(sender As Object, e As EventArgs)
        Cursor = Cursors.Hand
    End Sub

    Private Sub pct_MouseLeave(sender As Object, e As EventArgs)
        Cursor = Cursors.Default
    End Sub
End Class

Tu peux abonner tous tes contrôles 'régionnés' sur les mêmes événements.
Et pour savoir lequel à été sélectionné par l'utilisateur, tu peux faire un cast (DirectCast) de l'objet sender.

Salut ShayW
Messages postés
28
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
2 octobre 2012

bonjour et surtout merci beaucoup, c'est exactement ce que je voulais.
par contre est'il possible d'avoir beaucoup de "region" ?
dans mon cas je peux avoir 20 polygone comme je peux en avoir 300, c'est faisable avec cette methode?
en tout cas merci.
laurent.
Messages postés
28
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
2 octobre 2012

heuuu.... je crois que je t'aime !!!
ca c'est le top, j'ai plus qu'a l'adapter t c'est ok.
merci beaucoup.
laurent.