Comment puis-je obtenir les coordonnées de la souris lorsqu'un clic est effectué sur un contrôle?

StackOverflow https://stackoverflow.com/questions/826914

  •  05-07-2019
  •  | 
  •  

Question

Dans l'événement OnClick d'un TImage, j'aimerais extraire les coordonnées x, y de la souris. Je les préférerais par rapport à l'image, mais par rapport à la forme ou à la fenêtre est tout aussi bien.

Était-ce utile?

La solution

Mouse.CursorPos contient le point TPoint, qui contient à son tour les positions X et Y. Cette valeur est en coordonnées globales. Vous pouvez donc traduire dans votre formulaire à l'aide de la routine ScreenToClient qui convertira les coordonnées d'écran en coordonnées de fenêtre.

Selon le fichier d’aide de Delphi, Windows.GetCursorPos peut échouer, Mouse.CursorPos le recouvre pour générer une exception EOsException en cas d’échec.

var
  pt : tPoint;
begin
  pt := Mouse.CursorPos; 
  // now have SCREEN position
  Label1.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
  pt := ScreenToClient(pt);
  // now have FORM position
  Label2.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
end;

Autres conseils

La propriété Mouse.CursorPos vous indiquera la position actuelle de la souris. Si l'ordinateur fonctionne mal ou si votre programme est lent à répondre aux messages, il se peut que ce ne soit pas la même chose que la position de la souris lorsque l'événement OnClick s'est produit pour la première fois. Pour obtenir la position de la souris au moment où le bouton de la souris a été cliqué , utilisez GetMessagePos . Il rapporte les coordonnées de l'écran ; traduire les coordonnées du client avec TImage.ScreenToClient .

L’alternative consiste à gérer vous-même les événements OnMouseDown et OnMouseUp ; leurs paramètres incluent les coordonnées. N'oubliez pas que les deux événements doivent se produire pour qu'un clic se produise. Vous pouvez également vouloir détecter les opérations glisser , car vous ne voudriez probablement pas considérer un glisser comme un clic.

Comme d'autres l'ont déjà dit, vous pouvez utiliser Mouse.CursorPos ou la fonction GetCursorPos, mais vous pouvez également gérer simplement l'événement OnMouseDown ou OnMouseUp au lieu d'OnClick. De cette manière, vous obtenez vos valeurs X et Y en tant que paramètres de votre gestionnaire d’événements, sans avoir à faire d’appels de fonction supplémentaires.

Comment ça?

procedure TForm1.Button1Click(Sender: TObject);
var
MausPos: TPoint;
begin
  GetCursorPos(MausPos);
  label1.Caption := IntToStr(MausPos.x);
  label2.Caption := IntToStr(MausPos.y);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  SetCursorPos(600, 600);
end;

Trouvé ce site quelque part en ligne et l’a sauvegardé dans ma base de données de codesnippet:)

Cette page résoudra probablement toutes vos questions .. Il semble y avoir des fonctions permettant d’aller du client à l’écran, puis de revenir, etc.

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top