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.

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top