Fórum TImage - Colocar ponto colorido no clique do mouse #349298

20/11/2007

0

Pessoal...

Tenho um componente TImage aonde eu vou clicar com o mouse sobre a imagem que se abrir (isso em vários pontos da imagem) e eu gostaria que a cada clique do mouse fosse colocado um ponto vermelho (pode ser qualquer cor).

Eu tentei assim:

Image.Picture.Bitmap.Canvas.Pen.Width := 1000;
Image.Picture.Bitmap.Canvas.Pixels[Pt.X,Pt.Y] := clRed;


Mas também não aconteceu nada.

Como eu faço isso?

Agradeço a ajuda de todos.


Marcos.gandin

Marcos.gandin

Responder

Posts

21/11/2007

Vitor Alcantara

Coloque no evento MouseMove da imagem.

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
  begin
    Image1.Picture.Bitmap.Canvas.Pen.Width := 10000;
    Image1.Picture.Bitmap.Canvas.Pixels[X ,Y ] := clRed;
  end;
end;


Eu acho que do jeito que estava você pegava o valor do ponteiro em relação ao form e não em relação a imagem.


Responder

Gostei + 0

21/11/2007

Vitor Alcantara

Nos testes em que fiz aqui me parece que a linha ´[b:b7ce98774b]Image1.Picture.Bitmap.Canvas.Pen.Width := 10000[/b:b7ce98774b]´ não faz diferença alguma.


Responder

Gostei + 0

21/11/2007

Marcos.gandin

Vitor

A linha [b:90c3782495]´Image1.Picture.Bitmap.Canvas.Pen.Width := 10000´[/b:90c3782495] era somente para aumentar o tamanho da caneta, mas eu também acho que não faz nenhuma diferença.

Obrigado por ajudar...vou testar e depois aviso o resultado.

Flw


Responder

Gostei + 0

21/11/2007

Marcos.gandin

Vitor...

Testei aqui e não aconteceu nada.
Pra você funcionou?


Responder

Gostei + 0

21/11/2007

Marcos.gandin

A única coisa que aconteceu foi eu deixar clicado o botão esquerdo do mouse e ir arrastando ele sobre a figura, aí foi pintando de vermelho, mas mesmo assim, não foi na posição que o ponteiro do mouse estava.

O que eu preciso é somente dar um clique na figura e deixar marcado um ponto, e esse ponto deveria ser bem visivel.


Responder

Gostei + 0

21/11/2007

Vitor Alcantara

Tenta isso no evento MouseDown;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
      Image1.Picture.Bitmap.Canvas.Brush.Color := clred;
      Image1.Picture.Bitmap.Canvas.Brush.Style := bsSolid;
      Image1.Picture.Bitmap.Canvas.Ellipse(x,y,x+10,y+10);
  end;
end;


Dessa forma ele cria um circulo onde você clicou na imagem.


Responder

Gostei + 0

21/11/2007

Vitor Alcantara

So complementando a idéia esse exemplo pode se aplicar perfeitamente para se desenhar na imagem (como um Primo pobre (bem pobre mesmo) do Paint por exemplo).
No evento MouseMove:

  if ssLeft in Shift then
  begin
     Image1.Picture.Bitmap.Canvas.Brush.Color := clBlack;
      Image1.Picture.Bitmap.Canvas.Brush.Style := bsSolid;
      Image1.Picture.Bitmap.Canvas.Pen.Style := psClear;      
      Image1.Picture.Bitmap.Canvas.Ellipse (x,y,x+10,y+10);
  end;

Enquanto estiver com o mouse precionado ele vai pintando a imagem.


Responder

Gostei + 0

21/11/2007

Vitor Alcantara

Quanto aos pontos não estarem na posição que você indicou, talvez seja por que sua tImagem esteja com a propriedade [b:49af5e7f7e]Strench[/b:49af5e7f7e] setada para [b:49af5e7f7e]true[/b:49af5e7f7e].


Responder

Gostei + 0

