Evenement click sur polygone [Résolu]

lololilizozo 28 Messages postés jeudi 2 octobre 2008Date d'inscription 2 octobre 2012 Dernière intervention - 12 sept. 2012 à 22:10 - Dernière réponse : lololilizozo 28 Messages postés jeudi 2 octobre 2008Date d'inscription 2 octobre 2012 Dernière intervention
- 13 sept. 2012 à 21:02
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.
Afficher la suite 

Votre réponse

5 réponses

Utilisateur anonyme - 13 sept. 2012 à 19:20
+2
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 12 sept. 2012 à 23:05
0
Utile
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é
Commenter la réponse de cs_ShayW
Utilisateur anonyme - 13 sept. 2012 à 00:16
0
Utile
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
Commenter la réponse de Utilisateur anonyme
lololilizozo 28 Messages postés jeudi 2 octobre 2008Date d'inscription 2 octobre 2012 Dernière intervention - 13 sept. 2012 à 16:05
0
Utile
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.
Commenter la réponse de lololilizozo
lololilizozo 28 Messages postés jeudi 2 octobre 2008Date d'inscription 2 octobre 2012 Dernière intervention - 13 sept. 2012 à 21:02
0
Utile
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.
Commenter la réponse de lololilizozo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.