je ne suis pas partisan de délivrer directement du code
Inviter à l'étude n'est pas de la prétention.
[quote]peut-on générer des boutons at run time ?Si "at run time" est "dynamiquement" : Oui./quoteOn est bien avancé !
Ne sachant pas la forme de la zone cliquable, j'ai donc soumis l'idée d'utiliser une région.Elle est circulaire, d'où la solution que j'ai adoptée.
Tu peux aussi créer une région dans ton image, un carré, un polygone,un cercle ou une ellipse selon tes besoins.Voici la form : chaque petit cercle dans la Picturebox du bas constitue une zone cliquable; un click gauche ou droit doit donner un résultat différent selon le cercle cliqué.
Si le clic se fait dans la région alors tu exécutes le code adéquat.
il faut quand même que le demandeur s'investisse un minimum, non ?Certainement, mais avec une réponse comme celle-là
[quote]peut-on générer des boutons at run time ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionFor i = 1 To 27 If PtInRegion(region(i), x, y) <> 0 Then Exit For next i ' If i = 28 Then Exit Sub Select Case i Case 1 ' Case 27 End Select
il faut quand même que le demandeur s'investisse un minimum, non ?Je me fie pour cela à l'historique des messages passés par le demandeur. On détecte assez vite son degré d'investissement.
Si j'ai bien compris tu as 27 zones cliquables. Tu dois donc avoir 27 conditions pour déterminer si le clic se fait dans un cercle avec un rayon de 10 pixels à partir du centre avec les calculs qui en découlent.Le hic est que je n'ai pas nécessairement 27 zones, ce nombre est variable, je ne peux donc pas les créer au moment du Form_Load.
Avec la fonction CreateEllipticRgn, dans Initialize ou Form_Load, tu peux indexer dans une boucle tes 27 zones.
Ensuite dans l'évènement Mouse_Down de ta Picture une simple boucle permet de savoir dans quelle zone tu as cliqué.
For j = 1 To N2 For i = 1 To N1 SrcNr = (j - 1) * N1 + i Sources(SrcNr, 1) = X0 - D1 * (N1 - 1) / 2 + (i - 1) * D1 'x de la source Sources(SrcNr, 2) = Y0 - D2 * (N2 - 1) / 2 + (j - 1) * D2 'y de la source Graph(0).Circle (Sources(SrcNr, 1), Sources(SrcNr, 2)), 10, vbBlack 'Source : cercle central Next i Next j
Private Sub Graph_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) For i = 1 To N1 For j = 1 To N2 SrcNr = (j - 1) * N1 + i If ((X - Sources(SrcNr, 1)) ^ 2 + (Y - Sources(SrcNr, 2)) ^ 2) ^ 0.5 < 10 Then 'Distance entre click et source If Button = 1 Then 'action à prendre pour cette zone si on a cliqué à gauche ElseIf Button = 2 Then 'action à prendre pour cette zone si on a cliqué à droite End If End If Next j Next ice qui est finalement très simple
Un exemple codé, commenté et adapté à la question est un parfait moyen pour progresser.Oui, en cela je te rejoins totalement à condition bien sûr que le demandeur l'intègre totalement (ce qui est apparemment le cas de notre ami Herve_be) et ne se contente pas de le copier-coller sans réfléchir.
Private Type coord x As Integer y As Integer End Type Dim Sources(50) As coord For j = 1 To N2 For i = 1 To N1 SrcNr = (j - 1) * N1 + i Sources(SrcNr).x = X0 ... Sources(SrcNr).y = Y0 ... Graph(0).Circle (Sources(SrcNr).x, Sources(SrcNr).y), 10, vbBlack Next i Next j If ((x - Sources(SrcNr).x) ^ 2 + (y - Sources(SrcNr).y) ^ 2) ^ 0.5 < 10 Then
Private Type coordBonjour,
x As Integer
y As Integer
End Type
Dim Sources(50) As coord
...
Sources(SrcNr).x = X0 ...
Je trouve que c'est une manière élégante de coder et qui a le mérite de rendre le code plus explicitecertainement, et je te remercie de m'avoir appris cette méthode; je vais modifier en ce sens.
le but étant de rendre le code plus explicite et non pas d'en modifier son comportementC'est bien ce que j'attendais !