本文以實例介紹了Delphi實作圖片滾動切換的方法。該程式可以實現圖像的滾動播出,並且透過本代碼可控制視窗中的圖像向上滾動,透過調節速度滾動條的值還可以調整滾動的速度;點擊「停止」按鈕,圖像即停止滾動。
完整的功能程式碼如下:
unit Unit1;interfaceusesWindows, Classes, Graphics, Forms, Controls, Menus,Dialogs, StdCtrls, ExtCtrls, SysUtils, ComCtrls, Buttons;typeTForm1 = class(TForm)MainMenu1: TMMeainMexis : TMenuItem;Help1: TMenuItem;AboutImageViewer1: TMenuItem;OpenDialog1: TOpenDialog;Options1: TMenuItem;ColorDepth1: TMenuItem;ScrollPanel1: TMenuItem;Panel1: TMenuItem;ColorDepth1: TMenuItem;ScrollPanel1: TMenuItem;Panel1: Ttnel;TrackTrackBar1:Btn1; TLabel;Image1: TImage;N2: TMenuItem;procedure Open1Click(Sender: TObject);procedure Exit1Click(Sender: TObject);procedure AboutImageViewer1Click(Sender: TObject);procedure ColorDepk1ClickSenderp. TObject);procedure TrackBar1Change(Sender: TObject);procedure BitBtn1Click(Sender: TObject);procedure BitBtn2Click(Sender: TObject);procedure FormCreate(Sender: TObject);privatepublic{ Public Publicin}; fCancel: Boolean;implementation{$R *.DFM}procedure TForm1.Open1Click(Sender: TObject);beginif OpenDialog1.Execute thenbeginImage1.Picture.LoadFromFile (OpenDialog1.FileName);//導入映像檔檔 : + OpenDialog1.FileName;//改變窗體標題end;end;procedure TForm1.Exit1Click(Sender: TObject);beginClose; //退出窗體end;procedure TForm1.AboutImageViewer1Click(Sender: TObject);//關於beginMessageDlg ('控制控制影像動態移動為'+ #13'Delphi圖形工作室製作', mtInFormation,[mbOk], 0);end;procedure TForm1.ColorDepth1Click(Sender: TObject);varstrDepth: String;begincase 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;procedure TForm1.ScrollPanel1Click(Sender: TObject);beginPanel1 .Visible := not Panel1.Visible;ScrollPanel1.Checked := Panel1.Visible; //改變控制面板的可見性end;procedure TForm1.TrackBar1Change(Sender: TObject);beginnLines := TrackBar1.Position;TrackBar1.Hint := IntToStr (TrackBar1.Position);//給出目前速度大小的提示end;procedure TForm1.BitBtn1Click(Sender: TObject);varW, H, I, J, LineBytes: Integer;Line: PByteArray; //定義指標類型變數Bmp: Tbitmap;R: TRect;beginif Image1.Picture.Bitmap.PixelFormat=pfDevice then //當沒有開啟圖片時beginMessageDlg ('沒有開啟圖片! ', mtInFormation, [mbOk], 0);//給予出錯提示exit; //退出endelsefCancel := 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 dobeginif fCancel then //每一次循環前都會檢查中斷標誌(即確定停止按鈕是否按下)Break; //點選「停止」按鈕則停止捲動影像Move ((Bmp.ScanLine [0]), Line, LineBytes); //複製影像的第一行for J := 1 to H - 1 dobeginMove ((Bmp. ScanLine [J]), (Bmp.ScanLine [J-1]), LineBytes);if (J mod nLines = 0) thenbeginR := 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;procedure TForm1.BitBtn2Click(Sender: TObject);beginfCancel := True; //改變標誌Fcancel 的值,停止圖像滾動end;procedure TForm1.FormCreate(Sender: TObject);beginTrackBar1Change (self); //呼叫TrackBar1Change 函數end;end.