var FPoint: TPoint;procedure TimgForm.imgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TImage).Tag := 1; FPoint.X := X; FPoint.Y := Y; end;procedure TimgForm.imgMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin with Sender as TImage do begin if Tag = 1 then begin Left := Left + X - FPoint.X; Top := Top + Y - FPoint.Y; end; end; end;procedure TimgForm.imgMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TImage).Tag := 0; end;
Panel的autosize设置trueprocedure TFmMain.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture ;
Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
end;
1. 设定Image的属性DragKind=dkDock; DragMode=dmAutomatic; 设定Form
的属性DockSite=true。
2. 在Image的事件OnEndDock里写一行代码就可以了:
void __fastcall TForm1::Image1EndDock(TObject *Sender, TObject *Target,
int X, int Y)
{
((TControl*)Sender)->HostDockSite = (TWinControl*)0xFFFFFFFF;
}
int X, int Y)
{
((TControl*)Sender)->HostDockSite = (TWinControl*)0xFFFFFFFF;
}
在delphi里怎么写,尤其是(TWinControl*)0xFFFFFFFF; 这句话??
我试了一个,这个好像是Delphi中的停靠技术,我要的是动态增加的控件能够在比方说在容器panel上随鼠标点中进行移动。
wintergoes(多来米饭少来稀) 的方法是可以,但是我希望通过中间的窗口去实现,因为我的程序那样会复杂,新增删除可能还要考滤中间的panel。
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TImage).Tag := 1;
FPoint.X := X;
FPoint.Y := Y;
end;procedure TimgForm.imgMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with Sender as TImage do
begin
if Tag = 1 then
begin
Left := Left + X - FPoint.X;
Top := Top + Y - FPoint.Y;
end;
end;
end;procedure TimgForm.imgMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TImage).Tag := 0;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
StartMousePos:TPoint;
StartImgPos:TPoint;
currMousePos:TPoint;
CurrImgPos:TPoint;
IsMoving:Boolean;
Procedure DrawCurrRect();
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DrawCurrRect;
var
aRect:TRect;
begin
//计算坐标
aRect.Left:=CurrMousePos.X-StartMousePos.X+StartImgPos.X;
aRect.Top:=CurrMousePos.y-StartMousePos.Y +StartImgPos.Y;
aRect.Right:=aRect.Left+Image1.Width;
aRect.Bottom:=aRect.Top+Image1.Height;
//画虚框
Self.Canvas.DrawFocusRect(aRect);
//移动图片位置:不建议这样用,这会使得系统响应速度变慢,并且效果不是很及时
//
//Image1.Left:=StartImgPos.X+(currMousePos.X-StartMousePos.X);
//Image1.Top:=StartImgPos.y+(currMousePos.y-StartMousePos.y);
end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
IsMoving:=True; //允许移动
//记录起点位置以及当前鼠标位置
StartMousePos.X:=x;
StartMousePos.Y:=y;
StartImgPos.X:=Image1.Left;
StartImgPos.Y:=Image1.Top;
CurrMousePos.X:=x;
CurrMousePos.Y:=y;
//画虚框
DrawCurrRect();
end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if IsMoving=True then
begin
DrawCurrRect(); //清除旧框
currMousePos.X:=x; //记录当前位置
currMousePos.Y:=y;
DrawCurrRect(); //画新框
end;
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
IsMoving:=False; //禁止移动
DrawCurrRect(); //清除旧框
CurrMousePos.X:=x; //记录当前位置
CurrMousePos.Y:=y;
//移动图片位置
Image1.Left:=StartImgPos.X+(currMousePos.X-StartMousePos.X);
Image1.Top:=StartImgPos.y+(currMousePos.y-StartMousePos.y);
end;end.
procedure TForm1.FormCreate(Sender: TObject);
begin
with TPanel.Create(Self) do begin
Name := 'ImgParentPanel';
Parent := Self;
Left := Image1.Left;
Top := Image1.Top;
BevelOuter := bvNone;
Caption := '';
AutoSize := True;
Show;
end;
Image1.Parent := TWinControl(Self.FindComponent('ImgParentPanel'));{附:想拖动图片移动窗体吗?注掉这句试试}
Image1.Picture.Assign(Application.Icon);
Image1.AutoSize := True;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ReleaseCapture;
TImage(Sender).Parent.Perform(WM_SysCommand, $F012, 10);
end;
我一道在用我的代码,工作的很好啊.