我怎么在运行的状态下,动态地拖动TImage控件,并改变大小。
我用下面方法可以拖动button和其它控件,但对TImage却没有用!怎么办?procedure ManipulateControl(Control: TControl; Shift: TShiftState; X, Y, Precision: integer);
var SC_MANIPULATE: Word;
begin
  // 光标在控件的最左侧 
       if (X<=Precision) and (Y>Precision) and (Y<Control.Height-Precision)
  then begin
         SC_MANIPULATE  := $F001;
       end
  // 光标在控件的最右侧 
  else if (X>=Control.Width-Precision) and (Y>Precision) and (Y<Control.Height-Precision)
  then begin
         SC_MANIPULATE  := $F002;
       end
  // 光标在控件的最上侧 
  else if (X>Precision) and (X<Control.Width-Precision) and (Y<=Precision)
  then begin
         SC_MANIPULATE  := $F003;
       end
  // 光标在控件的左上角 
  else if (X<=Precision) and (Y<=Precision)
  then begin
         SC_MANIPULATE  := $F004;
       end
  // 光标在控件的右上角 
  else if (X>=Control.Width-Precision) and (Y<=Precision)
  then begin
         SC_MANIPULATE  := $F005;
       end
  // 光标在控件的最下侧 
  else if (X>Precision) and (X<Control.Width-Precision) and (Y>=Control.Height-Precision)
  then begin
         SC_MANIPULATE  := $F006;
       end
  // 光标在控件的左下角 
  else if (X<=Precision) and (Y>=Control.Height-Precision)
  then begin
         SC_MANIPULATE  := $F007;
       end
  // 光标在控件的右下角 
  else if (X>=Control.Width-Precision) and (Y>=Control.Height-Precision)
  then begin
         SC_MANIPULATE  := $F008;
       end
  // 光标在控件的客户区 ( 移动整个控件 )
  else if (X>5) and (Y>5) and (X<Control.Width-5) and (Y<Control.Height-5)
  then begin
         SC_MANIPULATE  := $F009;
       end
  else begin
         SC_MANIPULATE := $F000;
       end;
  if Shift=[ssLeft] then
  begin
    ReleaseCapture;
    Control.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
  end;
end;

