Fórum Reta de um ponto ate a posicao do mouse no mousemove #255194

20/10/2004

0

Eu tenho uma imagem, e quero que depois que o usuário clicar nela (mousedown), ao passar o mouse sobre ela (mousemove), ele trace uma reta temporária pontilhada do ponto que ele clicou até a posição do mouse. O problema é que essa reta tem que ser desenhada e apagada (voltando o que estava por baixo) a cada movimento do mouse.
Sei que existe o metodo DrawFocusRect do canvas, que faz exatamente isso so que com um retangulo. E para apaga-lo, é so dar outro DrawFocusRect para os mesmo pontos. Mas preciso disso para uma reta.
Desde ja agradeco qq ajuda,
Gabriela.


Gabriela

Gabriela

Responder

Posts

20/10/2004

Dbezerra

Olá, Gabriela! :)
Muito legal saber q mulheres de nomes tão bonitos também se interessam pelo Delphi. :D
Bom, acho q arrumei uma solução para o seu problema. Faça o seguinte:
No [b:31fbf7e6a0]private[/b:31fbf7e6a0] do form, declare uma variável booleana, por exemplo ´[b:31fbf7e6a0]Clicou[/b:31fbf7e6a0]´.
No evento ´[b:31fbf7e6a0]OnMouseDown[/b:31fbf7e6a0]´ da imagem, coloque o seguinte código:
Clicou := True; // Só pintar a linha quando o usuário clicar
Canvas.Brush.Color := clBtnFace; // Cor do formulário
Canvas.FillRect(ClientRect); // Limpa tudo que foi pintado no formulário
Image1.Repaint; // Redesenha a imagem
Canvas.Pen.Style := psDash; // Seta linha pra estilo pontinhado
Canvas.MoveTo(X, Y); // Posiciona a caneta do canvas na posição onde
// o usuário clicou.

No evento ´[b:31fbf7e6a0]OnMouseMove[/b:31fbf7e6a0]´ da imagem, coloque este código:
if Clicou then
Canvas.LineTo(X, Y); // pinta a linha desde aonde a caneta foi
// posicionada até aonde o mouse estiver posicionado no momento

E, por fim, no evento ´[b:31fbf7e6a0]OnMouseUp[/b:31fbf7e6a0]´ da imagem, coloque o código a seguir:
Clicou := False; // Faz com que ele não pinte caso o usuário não tenha
// clicado antes na imagem

Não sei se era exatamente isso que você queria, mas acho que isso deve te ajudar...

Um Abraço! :wink:


Responder

Gostei + 0

22/10/2004

Gabriela

Daniel, valeu pela atenção! ;)

Mas teste seu código e a reta continuava, não sumia...

Mas ja consegui resolver, vou colocar aqui se alguem precisar de alguma coisa parecida ( o segredo é colocar a caneta no mode PMNOT (ele pinta com as cores inversas a da imagem, e depois é so pintar por cima que volta ao normal!):

Foi mais ou menos assim:

clicou: integer;

inicializa clicou := 0;

OnMouseDown
  if clicou > 1 then
    begin
      Image1.Canvas.MoveTo(p1.X,p1.y);
      Image1.Canvas.LineTo(p2.x,p2.y);
    end;
  clicou := 1;
  p1.x := x;
  p1.y := y;

OnMouseMove
  image1.Canvas.Pen.Mode := pmNot;
  if clicou > 1 then
    begin
      Image1.Canvas.MoveTo(p1.X,p1.y);
      Image1.Canvas.LineTo(p2.x,p2.y);
    end;
  if clicou >=1 then
    begin
      p2.X := x;
      p2.Y := y;
    end;
  Image1.Canvas.MoveTo(p1.X,p1.y);
  Image1.Canvas.LineTo(x,y);
  inc(clicou);


Abraços, Gabriela.


Responder

Gostei + 0

22/10/2004

Marcelo Saviski

Uma outra solução que tb funcionaria, mas serve mais para o caso de se estar desenhando outra coisa que não possa ser apagada pelo processo inverso, uma imagem por exemplo, e que estivesse sendo movida/redimencionada, poderia-se criar um Bitmap temporário com as mesmas dimenções do Objeto aonde se estaria desenhando e copiar da tela para o Bitmap no MouseDown(sem o desenho da imagem que seria movida), redesenhar esse Bitmap na Tela e desenhar a Imagem sobre ele na tela no MouseMove, e opcionalmente liberar o Bitmap temporário no MouseUp ou mante-lo até o finalizar o programa para ser reutilizado.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar