Come ottengo le coordinate del mouse quando si fa clic su un controllo?
Domanda
In un evento OnClick di TImage, vorrei estrarre le coordinate x, y del mouse. Li preferirei in relazione all'immagine, ma in relazione alla forma o alla finestra è altrettanto buono.
Soluzione
Mouse.CursorPos contiene il TPoint, che a sua volta contiene le posizioni X e Y. Questo valore è in coordinate globali, quindi puoi tradurre nel tuo modulo usando la routine ScreenToClient che tradurrà le coordinate dello schermo in coordinate della finestra.
Secondo il file della guida di Delphi, Windows.GetCursorPos può fallire, Mouse.CursorPos lo avvolge per generare una EOsException se fallisce.
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;
Altri suggerimenti
La proprietà Mouse.CursorPos
ti dirà la posizione corrente del mouse. Se il computer funziona in modo lento o se il programma è lento a rispondere ai messaggi, potrebbe non essere la stessa posizione del mouse quando si è verificato per la prima volta l'evento OnClick
. Per ottenere la posizione del mouse al momento in cui è stato fatto clic sul pulsante del mouse , utilizzare GetMessagePos
. Riporta coordinate dello schermo ; tradurre in coordinate client con TImage.ScreenToClient
.
L'alternativa è gestire da soli gli eventi OnMouseDown
e OnMouseUp
; i loro parametri includono le coordinate. Ricorda che entrambi devono verificarsi eventi affinché si verifichi un clic . Potresti anche voler rilevare le operazioni trascinamento , poiché probabilmente non vorrai considerare un trascinamento da conteggiare come un clic.
Come altri hanno già detto, puoi usare Mouse.CursorPos o la funzione GetCursorPos, ma puoi anche gestire l'evento OnMouseDown o OnMouseUp invece di OnClick. In questo modo ottieni i tuoi valori X e Y come parametri per il gestore dell'evento, senza dover effettuare chiamate di funzione extra.
Che ne dici di questo?
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;
L'ho trovato online da qualche parte una volta e l'ho salvato nel mio DB di codenippet :)
Questa pagina probabilmente risolverà comunque tutte le tue domande. Sembra che ci siano funzioni per passare dal client alle coordinate dello schermo e viceversa ecc.
Buona fortuna!