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