放两个shape在一个窗体上
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Shape1: TShape;
Shape2: TShape;
procedure FormCreate(Sender: TObject);
procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
OriginalPos: TPoint; // 鼠标按下的位置
CurrentPos: TPoint; // 鼠标新位置
MouseLButtonDown: Boolean; // 标记鼠标左键是否按下
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
l: LongInt;
begin
l := GetWindowLong(Handle, GWL_EXSTYLE);
l := l or WS_EX_LAYERED;
SetWindowLong(Handle, GWL_EXSTYLE, l);
SetLayeredWindowAttributes(Handle, $00C8D0D4, 125, LWA_COLORKEY);
end;
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
MouseLButtonDown := True;
OriginalPos.x := X; // 鼠标按下的位置
OriginalPos.y := Y;
end;
end;
procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MouseLButtonDown then
begin
//画线
Refresh;//这是为了删除原来的线设置的,代码很不好,你自己寻求优化吧
//我这里就不细写了
Canvas.Pen.Color := clRed;
Canvas.MoveTo(Shape1.Left, Shape1.Top);
Canvas.LineTo(Shape2.Left, Shape2.Top);
CurrentPos.x := X; // 鼠标新位置
CurrentPos.y := Y;
with (sender as TShape) do
begin
Left := Left + CurrentPos.x - OriginalPos.x;
Top := Top + CurrentPos.y - OriginalPos.y;
end;
end;
end;
procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseLButtonDown := False;
end;
end.