解决方案 »

  1.   

    没有handle 的控件
    http://community.csdn.net/Expert/topic/3050/3050231.xml?temp=.5878717
      

  2.   

    to  lijinghe1(副乡长)(立党为公,执政为民)
    用这个方法确实能实现拖动,
    但我还要实现改变大小呀,怎么办?
      

  3.   

    用這個控件
    unit Resizer;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls;const
       GRIDDEFAULT = 4;type
       TResizer = class;
       TMover = class;   TMovingEvent = procedure(Sender: TResizer; var NewLeft, NewTop: integer) of object;
       TSizingEvent = procedure(Sender: TResizer; var NewLeft, NewTop, NewWidth, NewHeight: integer) of object;   TResizer = class(TComponent)
       protected
          FActive     : boolean;
          FControl    : TControl;
          Sizers      : TList;
          GroupMovers : TList;
          FGroup      : TWinControl;
          FGridX      : integer;
          FGridY      : integer;
          FOnSized    : TNotifyEvent;
          FOnSizing   : TSizingEvent;
          FOnMoved    : TNotifyEvent;
          FOnMoving   : TMovingEvent;
          Sizing      : boolean;
          Moving      : boolean;
          OrigSize    : TRect;
          NewSize     : TRect;
          DownX       : integer;
          DownY       : integer;
          FAllowSize  : boolean;
          FAllowMove  : boolean;
          FKeepIn     : boolean;
          FHotTrack   : boolean;
          OneMover    : TMover;
          CurMover    : TMover;
          procedure   Notification(AComponent: TComponent; Operation: TOperation); override;
          procedure   SetActive(b: boolean);
          procedure   SetControl(c: TControl);
          procedure   SetGroup(p: TWinControl);
          procedure   CreateSizers;
          procedure   CheckSizers;
          procedure   ShowSizers;
          procedure   HideSizers;
          procedure   SizerDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   SizerUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   SizerMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
          procedure   MoverDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   MoverUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          procedure   MoverMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
          procedure   DrawSizeRect(Rect: TRect);
          procedure   Calc_Size_Rect(SizerNum, dx, dy: integer);
          procedure   DoSizingEvent;
          procedure   Calc_Move_Rect(dx, dy: integer);
          procedure   DoMovingEvent;
          procedure   Constrain_Size;
          procedure   Constrain_Move;
          procedure   MoverKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
          procedure   DoSizeMove(var Key: Word; Shift: TShiftState; dx, dy: integer);
          procedure   CreateGroupMovers;
          procedure   CreateOneMover(m: TMover; c: TControl);
          function    FindMoverByBuddy(c: TControl): TMover;
       public
          constructor Create(AOwner: TComponent); override;
          destructor  Destroy; override;
       published
          property    Active: boolean read FActive write SetActive default True;
          property    ResizeControl: TControl read FControl write SetControl;
          property    ResizeGroup: TWinControl read FGroup write SetGroup;
          property    GridX: integer read FGridX write FGridX default GRIDDEFAULT;
          property    GridY: integer read FGridY write FGridY default GRIDDEFAULT;
          property    OnSized: TNotifyEvent read FOnSized write FOnSized;
          property    OnSizing: TSizingEvent read FOnSizing write FOnSizing;
          property    OnMoved: TNotifyEvent read FOnMoved write FOnMoved;
          property    OnMoving: TMovingEvent read FOnMoving write FOnMoving;
          property    AllowSize: boolean read FAllowSize write FAllowSize default True;
          property    AllowMove: boolean read FAllowMove write FAllowMove default True;
          property    KeepInParent: boolean read FKeepIn write FKeepIn default True;
          property    HotTrack: boolean read FHotTrack write FHotTrack;
       end;
      

  4.   

    TInvisWin = class(TPanel)     // This could also derive from TPanel
       protected
          procedure WndProc(var Message: TMessage); override;
          procedure CreateParams(var Params: TCreateParams); override;
          procedure WMDLGCode(var Message: TMessage); message WM_GETDLGCODE;
       public
          property  OnKeyDown;
       end;   TMover = class(TInvisWin)
       public
          Buddy     : TControl;
          procedure Show;
       end;
    procedure Register;implementationconst
       SIZE     = 6;
       HALFSIZE = SIZE div 2;type
       TSizer = class(TPanel)
       end;procedure Register;
    begin
      RegisterComponents('Samples', [TResizer]);
    end;// *****************************************************************
    // TInvisWinprocedure TInvisWin.WndProc(var Message: TMessage);
    var
       ps : TPaintStruct;
    begin
       case Message.Msg of
          WM_ERASEBKGND: Message.Result := 1;
          WM_PAINT: begin
             BeginPaint(Handle, ps);
             EndPaint(Handle, ps);
             Message.Result := 1;
          end;
       else
          inherited WndProc(Message);
       end;
    end;procedure TInvisWin.CreateParams(var Params: TCreateParams);
    begin
       inherited;
       Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
    end;procedure TInvisWin.WMDLGCode(var Message: TMessage);
    begin
       Message.Result := DLGC_WANTARROWS or DLGC_WANTALLKEYS;
    end;
    // *****************************************************************
    // TMoverprocedure TMover.Show;
    begin
       Assert(Buddy <> nil);
       BoundsRect := Buddy.BoundsRect;
       Parent     := Buddy.Parent;
       Visible    := True;
       BringToFront;
    end;
    // *****************************************************************
    // TResizerconstructor TResizer.Create(AOwner: TComponent);
    begin
       inherited;
       FActive      := True;
       FKeepIn      := True;
       FGridX       := GRIDDEFAULT;
       FGridY       := GRIDDEFAULT;
       FAllowSize   := True;
       FAllowMove   := True;
       GroupMovers  := TList.Create;
       Sizers       := TList.Create;   OneMover := TMover.Create(Self);
       CreateOneMover(OneMover, nil);   CreateSizers;
    end;destructor TResizer.Destroy;
    begin
       GroupMovers.Free;
       Sizers.Free;
       Sizers := nil;
       inherited;
    end;
      

  5.   

    procedure TResizer.Notification(AComponent: TComponent; Operation: TOperation);
    begin
       inherited;
       if csDestroying in ComponentState then exit;
       if (AComponent = ResizeControl) and (Operation = opRemove) then
          ResizeControl := nil;
    end;procedure TResizer.SetActive(b: boolean);
    begin
       if b<>FActive then begin
          FActive := b;
          CheckSizers;
       end;
    end;procedure TResizer.SetControl(c: TControl);
    begin
       if c <> FControl then begin      if c<>nil then begin
             if ResizeGroup<>nil then begin
                Assert(c.Parent = ResizeGroup, 'ResizeControl is not in ResizeGroup!');
                CurMover := FindMoverByBuddy(c);
             end else begin
                CurMover := OneMover;
                CurMover.Buddy := c;
             end;
             CurMover.Show;
          end;      FControl := c;
          CheckSizers;
       end;
    end;procedure TResizer.SetGroup(p: TWinControl);
    begin
       if p <> FGroup then begin
          FGroup := p;
          CreateGroupMovers;
       end;
    end;procedure TResizer.CreateGroupMovers;
    var
       i : integer;
       m : TMover;
       c : TControl;
    begin
       if csDesigning in ComponentState then exit;   // Clear out the old Movers
       for i := 0 to GroupMovers.Count-1 do
          TObject(GroupMovers[i]).Free;
       GroupMovers.Clear;   if ResizeGroup <> nil then begin
          for i := 0 to ResizeGroup.ControlCount-1 do begin
             c := ResizeGroup.Controls[i];
             if (c is TMover) or (c is TSizer) then continue;         m := TMover.Create(Self);
             CreateOneMover(m, c);
             GroupMovers.Add(m);
             m.Show;
          end;
       end;
    end;procedure TResizer.CreateSizers;
    var
       i : integer;
       p : TSizer;
    begin
       if csDesigning in ComponentState then exit;   for i := 0 to 7 do begin
          p := TSizer.Create(Self);
          Sizers.Add(p);      p.BevelOuter   := bvNone;
          p.Width        := SIZE;
          p.Height       := SIZE;
          p.Color        := clBlack;
          p.Caption      := '';
          p.Tag          := i;
          p.OnMouseDown  := SizerDown;
          p.OnMouseUp    := SizerUp;
          p.OnMouseMove  := SizerMove;
          p.TabStop      := False;      case i of
             0, 7  : p.Cursor := crSizeNWSE;
             2, 5  : p.Cursor := crSizeNESW;
             1, 6  : p.Cursor := crSizeNS;
             3, 4  : p.Cursor := crSizeWE;
          end;
       end;
    end;
      

  6.   

    procedure TResizer.CreateOneMover(m: TMover; c: TControl);
    begin
       m.OnMouseDown := MoverDown;
       m.OnMouseUp   := MoverUp;
       m.OnMouseMove := MoverMove;
       m.TabStop     := True;
       m.OnKeyDown   := MoverKeyDown;
       m.Buddy       := c;
    end;procedure TResizer.CheckSizers;
    begin
       if (ResizeControl<>nil) and Active and (not (csDesigning in ComponentState)) then
          ShowSizers
       else
          HideSizers;
    end;procedure TResizer.ShowSizers;
    var
       i : integer;
       p : TPanel;
       c : TControl;
    begin
       c := ResizeControl;
       Assert(c <> nil);   for i := 0 to 7 do begin
          p := TPanel(Sizers[i]);
          case i of
             0, 1, 2 : p.Top := c.Top - HALFSIZE;
             3,    4 : p.Top := c.Top + c.Height div 2 - HALFSIZE;
             5, 6, 7 : p.Top := c.Top + c.Height - HALFSIZE;
          end;      case i of
             0, 3, 5 : p.Left := c.Left - HALFSIZE;
             1,    6 : p.Left := c.Left + c.Width div 2 - HALFSIZE;
             2, 4, 7 : p.Left := c.Left + c.Width - HALFSIZE;
          end;
       end;   Assert(CurMover<>nil);
       CurMover.Show;   for i := 0 to Sizers.Count-1 do begin
          p := TPanel(Sizers[i]);
          p.Parent  := c.Parent;
          p.Visible := True;
          p.BringToFront;
       end;   if CurMover.HandleAllocated and CurMover.CanFocus then
          CurMover.SetFocus;
    end;procedure TResizer.HideSizers;
    var
       i : integer;
       p : TPanel;
    begin
       for i := 0 to Sizers.Count-1 do begin
          p := TPanel(Sizers[i]);
          p.Visible := False;
          p.Update;
       end;
       OneMover.Visible := False;
    end;procedure TResizer.SizerDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
       Sizing  := True;
       DownX   := X;
       DownY   := Y;
       HideSizers;
       ResizeControl.Parent.Update;
       ResizeControl.Update;
       OrigSize := ResizeControl.BoundsRect;
       NewSize  := OrigSize;
       DrawSizeRect(NewSize);
    end;procedure DoSwap(DoSwap: boolean; var a, b: integer);
    var
       t : integer;
    begin
       if DoSwap then begin
          t := a;
          a := b;
          b := t;
       end;
    end;procedure TResizer.SizerUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
       if NewSize.Right < NewSize.Left then
          DoSwap(True, NewSize.Right, NewSize.Left);
       if NewSize.Bottom < NewSize.Top then
          DoSwap(True, NewSize.Bottom, NewSize.Top);   Sizing := False;
       DrawSizeRect(NewSize);
       ResizeControl.Invalidate;
       ResizeControl.BoundsRect := NewSize;
       ShowSizers;
       if Assigned(OnSized) then OnSized(Self);
    end;procedure TResizer.SizerMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
       if Sizing then begin
          DrawSizeRect(NewSize);      if AllowSize then begin
             Calc_Size_Rect((Sender as TSizer).Tag, X - DownX, Y - DownY);
             DoSizingEvent;
          end;      DrawSizeRect(NewSize);
          if HotTrack then ResizeControl.BoundsRect := NewSize;
       end;
    end;procedure TResizer.DoSizingEvent;
    var
       tmpWid, tmpHgt  : integer;
    begin
       tmpWid := NewSize.Right - NewSize.Left;
       tmpHgt := NewSize.Bottom - NewSize.Top;
       if Assigned(OnSizing) then
          OnSizing(Self, NewSize.Left, NewSize.Top, tmpWid, tmpHgt);
       NewSize.Right  := NewSize.Left + tmpWid;
       NewSize.Bottom := NewSize.Top + tmpHgt;
    end;procedure GetNonClientOffset(h: THandle; var nx, ny: integer);
    var
       p : TPoint;
       R : TRect;
    begin
       p := Point(0, 0);
       Windows.ClientToScreen(h, p);
       Windows.GetWindowRect(h, R);
       nx := p.x - R.Left;
       ny := p.y - R.Top;
    end;procedure TResizer.DrawSizeRect(Rect: TRect);
    var
       h        : THandle;
       dc       : THandle;
       c        : TCanvas;
       nx, ny   : integer;
       OldPen   : TPen;
       OldBrush : TBrush;
    begin
       if HotTrack then exit;   h  := (ResizeControl.Parent as TWinControl).Handle;
       GetNonClientOffset(h, nx, ny);
       dc := GetWindowDC(h);
       try
          c := TCanvas.Create;
          c.Handle := dc;      OldPen := TPen.Create;
          OldPen.Assign(c.Pen);
          OldBrush := TBrush.Create;
          OldBrush.Assign(c.Brush);      c.Pen.Width := 2;
          c.Pen.Mode  := pmXOR;
          c.Pen.Color := clWhite;
          c.Brush.Style := bsClear;
          c.Rectangle(Rect.Left + nx, Rect.Top + ny, Rect.Right + nx, Rect.Bottom + ny);      c.Pen.Assign(OldPen);
          OldPen.Free;
          c.Brush.Assign(OldBrush);
          OldBrush.Free;      c.Handle := 0;
          c.Free;
       finally
          ReleaseDC(h, dc);
       end;
    end;procedure TResizer.Calc_Size_Rect(SizerNum, dx, dy: integer);
    begin
       dx := (dx div GridX) * GridX;
       dy := (dy div GridY) * GridY;   case SizerNum of
          0, 1, 2 : NewSize.Top    := OrigSize.Top + dy;
          5, 6, 7 : NewSize.Bottom := OrigSize.Bottom + dy;
       end;   case SizerNum of
          0, 3, 5 : NewSize.Left   := OrigSize.Left + dx;
          2, 4, 7 : NewSize.Right  := OrigSize.Right + dx;
       end;   if KeepInParent then Constrain_Size;
    end;
      

  7.   

    procedure TResizer.MoverDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
     if (mbRight = Button) then exit;
       CurMover := Sender as TMover;
       FControl := CurMover.Buddy;
       Assert(FControl<>nil);
       FControl.BringToFront;
       CurMover.BringToFront;   Moving := True;
       DownX := X;
       DownY := Y;
       HideSizers;
       ResizeControl.Parent.Update;
       ResizeControl.Update;
       OrigSize := ResizeControl.BoundsRect;
       NewSize  := OrigSize;
       DrawSizeRect(NewSize);
    end;procedure TResizer.MoverUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
       if (mbRight = Button) then exit;
       Moving := False;
       ResizeControl.BoundsRect := NewSize;
       CurMover.Invalidate;
       ResizeControl.Refresh;
       DrawSizeRect(NewSize);
       ShowSizers;
       if Assigned(OnMoved) then OnMoved(Self);
    end;procedure TResizer.Calc_Move_Rect(dx, dy: integer);
    begin
       NewSize := OrigSize;
       dx := (dx div GridX) * GridX;
       dy := (dy div GridY) * GridY;
       OffsetRect(NewSize, dx, dy);
       if KeepInParent then Constrain_Move;
    end;procedure TResizer.DoMovingEvent;
    var
       tmpWid, tmpHgt : integer;
    begin
       tmpWid := NewSize.Right - NewSize.Left;
       tmpHgt := NewSize.Bottom - NewSize.Top;
       if Assigned(OnMoving) then
          OnMoving(Self, NewSize.Left, NewSize.Top);
       NewSize.Right := NewSize.Left + tmpWid;
       NewSize.Bottom := NewSize.Top + tmpHgt;
    end;procedure TResizer.MoverMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    var
       dx, dy: integer;
    begin
       if Moving then begin
          DrawSizeRect(NewSize);      if AllowMove then begin
             dx := X - DownX;
             dy := Y - DownY;
             Calc_Move_Rect(dx, dy);
             DoMovingEvent;
          end;      DrawSizeRect(NewSize);
          if HotTrack then ResizeControl.BoundsRect := NewSize;
       end;
    end;procedure TResizer.Constrain_Size;
    var
       p : TWinControl;
    begin
       p := ResizeControl.Parent;   with NewSize do begin
          if Left < 0 then Left := 0;
          if Top < 0 then Top := 0;
          if Right > p.ClientWidth then Right := p.ClientWidth;
          if Bottom > p.ClientHeight then Bottom := p.ClientHeight;      if Right < Left + GridX then Right := Left + GridX;
          if Bottom < Top + GridY then Bottom := Top + GridY;
       end;
    end;procedure TResizer.Constrain_Move;
    begin
       if NewSize.Left < 0 then
          OffsetRect(NewSize, -NewSize.Left, 0);   if NewSize.Top < 0 then
          OffsetRect(NewSize, 0, -NewSize.Top);   if NewSize.Right > ResizeControl.Parent.ClientWidth then
          OffsetRect(NewSize, ResizeControl.Parent.ClientWidth - NewSize.Right, 0);   if NewSize.Bottom > ResizeControl.Parent.ClientHeight then
          OffsetRect(NewSize, 0, ResizeControl.Parent.ClientHeight - NewSize.Bottom);
    end;procedure TResizer.MoverKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
       if Active then begin
          case Key of
             VK_LEFT  : DoSizeMove(Key, Shift, -GridX,  0);
             VK_RIGHT : DoSizeMove(Key, Shift,  GridX,  0);
             VK_UP    : DoSizeMove(Key, Shift,  0, -GridY);
             VK_DOWN  : DoSizeMove(Key, Shift,  0,  GridY);
          end;
       end;
    end;procedure TResizer.DoSizeMove(var Key: Word; Shift: TShiftState; dx, dy: integer);
    begin
       if (ssCtrl in Shift) or (ssShift in Shift) then begin
          Key := 0;      NewSize := ResizeControl.BoundsRect;      if (ssCtrl in Shift) and AllowMove then begin
             OffsetRect(NewSize, dx, dy);
             if KeepInParent then Constrain_Move;
             DoMovingEvent;
          end;      if (ssShift in Shift) and AllowSize then begin
             NewSize.Right  := NewSize.Right + dx;
             NewSize.Bottom := NewSize.Bottom + dy;
             if KeepInParent then Constrain_Size;
             DoSizingEvent;
          end;      ResizeControl.BoundsRect := NewSize;
          ShowSizers;
       end;
    end;function TResizer.FindMoverByBuddy(c: TControl): TMover;
    var
       i : integer;
    begin
       Result := nil;
       for i := 0 to GroupMovers.Count-1 do
          if TMover(GroupMovers[i]).Buddy = c then
             Result := GroupMovers[i];
       Assert(Result <> nil);
    end;end.
      

  8.   

    to aiirii(ari-爱的眼睛) 
    高呀你这是通过绑定控件来实现的,也就是说一个Timage就需要一个TResizer,
    能不能专门做一个TResizeImage这样的控件呢?呵呵,
      

  9.   

    to aiirii(ari-爱的眼睛) 另外我发现一个BUG
    就是将TResizer 与一个控件关联后,设计状态时,那个控件就不响应鼠标了。
      

  10.   

    觉得Reizer是使用重画来实现移动的,所以移动之后控件本来的属性、相应也一起消失了,看到的更像是一个图,而不是原来的Image了,不知道对不对
      

  11.   

    如果对于button子类的wincontrol控件,只需要下边的就可以了,效果很好
    procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if ssCtrl in Shift then
      begin
        ReleaseCapture;
        TWinControl(Sender).Perform(wm_syscommand,$F012,0);
      end;
    end;
      

  12.   

    to  gallipot() ( )
    你说对了。可我恰恰不是wincontrol的子类,而是TImage
      

  13.   

    >>你这是通过绑定控件来实现的,也就是说一个Timage就需要一个TResizer,
    可動態綁定到不同的, 一個程序一個就夠了的>>就是将TResizer 与一个控件关联后,设计状态时,那个控件就不响应鼠标了。
    將 "那个控件"與 TResizer 解綁後, 就可以了
      

  14.   

    TResizer.XXcontrol := nil;
    如何不需要控制時
      

  15.   

    我用一楼介绍的方法,将其中的mousemove稍改了一下,可以支持改变大小了,勉强能应付,但总觉得不好。咳procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    const
    Precision =5;
    var
      Control: TControl;
      hh,ww: integer;
    begin
      Control := TControl(Sender);
      if (X>5) and (Y>5) and (X<Control.Width-5) and (Y<Control.Height-5)
      then begin
          Control.Cursor := crSizeAll;
          if df and (Shift = [ssLeft]) then
          begin
            TImage(Sender).Left:= TImage(Sender).Left -ox + Mouse.CursorPos.X;
            TImage(Sender).Top:= TImage(Sender).Top -oy + Mouse.CursorPos.Y;
            ox := Mouse.CursorPos.X;
            oy := Mouse.CursorPos.Y;
          end;
          end
     //光标在控件的最左侧
      else if (X<=Precision) and (Y>Precision) and (Y<Control.Height-Precision)
      then begin
        Control.Cursor := crSizeWE;
        if df and (Shift = [ssLeft]) then
        begin
            ww := Mouse.CursorPos.X -ox;
            TImage(Sender).Left:= TImage(Sender).Left -ox + Mouse.CursorPos.X;
            ox := Mouse.CursorPos.X;
            oy := Mouse.CursorPos.Y;
            TImage(Sender).width:= TImage(Sender).WIdth - ww;
           end
        end
      // 光标在控件的最右侧
      else if (X>=Control.Width-Precision) and (Y>Precision) and (Y<Control.Height-Precision)
      then begin
             Control.Cursor := crSizeWE;
             if df and (Shift =[ssLeft]) then
             begin
                ww := Mouse.CursorPos.X -ox;
                //TImage(Sender).Left:= TImage(Sender).Left -ox + Mouse.CursorPos.X;
                ox := Mouse.CursorPos.X;
                TImage(Sender).width:= TImage(Sender).WIdth + ww;
             end;
           end
      // 光标在控件的最上侧
      else if (X>Precision) and (X<Control.Width-Precision) and (Y<=Precision)
      then begin
             Control.Cursor := crSizeNS;
             if df and (Shift =[ssLeft]) then
             begin
                hh := Mouse.CursorPos.y -oy;
                TImage(Sender).top:= TImage(Sender).top -oy + Mouse.CursorPos.y;
                oy := Mouse.CursorPos.Y;
                TImage(Sender).height:= TImage(Sender).height - hh;
             end;
           end
      // 光标在控件的最下侧
      else if (X>Precision) and (X<Control.Width-Precision) and (Y>=Control.Height-Precision)
      then begin
             Control.Cursor := crSizeNS;
             if df and (Shift =[ssLeft]) then
             begin
                hh := Mouse.CursorPos.y -oy;
                //TImage(Sender).top:= TImage(Sender).top -oy + Mouse.CursorPos.y;
                oy := Mouse.CursorPos.Y;
                TImage(Sender).height:= TImage(Sender).height + hh;
             end;
           end
      // 光标在控件的客户区 ( 移动整个控件 )
      else begin
             Control.Cursor := crDefault;
           end;end;
      

  16.   

    self.Resizer1.ResizeControl := nil;这样解绑定.
      

  17.   

    我有一个奇怪的办法,虽然怪怪的,但应该实现你要的那个功能:
    建一个Panel,把Image把在Panel上面,把它的AutoSize设为True
    处理Image的MouseMove事件,在里面调用你那个程序
    procedure ManipulateControl(Control: TControl; Shift: TShiftState; X, Y, Precision: integer);
    但Control,要设为Panel。
    调用完后,写上Image.pictrue.bitmap.width:=Panel.width;
                Image.Picture.bitmap.height:=Panel.Height;
    事处处理结束
    看看这样的效果行不行
      

  18.   

    to  aiirii(ari-爱的眼睛) 可以帮忙解决一个问题吗?就是你的这个Tresizer控件有一个问题,移动时,总会在窗体上留下一些边框上的线条!
    可不可以帮改进一下?
    谢谢!!
      

  19.   

    我将DoubleBuffered := true也不管用。