我试过下面的代码可以拖动,但是怎样让用户在图像的大小范围之内拖动,如果不控制用户可以托动的范围超过图像的大小,就看到底色,怎么处理??能不能大用户拖动时改变scrollbox的scrollbox1.VertScrollBar.Position,scrollbox1.HorzScrollBar.Position或激活滚动条的事件,各位高手有没有这样的代码?unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  XPos,YPos:integer;   //记录鼠标按下时位置
  CanMove:boolean; //判断是否可以移动
implementation{$R *.dfm}procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
    if  CanMove then
        begin
                Image1.Left:=Image1.Left+X-XPos;
                Image1.Top:=Image1.Top+Y-YPos;
        end;
end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    if (Button=mbLeft) then
        begin
                CanMove:=true;
                XPos:=X;
                YPos:=Y;
        end;
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    if (Button=mbLeft) then
        CanMove:=false;
end;end.

解决方案 »

  1.   

    if Canmove then
      begin
        if (Image1.Left+X-OldX>Width-Image1.Width) and (Image1.Left+X-OldX<0) then
        begin
          Image1.Left:=Image1.Left+X-OldX;
        end;
        if (Image1.Top+Y-OldY>Height-Image1.Height) and (Image1.Top+Y-OldY<0) then
        begin
          Image1.Top:=Image1.Top+Y-OldY;
        end;
      end;
      

  2.   

    OldX,OldY分别对应你的XPos,YPos
    最好在FormCreate事件中写入这样一行
    DoubleBuffered:=True;
      

  3.   

    能不能让用户拖动时改变scrollbox的scrollbox1.VertScrollBar.Position,scrollbox1.HorzScrollBar.Position或激活滚动条的事件,各位高手有没有这样的代码?
      

  4.   

    //Unit Source
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, jpeg, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        ScrollBox1: TScrollBox;
        Image1: TImage;
        ScrollBar1: TScrollBar;
        ScrollBar2: TScrollBar;
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormCreate(Sender: TObject);
        procedure ScrollBar2Change(Sender: TObject);
        procedure ScrollBar1Change(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}var CanMove:boolean;
        OldX,OldY:Integer;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if Canmove then
      begin
        if (Image1.Left+X-OldX>ScrollBox1.Width-Image1.Width) and (Image1.Left+X-OldX<0) then
        begin
          Image1.Left:=Image1.Left+X-OldX;
          ScrollBar1.Position:=-Image1.Left;
        end;
        if (Image1.Top+Y-OldY>ScrollBox1.Height-Image1.Height) and (Image1.Top+Y-OldY<0) then
        begin
          Image1.Top:=Image1.Top+Y-OldY;
          ScrollBar2.Position:=-Image1.Top;
        end;
      end;
    end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      CanMove:=true;
      OldX:=X;
      OldY:=Y;
    end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      CanMove:=False;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ScrollBox1.DoubleBuffered:=True;
      ScrollBar1.Max:=Image1.Width-ScrollBox1.Width;
      ScrollBar2.Max:=Image1.Height-ScrollBox1.Height;
    end;procedure TForm1.ScrollBar2Change(Sender: TObject);
    begin
      Image1.Top:=-ScrollBar2.Position;
    end;procedure TForm1.ScrollBar1Change(Sender: TObject);
    begin
      Image1.Left:=-ScrollBar1.Position;
    end;end.//Form Source
    object Form1: TForm1
      Left = 210
      Top = 114
      AutoScroll = False
      Caption = 'Form1'
      ClientHeight = 446
      ClientWidth = 688
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object ScrollBox1: TScrollBox
        Left = 8
        Top = 8
        Width = 649
        Height = 377
        AutoScroll = False
        TabOrder = 0
        object Image1: TImage
          Left = 0
          Top = 0
          Width = 1024
          Height = 768
          Picture.Data = {
               //省去图形信息
          }
          Stretch = True
          OnMouseDown = Image1MouseDown
          OnMouseMove = Image1MouseMove
          OnMouseUp = Image1MouseUp
        end
      end
      object ScrollBar1: TScrollBar
        Left = 9
        Top = 384
        Width = 647
        Height = 17
        LargeChange = 10
        PageSize = 0
        TabOrder = 1
        OnChange = ScrollBar1Change
      end
      object ScrollBar2: TScrollBar
        Left = 655
        Top = 9
        Width = 17
        Height = 373
        Kind = sbVertical
        LargeChange = 10
        PageSize = 0
        TabOrder = 2
        OnChange = ScrollBar2Change
      end
    end
      

  5.   

    http://expert.csdn.net/Expert/topic/1306/1306342.xml?temp=.5650904参考一下