21/11/2007

Marcos.gandin

Vitor...

Agora os pontos ficaram maiores, mas a posição continua não sendo a mesma do ponteiro do mouse.

Verifiquei a propriedade Stretch ela está false.


Responder

Gostei + 0

21/11/2007

Marcos.gandin

Tentei fazer assim:

procedure TfrmImagem.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  pt: TPoint;
begin
  GetCursorPos(pt);
  pt := Image.ScreenToClient(pt); 

  if Button = mbLeft then
  begin
    Image.Picture.Bitmap.Canvas.Brush.Color := clBlue;
    Image.Picture.Bitmap.Canvas.Brush.Style := bsSolid;
    Image.Picture.Bitmap.Canvas.Ellipse(pt.X,pt.Y,pt.X+5,pt.Y+5);
  end;
end;


Mas os pontos ainda não estão nos lugares corretos...


Responder

Gostei + 0

21/11/2007

Vitor Alcantara

Estranho isso, testei do jeito que você postou por último e do outro jeito e ficou certo, a bolinha que cria sai exatamente na ponto da setinha do mouse, etedendo que ele começa dali da ponta do mouse caso você queira colocar a ponta do mouse exatamente no centro da bolinha dai você teria que diminuir o tamanho pra esquerda (x - tamanho pro lado) e do tamanho pra cima (y - tamanho pra cima), nos parametros left e top.

ex:

Image1.Picture.Bitmap.Canvas.Ellipse(pt.X - 2,pt.Y-2,pt.X+2,pt.Y+2);

No mais não sei o que pode estar errado.


Responder

Gostei + 0

21/11/2007

Marcos.gandin

Você pode me dizer exatamente o que está utilizando pra testar?
Ou seja, você criou um form novo, colocou um componente TImage, você carrega uma imagem no componente utilizando um TOpenPictureDialog, e coloca o código que eu postei aí no evento OnMouseDown do componente TImagem ???

É isso?


Responder

Gostei + 0

21/11/2007

Marcos.gandin

Você poderia me enviar esse projeto que você fez pra que eu dê uma olhada, por favor?

Poderia me enviar para o e-mail:
marcos.gandin@hotmail.com

Flw


Responder

Gostei + 0

21/11/2007

Vitor Alcantara

Olha ai o dfm

object Form1: TForm1
  Left = 0
  Top = 0
  AutoSize = True
  Caption = ´Form1´
  ClientHeight = 511
  ClientWidth = 708
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = ´Tahoma´
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 0
    Top = 0
    Width = 708
    Height = 511
    AutoSize = True
    OnMouseDown = Image1MouseDown
  end
  object Button1: TButton
    Left = 208
    Top = 32
    Width = 75
    Height = 25
    Caption = ´Button1´
    TabOrder = 0
    OnClick = Button1Click
  end
  object OpenPictureDialog1: TOpenPictureDialog
    Left = 344
    Top = 256
  end
end


Olha ai o Pas

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, ExtDlgs, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  Begin
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName );
  End;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin 
  
  if Button = mbLeft then
  begin
    Image1.Picture.Bitmap.Canvas.Brush.Color := clBlue;
    Image1.Picture.Bitmap.Canvas.Brush.Style := bsSolid;
    Image1.Picture.Bitmap.Canvas.Ellipse(X-2,Y-2,X+2,Y+2); 
  end;
end;

end.



Responder

Gostei + 0

21/11/2007

Marcos.gandin

Vitor...

Consegui acertar o meu projeto.
O que eu estava fazendo de errado não tinha nada a ver com o código, mas sim com a propriedade [b:d5780290c6]Center[/b:d5780290c6] que eu tinha setado como [b:d5780290c6]True[/b:d5780290c6] para que a imagem que fosse aberta, sempre se posicionasse no centro do componente.

Não sei se isso teria concerto...mas por hora está funcionando.

Valeu pela ajuda.
Obrigado mesmo.

Abraço...


Responder

Gostei + 0

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

Aceitar