摘 要:隨著Internet的普及與快速發(fā)展,網(wǎng)頁瀏覽人數(shù)與日俱增, 為了增強(qiáng)網(wǎng)頁的動(dòng)態(tài)性,動(dòng)態(tài)圖像廣泛使用,而動(dòng)態(tài)圖像瀏覽器的設(shè)計(jì)與應(yīng)用逐漸引起業(yè)界人士的重視,本文主要介紹了一款通過Delphi控件所設(shè)計(jì)并應(yīng)用的動(dòng)態(tài)圖像瀏覽器。
關(guān)鍵詞:動(dòng)態(tài)圖像瀏覽器;Delphi;控件
中圖分類號(hào):TP311
1 動(dòng)態(tài)圖像瀏覽器的設(shè)計(jì)
本文要設(shè)計(jì)一個(gè)動(dòng)態(tài)圖像瀏覽器,當(dāng)點(diǎn)擊“開始”按鈕時(shí),在窗口中的圖像將向上滾動(dòng),通過調(diào)節(jié)滾動(dòng)條的值可以調(diào)整滾動(dòng)的速度。另外,組成位圖的基本單位是像素,存儲(chǔ)每個(gè)像素所需的位數(shù)可以不同,也就可以說不同位圖所使用的顏色數(shù)量可以不同,這就是顏色深度的概念。本文設(shè)置了三個(gè)菜單項(xiàng)和一個(gè)工具欄,其中工具欄上的按鈕和滾動(dòng)條是用來控制圖像滾動(dòng)的,在運(yùn)行程序時(shí)是不可見的,通過執(zhí)行“選項(xiàng)”菜單中的命令調(diào)出。本文設(shè)計(jì)的核心是實(shí)現(xiàn)圖像在窗口中的滾動(dòng),響應(yīng)”開始“按鈕的單擊事件代碼中有一個(gè)外部循環(huán)和一個(gè)內(nèi)部循環(huán),外部循環(huán)用于重復(fù)滾動(dòng)操作,位圖有多少行就滾動(dòng)多少次;而內(nèi)部循環(huán)則是通過將位圖的每一行數(shù)據(jù)向前復(fù)制一次來執(zhí)行滾動(dòng)操作。圖像的每一行數(shù)據(jù)臨時(shí)存儲(chǔ)在動(dòng)態(tài)分配的內(nèi)存區(qū)的一個(gè)內(nèi)存塊中,可以通過訪問內(nèi)存地址來獲得。滾動(dòng)操作是通過調(diào)用Delphi的Move函數(shù)來實(shí)現(xiàn)的,該函數(shù)不能以變量的內(nèi)存地址作為參數(shù),所以需要應(yīng)用到指針變量作為轉(zhuǎn)換的橋梁。要顯示當(dāng)前位圖的顏色深度,需要調(diào)用Pixel Format屬性即可。
2 動(dòng)態(tài)圖像瀏覽器的應(yīng)用
2.1 創(chuàng)建一個(gè)新的標(biāo)準(zhǔn)工程。如果Delphi已經(jīng)運(yùn)行,可以創(chuàng)建一個(gè)名為“Form1”的新窗體。
2.2 為窗體創(chuàng)建三個(gè)菜單項(xiàng)。為窗體添加上MainMenu圖標(biāo)后,為窗體添加“文件”、“選項(xiàng)”、“關(guān)于”三個(gè)菜單選項(xiàng)及下屬命令。
2.3 為窗體添加上Panel控件,將Align屬性設(shè)置為alTop,Visible屬性設(shè)置為False。再將Panel作為父容器,在其上添加兩個(gè)BitBtn控件、一個(gè)Label控件和一個(gè)TrackBar控件。分別將BitBtn控件的Caption屬性設(shè)為“開始”和“停止”,再為它們添加上有功能提示作用的圖像,將“停止”按鈕的Enabled屬性設(shè)置為False。為窗體添加上OpenDialog控件作為打開文件之用。再為窗體添加上Image控件,將Align屬性設(shè)置為alClient。
2.4 首先在程序的初始階段定義整型變量nLines和布爾型變量fCancel:
var
Form1:TForm1;
nLines:Interger;
fCancel:Boolean;
2.5 雙擊窗體的空白處,在彈出的代碼窗口中為窗體的初始化添加以下代碼:
procedure tform1.formcreate(sender:tobject);
begin
TrackBar1Change(self);
end;
2.6 以下是“開始”按鈕OnClick時(shí)間處理程序的完整代碼:
Procedure TForm1.BitBtn1Click(Sender:TObject);
Var
W,H,I,J,LineBytes:integer;
Line:PbyteArray;
Bmp:TBitmap;
R:TRect;
Begin
fCancel:=False;
BitBtn1.Enabled:=False;
BitBtn2.Enabled:=Ture;
Bmp:=Image1.Picture.Bitmap;
W:=Bmp.Width;
H;=Bmp.Height;
LineBytes:=Abs(Integer(Bmp.ScanLine[1]) Integer(Bmp.ScanLine[0]));
Line:=AlloMem(LineBytes);
for I:=0 to H-1 do
begin
if fCancel then
Break;
Move((Bmp.ScanLine[0])^,Line^,LineByters);
for J:=0 to H-1 do
begin
Move((Bmp.ScanLine[J])^,Bmp.ScanLine[J-1]^,LineByters);
If(J mod nLines=0) then
begin
R:=Rect(0,Panell,Height+J-nLines,W,Panell.Height+j);
InvalidateRect(Handle,@R,F(xiàn)alse);
UpdateWindow(Handle);
end
end;
end;
BitBtn1.Enabled:=True; //激活“開始”按鈕
BitBtn2.Enabled:=False; //“停止”按鈕失效
end;
2.7 為“停止”按鈕的OnClick事件編寫代碼,當(dāng)執(zhí)行圖像滾動(dòng)時(shí),點(diǎn)擊“停止”按鈕,則改變標(biāo)志fCancel的值,從而停止圖像滾動(dòng)。
procedure tform1.bitbtn2click(sender:tobject);
begin
fCancel:=Ture;
end;
2.8 用戶還可以通過調(diào)整滾動(dòng)條的值來改變圖像滾動(dòng)的速度,為滾動(dòng)條的OnChange件添如下代碼:
procedure TForm1.TrackBar1Change(sender:Tobject);
begin
nLines:=TrackBar1.Position;
TrackBar1.Hint:=IntToStr(TrackBar1.Position);
End;
2.9 同時(shí)可以為當(dāng)前圖像顏色深度和菜單命令添加驅(qū)動(dòng)代碼,限于篇幅,不在詳細(xì)列出。
2.10 完成所有步驟之后,就可以進(jìn)行編譯和運(yùn)行,如果程序無誤,就可以運(yùn)行程序。
3 總結(jié)
本文主要介紹了動(dòng)態(tài)圖像瀏覽器的設(shè)計(jì)思想和具體開發(fā)應(yīng)用的操作, 通過具體事例實(shí)現(xiàn)了動(dòng)態(tài)圖像瀏覽器的應(yīng)用。
參考文獻(xiàn):
[1]Marco Cantu.Delphi 7從入門到精通[M].北京:電子工業(yè)出版社,2003,08.
[2]網(wǎng)冠科技.Delphi控件時(shí)尚編程百例[M].北京:機(jī)械工業(yè)出版社,2001,07.
作者簡介:劉暢(1978-),研究方向:計(jì)算機(jī)網(wǎng)絡(luò)研究方向。
作者單位:吉林工商學(xué)院,長春 130062