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.

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top