基于Delphi的圖像漫游
發(fā)表時(shí)間:2023-07-30 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在開(kāi)發(fā)多媒體應(yīng)用中,經(jīng)常會(huì)遇到需要在有限區(qū)域內(nèi)顯示大圖像 的情況,有不少文章對(duì)此提出過(guò)解決方法,如通過(guò)調(diào)用Windows的API函 數(shù),直接讀寫內(nèi)存等。這些方法有某些優(yōu)點(diǎn),但實(shí)現(xiàn)起來(lái)較為復(fù)雜,且 易...
在開(kāi)發(fā)多媒體應(yīng)用中,經(jīng)常會(huì)遇到需要在有限區(qū)域內(nèi)顯示大圖像
的情況,有不少文章對(duì)此提出過(guò)解決方法,如通過(guò)調(diào)用Windows的API函
數(shù),直接讀寫內(nèi)存等。這些方法有某些優(yōu)點(diǎn),但實(shí)現(xiàn)起來(lái)較為復(fù)雜,且
易出錯(cuò)。筆者在實(shí)踐中通過(guò)仔細(xì)摸索,利用Delphi的強(qiáng)大的面向?qū)ο?
可視化開(kāi)發(fā)環(huán)境開(kāi)發(fā)了一種交互式圖像漫游方法。
Delphi中,鼠標(biāo)的消息響應(yīng)是通過(guò)元件的OnMouseDown、OnMouseU
p和OnMouseMove事件實(shí)現(xiàn)的,通過(guò)對(duì)此三個(gè)事件編程,可控制圖像在有
限區(qū)域內(nèi)移動(dòng)。考慮到所移動(dòng)的圖像的邊界應(yīng)總在該區(qū)域外,因此圖
像的左上角坐標(biāo)應(yīng)小于該區(qū)域?qū)?yīng)坐標(biāo),圖像右下角坐標(biāo)應(yīng)大于該區(qū)
域?qū)?yīng)坐標(biāo)(除非圖像大小比該區(qū)域小)。圖1
具體方法是:
1、新建一工程Project1,在Form1中依次放入Panel1、Panel2和I
mage1元件,注意Pa nel2和Image1分別在Panel1和Panel2上,再將一La
bel1元件加入Panel2中,調(diào)整Panel1尺寸為適當(dāng)大小,并修改各元件屬
性為:
元件
屬性名
屬性值
Panel1
BevelInner:
bvRaised
BevelOuter: bvNone
BorderStyle: bsSingle
Panel2
Align:
alClient
Image1
AutoSize:
True
Picture:
"Apple.bmp"
Label1
Align:
alClient
Transparent : True
注意:此處Label1的作用不是顯示字符,而是利用它響應(yīng)鼠標(biāo)消息
,如果不用Label1而直接利用Image1的鼠標(biāo)事件響應(yīng),則會(huì)由于其OnMo
useDown事件的激活與Image1的自身坐標(biāo)移動(dòng)事件沖突而使圖像發(fā)生
閃爍甚至不能移動(dòng)。
2、在implementation后加入變量聲明:
origin:Tpoint;
image_left:integer;
image_top:integer;
visa1:Tpoint; (鼠標(biāo)當(dāng)前位置相對(duì)圖像右下角的坐標(biāo))
visa2:Tpoint; (鼠標(biāo)當(dāng)前位置相對(duì)圖像左上角的坐標(biāo))
canmove:boolean;
編寫Label1鼠標(biāo)響應(yīng)事件:
procedure TForm1.Label1MouseDown(Sender: TObject; Button
: TMouseButton;S hift: 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;Shi ft: TShiftState; X, Y: Integer);
begin
canmove:=false;
end;
上述程序在Delphi 2.0中編譯通過(guò),經(jīng)過(guò)擴(kuò)充和修改還可應(yīng)用于
多媒體數(shù)據(jù)庫(kù)的圖像顯示,對(duì)于開(kāi)發(fā)友好界面有一定借鑒作用。