this slowpoke moves

Animate Mouse Cross & Show coordinates on Image

Das folgende Beispiel zeigt, wie man ein Fadenkreuz auf ein Image zeichnet, das der Maus folgt. Das Image sollte auf einem Panel liegen, damit der Double-Buffer-Effekt eine saubere Animation bildet.

private
    { Private declarations }
    BmpH, BmpV : TBitmap;
    OldX, OldY: Integer;
    procedure Cross(X, Y: Integer);
    
var
  Form1: TForm1;
  RectSaved : boolean = false;
  
//

procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel1.DoubleBuffered := true; // This prevents that the image is blinking
  Label1.Transparent := true;
  Label1.Font.Color := clNavy;

  Image1.Canvas.Brush.Color := clRed;
  Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
end;

procedure TForm1.Cross(X, Y: Integer);
begin
  Image1.Canvas.Pen.Color := clBlack;
  // Restore last image to erase line
  if RectSaved then
  begin
    Image1.Canvas.CopyRect(Rect(OldX - 5, 0, OldX + 5, BmpV.Height),
    BmpV.Canvas, Rect(0,0,BmpV.Width,BmpV.Height));
    Image1.Canvas.CopyRect(Rect(0, OldY - 5, BmpH.Width, OldY + 5),
    BmpH.Canvas, Rect(0,0,BmpH.Width,BmpH.Height));
    BmpH.Free;
    BmpV.Free;
  end;
  // Now save the image at new position for each line
  // horizontal line
  BmpH := TBitmap.Create;
  BmpH.Width := Image1.Width;
  BmpH.Height := 10;
  BmpH.Canvas.CopyRect(Rect(0,0,BmpH.Width,BmpH.Height),
  Image1.Canvas,Rect(0, Y - 5, BmpH.Width, Y + 5));
  // Vertical line
  BmpV := TBitmap.Create;
  BmpV.Width := 10;
  BmpV.Height := Image1.Height;
  BmpV.Canvas.CopyRect(Rect(0,0,BmpV.Width,BmpV.Height),
                 Image1.Canvas,Rect(X - 5, 0, X + 5, BmpV.Height));

  // Now draw the current position
  Image1.Canvas.MoveTo(0, Y);
  Image1.Canvas.LineTo(Image1.Width, Y);
  Image1.Canvas.MoveTo(X, 0);
  Image1.Canvas.LineTo(X, Image1.Height);

  RectSaved := true;
  OldX := X;
  OldY := Y;

  Label1.Left := X + 36;
  Label1.Top := Y - 15;
  Label1.Caption := '(X:' + IntToStr(X) + ' x Y:' + IntToStr(Y) +')';
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Cross(X, Y);
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate