Como faço para obter as coordenadas do mouse quando um controle é clicado?
Pergunta
No evento OnClick de um TImage, eu gostaria de extrair o x, y coordenadas do mouse. Eu preferiria-los em relação à imagem, mas em relação à forma ou janela é tão bom.
Solução
Mouse.CursorPos contém o TPoint, que por sua vez contém a posição X e Y. Este valor está em coordenadas globais, para que possa traduzir para o seu formulário usando a rotina ScreenToClient que se traduzirá coordenadas de tela para coordenadas da janela.
De acordo com o arquivo de ajuda Delphi, Windows.GetCursorPos pode falhar, Mouse.CursorPos envolve isso para levantar uma EOsException se ele falhar.
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;
Outras dicas
A propriedade Mouse.CursorPos
irá dizer-lhe a posição atual do mouse. Se o computador está executando lentamente, ou se o seu programa é lento para responder às mensagens, então ele pode não ser o mesmo que a posição do rato tinha quando o evento OnClick
ocorreu pela primeira vez. Para obter a posição do mouse no momento que o botão do mouse foi clicado , use GetMessagePos
. Ele informa coordenadas de tela ; se traduzem em coordenadas do cliente com TImage.ScreenToClient
.
A alternativa é lidar com a OnMouseDown
e eventos OnMouseUp
você mesmo; seus parâmetros incluem as coordenadas. Lembre-se que ambos eventos precisam ocorrer para que um clique para ocorrer. Você também pode querer detectar arrastar operações, já que você provavelmente não iria querer considerar um arraste para contar como um clique.
Como já foi dito, você pode usar Mouse.CursorPos ou os GetCursorPos funcionar, mas você também pode apenas manipular o evento OnMouseDown ou OnMouseUp vez de OnClick. Desta forma, você obter o seu valores X e Y como parâmetros para o manipulador de eventos, sem ter que fazer todas as chamadas de função extra.
Como sobre isso?
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;
Encontrado isso em algum lugar on-line uma vez e salva-lo em meu codesnippet DB:)
Esta página provavelmente vai resolver todas as suas questões no entanto .. . parece haver funções para ir do cliente ao coordenadas de tela e back etc ..
Boa sorte!