Comment peut on diviser un TImage en plusieurs zones cliquable
Comment peut on diviser un TImage en plusieurs zones cliquable
qu'entends tu par diviser un timage en plusieurs zones cliquable ?
Bonjour,
Personnellement j'utiliserais l'évènement onclick de TIMage.
Je récupèrerait la position du click dans l'image. (Mous.CursorPos et TImage.Screentoclient)
Puis je testerais si le point "cliquer" est dans une zone "cliquable" (PtInRect).
je vous donne un exemple :
imaginons la carte de la france et que mon programme doit cliquez sur chaque petite zone de cette carte et déclencher un événement. Si je fais ça en récupérant les coordonnée de chaque point de la carte ,je pense que c'est pas tres une solution optimale
Ce que je proposais était de tester sur une région rectangulaire (ptinRect), et non sur un point de l'image.
Si vous désirer tester dans d'autre type de région c'est plus difficile.
Peut être pourriez vous créer des régions avec CreatePolyPolygonRgn (voir http://zewaren.developpez.com/delphi/regions/)
Et tester si le point ou vous avez cliquer est dans une des régions (PtInRegion) ?
La difficulté Dans ce cas est de définir les contours des régions sans laisser de troues dans la carte.
je connais cette fonction mais là, ça resout pas mon probleme, c'est pas du tout faisable. Il s'agit de toute une carte à decouper, il ya de quoi se ranger les ongles
Salut,
... suggestion :Comment peut on diviser un TImage en plusieurs zones cliquable
1) tu récupères le BitMap de ta carte de France
2) tu découpes ta carte de France en cartes plus petites en la recopiant dans des BitMap rectangulaires et plus petits,
3) puis tu places ces BitMap dans des TImage placés cote à cote sur ta Form de façon à reconstituer ta carte de France.
... et ça te donne des petites zones cliquables rectangulaires.
... difficile de faire plus simple.
Le découpage peut se faire soit avec un logiciel du type PaintShopPro, ou encore par programmation.
A+![]()
Une idée comme cela en passant .
Prenez non pas une mais deux image (de même taille).
La première image est l'image d'affichage.
La 2° image vas contenir les zones sous la forme la plus simple qui soit, une couleur par exemple( la zone1 est rouge, la zone2 est bleu etc.)
Lorsque vous cliquer sur votre image afficher, vous détecter la position du click.
A partir de votre position, vous regarder dans la deuxième image la couleur du pixel de la position.
Si couleur rouge --> Zone 1
Si couleur Bleu --> Zone 2
etc..
Pas très beaux comme programmation, mais définition des zones très simples.
Attention si le TImage d'affichage n'est pas à l'échelle 1, vous devrez convertir la position de click sur l'image d'affichage en position réeel dans l'image.
la c'est la solution la plus évidente, mais mon soucis est beaucoup plus, sur la lourdeur de l'application. Avec cette methode je dois avoir qlq chose comme 90 TBitmap, que je trouve maladroit à faire. C'est surtout ça mon soucis. A titre d'exemple, Windev propose un composant zone de cliquage tres souple.
Je voudrais obtenir le meme resultat sans passer par des composant externes.
J'avais pas lu le message de Jean françois , vous avez repondu pendant que je repondais à gilbert.
Re-Salut,
... le découpage des "N" BitMap's à partir du grand et le positionnement cote à cote des "N" TImage sur la Form peuvent se faire de façon dynamique par programmationla c'est la solution la plus évidente, mais mon soucis est beaucoup plus, sur la lourdeur de l'application. Avec cette methode je dois avoir qlq chose comme 90 TBitmap, que je trouve maladroit à faire. C'est surtout ça mon soucis. A titre d'exemple, Windev propose un composant zone de cliquage tres souple.
Je voudrais obtenir le meme resultat sans passer par des composant externes.
... et une fois que le code est prêt pour 1 seul BitMap il est quasiment achevé pour 90 BitMap's ou davantage.
A+![]()
Salut,
Il y a encore plus simple si tu peux te contenter de Zones rectangulaires suivant un maillage de wmX fois hmY pixels pour chaque zone :... code testé : marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 var xs,ys : integer; // récupération position de la souris dans le TImage nbX,nbY : integer; // Nombres de rangées/colonnes de zones procedure TfrmGenP.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin xs := X; ys := Y; end; // Identification du N° de la zone sur laquelle il a été cliqué : procedure TfrmGenP.Image1Click(Sender: TObject); var wmX, hmY : integer; // Taille d'une zone NumeroDeZoneCliquee : integer; begin nbX := 10; // < à modifier selon besoins nbY := 10; // < à modifier selon besoins wmX := Image1.width div nbX; hmY := Image1.height div nbY; NumeroDeZoneCliquee := ((ys div hmY) * nbY) + (xs div wmX) + 1; ShowMessage('Il a cliqué sur la Zone'+intToStr(NumeroDeZoneCliquee )); // renvoie Numéros depuis Zone1 à ZoneN end;
A+
P.S : Hier je devais avoir les neurones englués en proposant le découpage du BitMap en 90 BitMap's.
Partager