程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi制作“五星”不規則窗體的思路及代碼

Delphi制作“五星”不規則窗體的思路及代碼

編輯:Delphi

一般情況下,窗體外觀大多數都是矩形的。是否可以制作出外觀不一樣的窗體呢?答案是肯定的。本例我們制作的即是一個五角星形狀的窗體。窗體的輪廓是用藍色線條繪制的,五角星之外的Windows 桌面是可見的,如果點擊“退出”按鈕,將會退出該窗體。而通過調整窗體中的三個上下方向箭頭,則可以調整五角星窗體的背景顏色。該窗體另一個特殊之處在於它運行之後,始終是保持在Windows 的最前面,而不論該窗體當前是否為活動窗體。運行效果如下圖所示。

 Delphi制作不規則窗體的特殊窗體實例

要實現這種特殊形狀的窗體,我們可以使用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 print? 01 unit Unit1; 02 interface 03 uses 04 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 05 StdCtrls, Spin, Buttons; 06 type 07 TForm1 = class(TForm) 08 SpinEdit1: TSpinEdit; 09 SpinEdit2: TSpinEdit; 10 SpinEdit3: TSpinEdit; 11 Label1: TLabel; 12 Label2: TLabel; 13 Label3: TLabel; 14 BitBtn1: TBitBtn; 15 procedure FormCreate(Sender: TObject); 16 procedure FormPaint(Sender: TObject); 17 procedure SpinEdit3Change(Sender: TObject); 18 procedure SpinEdit1Change(Sender: TObject); 19 procedure SpinEdit2Change(Sender: TObject); 20 procedure BitBtn1Click(Sender: TObject); 21 private 22 { Private declarations } 23 procedure WmNCHitTest(var Msg : TWMNCHitTest); message WM_NCH_ 24 ITTEST; 25 public 26 { Public declarations } 27 end; 28 var 29 Form1: TForm1; 30 implementation 31 {$R *.DFM} 32 const 33 { An array of points for the star region. } 34 RgnPoints : array[1..10of TPoint = 35 ((X:203;Y:22), (X:157;Y:168), (X:3;Y:168), 36 (X:128;Y:257), (X:81;Y:402), (X:203;Y:334), 37 (X:325;Y:422), (X:278;Y:257), (X:402;Y:168), 38 (X:249;Y:168)); //定義五角星的各個頂點的坐標 39 LinePoints : array[1..11of TPoint = 40 ((X:199;Y:0), (X:154;Y:146), (X:2;Y:146), 41 (X:127;Y:235), (X:79;Y:377), (X:198;Y:308), 42 (X:320;Y:396), (X:272;Y:234),(X:396;Y:146), 43 (X:244;Y:146), (X:199;Y:0)); //繪制五角星的輪廓線 44 procedure TForm1.FormCreate(Sender: TObject); 45 var 46 Rgn : HRGN; 47 begin 48 SetWindowPos(Form1.Handle,HWND_TOPMOST,Form1.Left,Form1.Top, 49 Form1. Width,Form1.Height,0); //使窗體始終保持在最前面 50 Rgn := CreatePolygonRgn(RgnPoints, High(RgnPoints), ALTERNATE); 51 //創建一個多邊形的區域 52 SetWindowRgn(Handle, Rgn, True); //繪制多邊形窗體 53 Form1.color:=rgb(spinEdit1.value,spinEdit2.value,spinEdit3.value); 54 //設置窗體初始背景顏色 55 end; 56 procedure TForm1.FormPaint(Sender: TObject); 57 begin 58 Canvas.Pen.Width := 1//設定畫筆大小 59 Canvas.Polyline(LinePoints); //繪制多邊形輪廓線 60 end; 61 procedure TForm1.WmNCHitTest(var Msg: TWMNCHitTest); 62 begin 63 DefaultHandler(Msg); //設定Windows API 函數的消息 64 if Msg.Result = HTCLIENT then 65 Msg.Result := HTCAPTION; //處理Windows 消息 66 end; 67 procedure TForm1.SpinEdit3Change(Sender: TObject); 68 begin 69 Form1.color:=rgb(spinEdit1.value,spinEdit2.value,spinEdit3.value); 70 //改變窗體背景顏色 71 end; 72 procedure TForm1.SpinEdit1Change(Sender: TObject); 73 begin 74 Form1.color:=rgb(spinEdit1.value,spinEdit2.value,spinEdit3.value); 75 //改變窗體背景顏色 76 end; 77 procedure TForm1.SpinEdit2Change(Sender: TObject); 78 中文Delphi 實例全解教程 79 128 應用為王 80 begin 81 Form1.color:=rgb(spinEdit1.value,spinEdit2.value,spinEdit3.value); 82 //改變窗體背景顏色 83 end; 84 procedure TForm1.BitBtn1Click(Sender: TObject); 85 begin 86 SetWindowPos(Form1.Handle,HWND_NOTOPMOST,Form1.Left,Form1.Top, 87 Form1.Width,Form1.Height,0); //恢復窗體正常位置和顯示屬性 88 Form1.close; //關閉窗體 89 end; 90 end.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved