Image et "hyperlien" (?)

Image et "hyperlien" (?) - C++ - Programmation

Marsh Posté le 23-04-2003 à 19:28:58    

Salut,
 
alors voilà mon problème:
 
je programme avec Borland C++ Builder 6.0 et dans une fenêtre j'affiche une image grâce au composant TImage, sur laquelle j'ajoute des petits cercles dont les coordonnées me sont données par un fichier, grâce à la commande
 

Code :
  1. Image1->Canvas->Ellipse(X-4,Y+4,X+4,Y-4);


 
Et là tout se passe bien... Mais je voudrais maintenant permettre à l'utilisateur de cliquer sur ces cercles pour enchainer une autre action.
 
La seule méthode à laquelle j'ai pensé serait, dans l'évenement MouseMove, de localiser les coordonnées de la souris sur l'image, et de lancer une boucle for() pour vérifier si les coordonnées du point survolé actuellement font référence aux coordonnées d'un point contenu dans un vecteur, rempli au fur et à mesure de l'affichage de ces cercles...
 
Mais comme mon fichier pourra contenir à peu près une centaine de ces points, j'ai peur que ça soit trop long à vérifier...
 
Je vous demande donc si vous connaissez une autre méthode pour arriver au même résultat...
 
Merci d'avance!!

Reply

Marsh Posté le 23-04-2003 à 19:28:58   

Reply

Marsh Posté le 23-04-2003 à 19:35:58    

C'est inutile de le faire chaque fois que la souris se déplace (MouseMove), mais seulement lorsqu'il y a un click :)  
 
Sinon, oui, je vois pas d'autre moyen. Il faut faire en sorte de calculer facilement le cercle correspondant au click [:proy]

Reply

Marsh Posté le 23-04-2003 à 20:30:44    

mrBebert a écrit :

C'est inutile de le faire chaque fois que la souris se déplace (MouseMove), mais seulement lorsqu'il y a un click :)


 
Je pense quand même garder l'évenement MouseMove si je veux changer la forme du curseur au moment où il passe sur l'un des points...

Reply

Marsh Posté le 23-04-2003 à 23:37:19    

Bon alors le code suivant me fait un truc bizarre:
 

Code :
  1. void __fastcall TAnalyseShootsForm::Image1MouseMove(TObject *Sender,
  2.       TShiftState Shift, int X, int Y)
  3. {
  4. //A chaque déplacement de la souris, on vérifie si les coordonnées
  5. //se trouvent au dessus d'un point du vecteur TableauShoots
  6. for (int i=0; i < TableauShoots.size(); i++)
  7. {
  8.         int TirX = TableauShoots.operator [](i).CoordX;
  9.         int TirY = TableauShoots.operator [](i).CoordY;
  10.         if (X < (TirX+4) && X > (TirX-4) && Y < (TirY+4) && Y > (TirY-4))
  11.                 Image1->Cursor = crHandPoint;
  12.         else
  13.                 Image1->Cursor = crDefault;
  14. }
  15. }


 
Ca marche, la souris change bien de forme, mais uniquement pour le dernier point du vecteur...
 
Quelqu'un peut m'expliquer ça?

Reply

Marsh Posté le 24-04-2003 à 00:10:33    

J'ai trouvé...
 
le problème est qu'à chaque mouvement de la souris la boucle est recalculée, et s'arrête sur le dernier élément de la boucle...
 
Le code correct est donc:
 

Code :
  1. void __fastcall TAnalyseShootsForm::Image1MouseMove(TObject *Sender,
  2.       TShiftState Shift, int X, int Y)
  3. {
  4. int ConfirmOK = 0;
  5. //A chaque déplacement de la souris, on vérifie si les coordonnées
  6. //se trouvent au dessus d'un point du vecteur TableauShoots
  7. for (int i=0; i < TableauShoots.size(); i++)
  8. {
  9.         int TirX = TableauShoots.operator [](i).CoordX;
  10.         int TirY = TableauShoots.operator [](i).CoordY;
  11.         if (X < (TirX+4) && X > (TirX-4) && Y < (TirY+4) && Y > (TirY-4))
  12.                 ConfirmOK = 1;
  13. }
  14. if (ConfirmOK == 1)
  15.         Image1->Cursor = crHandPoint;
  16. else
  17.         Image1->Cursor = crDefault;       
  18. }


 
Et là ça marche...

Reply

Marsh Posté le 24-04-2003 à 09:22:14    

haazheel a écrit :


 
Ca marche, la souris change bien de forme, mais uniquement pour le dernier point du vecteur...
 
Quelqu'un peut m'expliquer ça?


 
bhen si tu mets pas de break même après avoir trouvé une zone qui fera changer le curseur il parcourera les autres et remettra le curseur d'origine
Dans ta 2e solution un break permettrait d'arrêter la boucle quand on a trouvé, c'est tj ça de gagné


Message édité par antp le 24-04-2003 à 09:22:47

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed