我想实现在程序运行期动态生成的image和shape控件,能够通过鼠标达到移动,看了一下方法,有mousedown和mousemove事件,但不起作用。原因是他们都是从tcontrol继承下来的Tgraphiccontrol控件,没有自己的句柄,只有父窗口的,那我想实现这样的功能,该怎么处理???最好有源码,谢了!!
很急~~分不够再加!!!

解决方案 »

  1.   

    利用form的mousedown和mousemove事件
      

  2.   

    把IMage放到一个Panel里,然后在Image的MOuseDown事件里代码
    Panel的autosize设置trueprocedure TFmMain.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ReleaseCapture ;
      Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
    end;
      

  3.   

    引用自 bcb版的 季老大其实很简单,不需要写什么程序:  
      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;  
      }
      

  4.   

    对于楼主要求的无hanle的control非常有效. :)
      

  5.   

    void  __fastcall  TForm1::Image1EndDock(TObject  *Sender,  TObject  *Target,  
                  int  X,  int  Y)  
      {  
              ((TControl*)Sender)->HostDockSite  =  (TWinControl*)0xFFFFFFFF;  
      }
    在delphi里怎么写,尤其是(TWinControl*)0xFFFFFFFF;  这句话??
      

  6.   

    不行,jjwwang
    我试了一个,这个好像是Delphi中的停靠技术,我要的是动态增加的控件能够在比方说在容器panel上随鼠标点中进行移动。
    wintergoes(多来米饭少来稀) 的方法是可以,但是我希望通过中间的窗口去实现,因为我的程序那样会复杂,新增删除可能还要考滤中间的panel。
      

  7.   

    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;
      

  8.   

    新建工程,添加一个Image,随意加载一个图片即可使用以下代码测试:unit Unit1;interfaceuses
      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.
      

  9.   

    新建一个工程,窗体上放一个image控件,然后写下面两个事件即可:
    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;
      

  10.   

    使用Panel来实现,也可以上找找控件
      

  11.   

    难道动态生成的跟从控件面板上拖下来的IMAGE不一样?
    我一道在用我的代码,工作的很好啊.