想實現類似ACDSEE看圖軟件放大,縮小,圖像漫游功能,以下是小弟的寫的代碼,
移動時出現問題(不能移動或者向相反方向移動),請各位大大指點指點. Pb1: 為PaintBox控件 放在ScrollBox控件中
img1: 為Image控件 PP: 為放大倍數
procedure TForm1.pb1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbleft then
begin
Canmove := True;
MouseOrg.X := X;
MouseOrg.Y := Y;
end;
end;procedure TForm1.pb1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
SrcRect,destRect: TRect;
MoveX,MoveY: Integer;
setX,setY: Integer;
begin
if Canmove then
begin
setX := X - MouseOrg.X;
setY := Y - MouseOrg.Y; if setX > 0 then //圖像左移顯示右邊看不到的部分
begin
if MouseOrg.X + setX + pb1.Width > (img1.Width * PP) then
MoveX := (img1.Width * PP) - pb1.Width ;
end
else
MoveX := MouseOrg.X + setX; if setX < 0 then //圖像右移顯示左邊看不到的部分
begin
if MouseOrg.X + setX < 0 then
MoveX := 0
else
MoveX := MouseOrg.X + setX;
end; if setY > 0 then //圖像上移顯示下邊看不到的部分
begin
if MouseOrg.Y + setY + pb1.Height > (img1.Height * PP) then
MoveY := img1.Height * PP - pb1.Height
else
MoveY := MouseOrg.Y + setY;
end;
if setY < 0 then //圖像下移顯示上邊看不到的部分
begin
if MouseOrg.Y + setY < 0 then
MoveY := 0
else
MoveY := MouseOrg.Y + setY;
end; SrcRect := Rect(MoveX div PP, MoveY div PP, (MoveX + pb1.Width) div PP,(MoveY + pb1.Height) div PP); //在原始圖片上截取的大小
destRect := Rect(0,0,pb1.Width,pb1.Height);
pb1.Canvas.CopyRect(destRect,img1.Canvas,SrcRect);
end;
end;procedure TForm1.pb1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Canmove then Canmove := False;
end;
移動時出現問題(不能移動或者向相反方向移動),請各位大大指點指點. Pb1: 為PaintBox控件 放在ScrollBox控件中
img1: 為Image控件 PP: 為放大倍數
procedure TForm1.pb1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbleft then
begin
Canmove := True;
MouseOrg.X := X;
MouseOrg.Y := Y;
end;
end;procedure TForm1.pb1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
SrcRect,destRect: TRect;
MoveX,MoveY: Integer;
setX,setY: Integer;
begin
if Canmove then
begin
setX := X - MouseOrg.X;
setY := Y - MouseOrg.Y; if setX > 0 then //圖像左移顯示右邊看不到的部分
begin
if MouseOrg.X + setX + pb1.Width > (img1.Width * PP) then
MoveX := (img1.Width * PP) - pb1.Width ;
end
else
MoveX := MouseOrg.X + setX; if setX < 0 then //圖像右移顯示左邊看不到的部分
begin
if MouseOrg.X + setX < 0 then
MoveX := 0
else
MoveX := MouseOrg.X + setX;
end; if setY > 0 then //圖像上移顯示下邊看不到的部分
begin
if MouseOrg.Y + setY + pb1.Height > (img1.Height * PP) then
MoveY := img1.Height * PP - pb1.Height
else
MoveY := MouseOrg.Y + setY;
end;
if setY < 0 then //圖像下移顯示上邊看不到的部分
begin
if MouseOrg.Y + setY < 0 then
MoveY := 0
else
MoveY := MouseOrg.Y + setY;
end; SrcRect := Rect(MoveX div PP, MoveY div PP, (MoveX + pb1.Width) div PP,(MoveY + pb1.Height) div PP); //在原始圖片上截取的大小
destRect := Rect(0,0,pb1.Width,pb1.Height);
pb1.Canvas.CopyRect(destRect,img1.Canvas,SrcRect);
end;
end;procedure TForm1.pb1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Canmove then Canmove := False;
end;
解决方案 »
- 请教删除记录的问题
- 打印Notebook1中其Notebook1.PageIndex:=8的所有内容,怎样写打印按钮的代码?
- 思路这样,可以实现吗:我的dll中有网上验证功能,并从服务器返回一数据,结构自定义,然后多个EXE(或dll)可不可以直接调用这个数据
- 关于一个ADOQuery查询后的结果等于另一个ADOQuery查询的条件问题(100分题)(最新问题)
- 请问各位高手,为什么焦点在控件上,而光标不见了,向上面又可以输入内容?
- 关于ini文件的读写
- 郁闷,散散分……
- 走过路过不要错过,谁能帮我看看这个问题是怎么回事
- 小妹我请教大家一个关于制作上下文敏感帮助系统的问题(紧急)
- 如何定议日期型变量:
- 向高手求救:縮放,拖動顯示圖片程序
- WebBrowser控件问题
MouseOrg.Y := Y;