本例制作一個背景能夠變化的窗體。當點擊窗體中的“隨機背景”按鈕時,窗體可以產生隨機背景;當點擊“自定背景”時,用戶可以打開一幅BMP 格式的圖像文件,作為該窗體的背景;當點擊“退出”按鈕時,窗體關閉。同時,該程序運行時的窗體沒有標題欄,使這個可變背景的窗體顯得別致而精巧。程序運行如下圖所示。
本程序利用的主要知識點包括Button 控件、BitBtn 控件、OpenDialog 控件和Canvas對象,還用到了虛擬函數CreateParams()。在Delphi 中,BitBtn 控件不僅可以顯示圖標,而且內置了相關代碼,添加該控件可以直接實現許多操作。OpenDialog 控件可以實現打開文件功能。在Delphi 中,許多控件都有Canvas(畫布)屬性,在Canvas 上可以顯示圖樣。Delphi 中FormStyle 等屬性表示窗體的邊框類型和邊框圖標等,改變這些屬性可以改變窗體的界面和窗口的狀態。
設計步驟:
實現本程序需要解決三個問題:給窗體添加隨機背景,打開圖像BMP 文件使其成為窗體的背景和實現窗體的無標題狀態。通過系統產生隨機顏色,然後賦值給Form.Canvas.Pixels[j,i]可實現添加隨機背景。然後利用bitmap.loadfrom“文件”(OpenDialog1.“文件”Name)函數導入BMP 圖像文件,利用Form1.Canvas.stretchdraw(rect1,bitmap)函數按照BMP 圖像對窗體的Canvas 進行重繪來解決第二個問題。第三個問題只需利用CreateParams(params) 函數並改變窗體的params.style 屬性即可。
1.新建工程
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。
2.修改窗口:
(1)激活Form1 窗口,在“屬性”中設置該窗體的Caption 屬性為“可變背景窗體”,Color 屬性設置“clBtnFace”。
(2)在構件選項板上選擇“對話框”頁上的OpenDialog 選項,將鼠標移到窗口中點擊,生成OpenDialog 控件,在“屬性”中設置其Name 屬性為OpenDialog1,設置其Option屬性為ofHideReadOnly 和ofEnableSizing。
(3)選擇“標准”頁上的Button 選項,在窗體中添加三個Button 標簽,調整其合適的大小和位置。按下Shift 鍵,同時選中這三個按鈕,選擇“編輯”菜單下的“對齊”命令,在彈出的對話框中為Button 按鈕選擇合適的對齊方式。然後設置其Caption 屬性分別為“隨機背景1”、“隨機背景2”和“自定背景”。
(4)選擇“附加”頁上的BitBin 選項,在窗體中添加BitBin 控件,調整其合適的大小和位置。在“屬性”面板中設置其Caption 屬性為退出,設置其Kind 屬性為bkClose,在kind 屬性中有多種Windows 常用操作選項。
代碼分析:
(1)Delphi 的許多控件都有Canvas(畫布)屬性,在Canvas 上可以顯示圖樣。窗體Form 也具有該屬性,可以靈活地通過數學運算來控制畫布的顏色和樣式,從而得到合適的窗體背景。隨機背景的產生可以通過系統產生隨機顏色, 然後賦值給Form.Canvas.Pixels[j,i]。
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; begin for i:=0 to Form1.Height do for j:=0 to Form1.Width do Form1.Canvas.Pixels[j,i]:=$100*random(256); //隨機創建一個窗口背景 end;
(2)利用bitmap.loadfrom“文件”(OpenDialog1.“文件”Name)函數導入BMP 圖像文件,然後利用Form1.Canvas.stretchdraw(rect1,bitmap)函數按照BMP 圖像樣式對窗體的Canvas 進行重繪,即可實現利用圖像作為窗體背景功能。
procedure TForm1.Button3Click(Sender: TObject); var bitmap:Tbitmap; rect1:trect; begin rect1.left:=0; //在窗體的顯示區域上設置圖像 rect1.right:=Width; rect1.top:=0; rect1.bottom:=Height; bitmap:=Tbitmap.Create; //創建對象 OpenDialog1.filter:=’bitmap file(*.bmp)|*.bmp’;//設置打開圖像類型的過濾 if OpenDialog1.Execute then begin bitmap.loadfromfile(OpenDialog1.“文件”Name);//導入BMP 圖像文件 Form1.Canvas.stretchdraw(rect1,bitmap);//畫布重繪 bitmap.freeImage; end; end;
(3)Delphi 中FormStyle 等屬性表示窗體的邊框類型和邊框圖標等,改變這些屬性可
以改變窗體的界面和窗口的狀態。下面實現窗體無標題功能。
procedure TForm1.CreateParams(var Params:TCreateParams); begin inherited CreateParams(params); params.style:=(Params.style or ws_popup)and not ws_Caption; end;
(4)窗體中BitBin 控件的代碼無需編寫。以下是完整程序代碼:
vIEw source