我以下代码是想当鼠标拖拽ShpST1是,松开鼠标后ShpST1在 鼠标当前位置 ,可是当我仅在ShpST1内拖拽时,会跑到莫名奇妙的位置,当拖拽在ShpST1外部时,则能满足要求?这是什么原因?怎样解决?
在ShpST1内拖拽时得到的位置X,Y不是Form1的X,Y吗?procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if (Sender is TShape) then
accept:=true;
end;
procedure TForm1.ShpST1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin if (Source is TShape) then
accept:=true;
end;procedure TForm1.ShpST1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
ShpST1.Brush.Color:=clHighLight; ShpST1.Left:=X-ShpST1.Width div 2;
ShpST1.Top:=Y-ShpST1.Height div 2;end;procedure TForm1.ShpST1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
(Sender as TShape).BeginDrag(false);
end;
在ShpST1内拖拽时得到的位置X,Y不是Form1的X,Y吗?procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if (Sender is TShape) then
accept:=true;
end;
procedure TForm1.ShpST1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin if (Source is TShape) then
accept:=true;
end;procedure TForm1.ShpST1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
ShpST1.Brush.Color:=clHighLight; ShpST1.Left:=X-ShpST1.Width div 2;
ShpST1.Top:=Y-ShpST1.Height div 2;end;procedure TForm1.ShpST1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
(Sender as TShape).BeginDrag(false);
end;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
ReleaseCapture();
SendMessage( Button1->Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
//---------------------------------------------------------------------------
begin
ShpST1.Brush.Color:=clHighLight; ShpST1.Left:=X-ShpST1.Width div 2;
ShpST1.Top:=Y-ShpST1.Height div 2;end;
这个中的X和Y是屏幕的坐标,不是Form的坐标
P: TPoint;
begin
P := Form1.ScreenToClient(Point(X, Y));
ShpST1.Left:=P.X-ShpST1.Width div 2;
ShpST1.Top:=P.Y-ShpST1.Height div 2;
//...