一般情況下,窗體外觀大多數都是矩形的。是否可以制作出外觀不一樣的窗體呢?答案是肯定的。本例我們制作的即是一個五角星形狀的窗體。窗體的輪廓是用藍色線條繪制的,五角星之外的Windows 桌面是可見的,如果點擊“退出”按鈕,將會退出該窗體。而通過調整窗體中的三個上下方向箭頭,則可以調整五角星窗體的背景顏色。該窗體另一個特殊之處在於它運行之後,始終是保持在Windows 的最前面,而不論該窗體當前是否為活動窗體。運行效果如下圖所示。
要實現這種特殊形狀的窗體,我們可以使用Delphi中的SpinEdit 控件和BitBtn 控件等。BitBtn 控件可以添加自己需要的合適的圖標。利用SpinEdit 控件可以實現Edit 和UpDown 兩個控件的功能,能很方便地實現數值的升降。使窗體始終保持在最前面是利用了相關的Windows API函數。本程序的關鍵是利用FormPaint()函數來實現五角星窗體的繪制,利用Rgb()函數來實現窗體背景色的變化。
具體思路及設計步驟:
分為5 個部分來實現。第一部分:定義兩個數組,並且為它們賦值,其中一個數組用來定義五角星各個頂點的坐標值,另外一個數組用來繪制五角星的輪廓線。第二部分:繪制五角星窗體,這一部分利用TForm1.Form Create()和TForm1.FormPaint()來完成,這是該程序的核心部分。第三部分:向窗體添加調整顏色數值的SpinEdit 控件,利用Rgb()函數生成顏色,在Tfom1.SpinEdit Change()中添加相應代碼來調整窗體的背景顏色;第四部分:實現始終保持窗體最前面,這一部分主要調用Windows API 函數來完成,利用SetWindowPos()函數來對窗體的位置和顯示屬性進行合適的設置;第五部分:實現窗體的退出功能,在退出的同時,利用SetWindowPos()函數恢復窗體正常的位置和顯示屬性。
1.新建工程:
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。
2.修改窗口:
(1)激活Form1 窗口,選擇Samples 頁上的SpinEdit 選項,在窗體中添加三個SpinEdit控件,調整其合適的大小和位置。在“屬性”面板中設置其Color 屬性均為“clWindow”,設置Font.Color 屬性均為“clBlue”,Name 屬性分別為“SpinEdit1”、“SpinEdit2”和“SpinEdit3”,設置Value 屬性分別為“220”、“80”和“100”,表示這三個SpinEdit控件在程序運行時的初始位置。
(2)選擇“附加”頁上的BitBtn 選項,在窗體中添加一個BitBtn 控件,調整其合適的大小和位置。在“屬性”面板中設置其Caption 屬性為“退出”,Font.Color 屬性為“clBlue”。
(3)選擇“標准”頁上的Label 選項,在窗體中添加三個Label 控件,調整其合適的大小和位置。在“屬性”面板中設置其Caption 屬性均為“調整顏色”,設置其Font.Color屬性為“clBlue”。
關鍵代碼分析:
(1)下面實現該程序的第一部分功能,完成程序的聲明階段。在這一部分中需要定義兩個數組,並且為它們賦值,其中一個數組用來定義五角星各個頂點的坐標值,另外一個數組用來繪制五角星的輪廓線。這兩個數組需要定義為全程變量數組,即RgnPoints:
array[1..10] of Tpoint 和LinePoints:array[1..11] of Tpoint 數組,RgnPoints 數組用來定義五角星的各個頂點的坐標,而LinePoints 數組用來繪制五角星的輪廓線。
const { An array of points for the star region. } RgnPoints : array[1..10] of TPoint = ((X:203;Y:22), (X:157;Y:168), (X:3;Y:168), (X:128;Y:257), (X:81;Y:402), (X:203;Y:334), (X:325;Y:422), (X:278;Y:257), (X:402;Y:168), (X:249;Y:168)); LinePoints : array[1..11] of TPoint = ((X:199;Y:0), (X:154;Y:146), (X:2;Y:146), (X:127;Y:235), (X:79;Y:377), (X:198;Y:308), (X:320;Y:396), (X:272;Y:234),(X:396;Y:146), (X:244;Y:146), (X:199;Y:0));
(2)下面來實現本程序的第二部分功能:繪制五角星窗體。在TForm1.FormCreate()中,首先自定義一個HRGN 變量,接著創建一個多邊形區域,在窗體上繪制多邊形,並且設置窗體的初始顏色,代碼如下:
procedure TForm1.FormCreate(Sender: TObject); var Rgn : HRGN; begin Rgn := CreatePolygonRgn(RgnPoints, High(RgnPoints), ALTERNATE); //創建一個多邊形的區域 SetWindowRgn(Handle, Rgn, True); //繪制多邊形窗體 Form1.color:=rgb(spinEdit1.value,spinEdit2.value,spinEdit3.value); //設置窗體初始背景顏色 end;
接著需要設定畫筆的顏色和類型,並且在已形成的五角星窗體的邊界上繪制輪廓線,相關代碼如下:
procedure TForm1.FormPaint(Sender: TObject); begin Canvas.Pen.Width := 1; //設定畫筆大小 Canvas.Polyline(LinePoints); //繪制多邊形輪廓線 end;
(3)完成第三部分功能,需要為TForm1.SpinEditChange()事件添加響應代碼,來調整窗體的顏色,這三個TForm1.SpinEditChange()事件的代碼相同,相關代碼如下:(僅列出TForm1.SpinEdit1Change()的代碼):
procedure TForm1.SpinEdit1Change(Sender: TObject); begin Form1.color:=rgb(spinEdit1.value,spinEdit2.value,spinEdit3.value); //改變窗體背景顏色 end;
(4)該程序的第四部分需要實現使窗體始終保持在Windows 最前面的功能,這需要調用相關的Windows API 函數。代碼如下:
procedure TForm1.FormCreate(Sender: TObject); begin SetWindowPos(Form1.Handle,HWND_TOPMOST,Form1.Left,Form1.Top, Form1. Width,Form1.Height,0); //使窗體始終保持在最前面 end;
(5)第五部分:實現窗體的退出功能,在退出的同時,利用SetWindowPos()函數恢復窗體正常的位置和顯示屬性。代碼如下:
procedure TForm1.BitBtn1Click(Sender: TObject); begin SetWindowPos(Form1.Handle,HWND_NOTOPMOST,Form1.Left,Form1.Top, Form1.Width,Form1.Height,0); //恢復窗體正常位置和顯示屬性 Form1.close; //關閉窗體 end;
完整代碼如下:
vIEw source