图 象 漫 游(50分)

  • 主题发起人 sundayyoung
  • 开始时间
S

sundayyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
图 象 漫 游 是 指 不 用 滚 动 条, 通 过 键 盘 或 者 鼠 标 控 制 图 象 的 移 动,
从 而 在 较 小 的 显 示 区 域 内 可 以 浏 览 图 象 的 任 何 部 分。
我将Image放在一个Panel上,并设定TImage 控 件 的AutoSize属性 True,Left 属性为0,
Top属性为0。
我的代码如下:(但运行后鼠标移到图象上图象就不见了,大家看看错在哪里?谢谢)
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
var
iX0,iY0: integer;
implementation

{$R *.DFM}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
iX0:=X;
iY0:=Y;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var iDeltaX,iDeltaY:integer;
begin
if ssLeft in Shift then
iDeltaX:= X - iX0;
iDeltaY:= Y- iY0;
if iDeltaX<>0 then
Image1.Left:=Image1.Left+iDeltaX;
if iDeltaY<>0 then
Image1.Top:=Image1.Top+iDeltaY;
end;
end.
 
unit bmpmove;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Image1: TImage;
Label1: TLabel;
procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
origin:Tpoint;
image_left:integer;
image_top:integer;
visa1:Tpoint; //(鼠标当前位置相对图像右下角的坐标)
visa2:Tpoint; //(鼠标当前位置相对图像左上角的坐标)
canmove:boolean;

implementation

{$R *.DFM}

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
begin
origin.x:=X;
origin.y:=Y;
image_left:=image1.left;
image_top:=image1.top;
visa1.x:=X-(image1.width-panel2.width+image1.left);
visa1.y:=Y-(image1.height-panel2.height+image1.top);
visa2.x:=X-image1.left;
visa2.y:=Y-image1.top;
canmove:=true;
end;

end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if canmove then
begin
if X< visa1.x then X:=visa1.x;
if X>visa2.x then X:=visa2.x;
if Y< visa1.y then Y:=visa1.y;
if Y>visa2.y then Y:=visa2.y;
image1.left:=image_left+(X-origin.x);
image1.top:=image_top+(Y-origin.y);
end;
end;

procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
canmove:=false;
end;

end.
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var iDeltaX,iDeltaY:integer;
begin
if ssLeft in Shift then
Begin///////////////////////Add Begin
iDeltaX:= X - iX0;
iDeltaY:= Y- iY0;
if iDeltaX<>0 then
Image1.Left:=Image1.Left+iDeltaX;
if iDeltaY<>0 then
Image1.Top:=Image1.Top+iDeltaY;
End;///////////////////////Add End;
end;
end.
 
首先要把iX0,iY0初始化为-1
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var iDeltaX,iDeltaY:integer;
begin
if ssLeft in Shift then // 此处应加上开始判断iX0/iY0不为-1

在MouseUp中将iX0 iY0重设为-1

 
接受!谢谢!
 
顶部