我试过下面的代码可以拖动,但是怎样让用户在图像的大小范围之内拖动,如果不控制用户可以托动的范围超过图像的大小,就看到底色,怎么处理??能不能大用户拖动时改变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.
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.
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;
最好在FormCreate事件中写入这样一行
DoubleBuffered:=True;
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