程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi實現圖像滾動播放

Delphi實現圖像滾動播放

編輯:Delphi

用Delphi編寫的圖像滾動播出,程序主要是使用MainMenu 控件、TrackBar 控件、OpenDialog 控件和BitBtn控件等。程序中利用OpenDialog 控件導入圖像文件,通過調用Delphi 的Move 函數來實現對圖像滾動的控制,該函數不能以變量的內存地址作為參數,所以需要應用到指針變量作為轉換的橋梁。運行效果如下圖:

Delphi圖像滾動

設計步驟如下:

這個Delphi圖片滾動效果設置了三個菜單項和一個工具欄,其中工具欄上的按鈕和滾動條是用來控制圖像滾動的。本例的核心是實現圖像在窗口中的滾動,響應“開始”按鈕的單擊事件代碼中有一個外部循環和一個內部循環,外部循環用於重復滾動操作,位圖有多少行就滾動多少次;而內部循環則是通過將位圖的每一行數據向前復制一行來執行滾動操作。圖像的每一行數據臨時存儲在動態分配的內存區的一個內存塊中,可以通過訪問內存地址來獲得。滾動操作是通過調用Delphi 的Move 函數來實現的,該函數不能以變量的內存地址作為參數,所以需要應用到指針變量來作為轉換的橋梁。要顯示當前位圖的顏色深度很簡單,只需調用Delphi 的PixelFormat 屬性即可。

1.新建工程

(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。

(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“BmpForm”,點擊“保存”按鈕,保存上面的選項。

(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。

2.修改窗口

(1)激活BmpForm 窗口,在“屬性”面板中設置該窗體的Caption 屬性為“控制圖像動態移動”,Name 屬性為“Form1”。

(2)選擇“標准”頁上的MainMenu 選項,在窗體中添加一個MainMenu 控件,雙擊該控件,進入菜單編輯窗口,設置菜單為文件(打開、開始移動、退出)、圖像(顏色深度、控制面板)、幫助(關於)。

(3)選擇“標准”頁上的Panel 選項,在窗體中添加1 個Panel 控件,在“屬性”面板中設置其Name 屬性為Panel1,設置其Align 屬性為alTop。

(4)選擇“附加”頁上的BitBtn 選項,在窗體中添加兩個BitBtn 控件,在“屬性”面板中設置其Caption 分別為“開始”和“停止”,並為其設置合適的Glyph 圖像。

(5)選擇“標准”頁上的Label 選項,在Panel1 上添加一個Label 控件,在“屬性”面板中設置其Caption 屬性為“速度”。再選擇Win 32 頁上的TrackBar 選項,在Panel1上添加一個TrackBar 控件。

(6)選擇“附加”頁上的Image 選項,在窗體中添加一個Image 控件,在“屬性”面板中設置其Align 屬性為“alClIEnt”。

(7)選擇“對話框”頁上的OpenDialog 選項,在窗體中添加一個OpenDialog 控件,在“屬性”面板中設置其Name 屬性為“OpenDialog1”,設置其Options 屬性為“ [ofHideReadOnly,ofPathMustExist,ofFileMustExist] ” , 過濾器Filters 為“ Bitmap(*.bmp)|*.bmp”。

下面簡要分析下代碼:

(1)程序運行時,先要導入圖像文件,同時改變窗體的標題,顯示當前圖像文件的路徑,相關代碼如下:

procedure TForm1.Open1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Image1.Picture.LoadFromFile (OpenDialog1.FileName);//導入圖像文件
Caption := ’圖像動態移動控制 - ' + OpenDialog1.FileName;//改變窗體標題
end;
end;

(2)要顯示當前位圖的顏色深度很簡單,只需調用Delphi 的PixelFormat 屬性即可,然後通過MessageDlg 函數給出位圖顏色深度的消息:

procedure TForm1.ColorDepth1Click(Sender: TObject);
var
strDepth: String;
begin
case Image1.Picture.Bitmap.PixelFormat of //獲得圖像顏色深度
pfDevice: strDepth := ’無圖’;
pf1bit: strDepth := ’1-bit’;
pf4bit: strDepth := ’4-bit’;
pf8bit: strDepth := ’8-bit’;
pf15bit: strDepth := ’15-bit’;
pf16bit: strDepth := ’16-bit’;
pf24bit: strDepth := ’24-bit’;
pf32bit: strDepth := ’32-bit’;
pfCustom: strDepth := ’Custom’;
end;
MessageDlg (’圖像顏色深度:’ + strDepth,mtInFormation, [mbOK], 0);//給出圖像顏色深度信息
end;

(3)本程序的關鍵是實現圖像的滾動操作。響應“開始”按鈕的單擊事件代碼中有一個外部循環和一個內部循環,外部循環用於重復滾動操作,位圖有多少行就滾動多少次;而內部循環則是通過將位圖的每一行數據向前復制一行來執行滾動操作。圖像的每一行數據臨時存儲在動態分配的內存區的一個內存塊中,可以通過訪問內存地址來獲得。滾動操作是通過調用Delphi 的Move 函數來實現的:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
W, H, I, J, LineBytes: Integer;
Line: PByteArray; //定義指針類型變量
Bmp: Tbitmap;
R: TRect;
begin
if Image1.Picture.Bitmap.PixelFormat=pfDevice then //當沒有打開圖片時
begin
MessageDlg (’沒有打開圖片!’, mtInFormation, [mbOk], 0);//給出出錯提示
exit; //退出
end
else
fCancel := False;
BitBtn1.Enabled := False; //改變兩個按鈕的屬性
BitBtn2.Enabled := True;
Bmp := Image1.Picture.Bitmap; //獲取BMP 圖像並定義圖像尺寸
W := Bmp.Width;
H := Bmp.Height;
LineBytes := Abs (Integer (Bmp.ScanLine [1]) -Integer (Bmp.ScanLine [0]));
Line := AllocMem (LineBytes);
for I := 0 to H - 1 do
begin
if fCancel then //在每一次循環前均檢查中斷標志(即確定停止按鈕是否按下)
Break; //單擊“停止”按鈕則停止滾動圖像
Move ((Bmp.ScanLine [0]), Line, LineBytes); //復制圖像的第一行
for J := 1 to H - 1 do
begin
Move ((Bmp.ScanLine [J]), (Bmp.ScanLine [J-1]), LineBytes);
if (J mod nLines = 0) then
begin
R := Rect (0, Panel1.Height + J-nLines,W, Panel1.Height + J);
InvalidateRect (Handle, @R, False);
UpdateWindow (Handle);
end;
end;
Move (Line, (Bmp.ScanLine [Bmp.Height - 1]), LineBytes);
R := Rect (0, Panel1.Height + H - nLines,W, Panel1.Height + H);
InvalidateRect (Handle, @R, False);
UpdateWindow (Handle);
Application.ProcessMessages; //允許立即停止循環使程序處於初始狀態
end;
BitBtn1.Enabled := True; //激活“開始”按鈕
BitBtn2.Enabled := False; // 停止“按鈕”失效
end;

(4)控制速度添加框的可見性的代碼很簡單,只需改變其Visible 屬性即可:

procedure TForm1.ScrollPanel1Click(Sender: TObject);
begin
Panel1.Visible := not Panel1.Visible;
ScrollPanel1.Checked := Panel1.Visible; //改變控制面板的可見性
end;
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved