“異形”按鈕非常有趣,就是按鈕的形狀不是標准的長方形或正方形,而有一絲“叛逆”——“異形”嘛,是不是?怎樣才能實現“異形”按鈕呢?由於Window 95增加了對窗口區域概念的支持,使得窗口區域就是所定義的窗口看上去的形狀,窗口區域作為窗口的實際邊界區域,這樣窗口區域不僅定義了窗口的可畫區域,而且定義了窗口下隱含區域和響應鼠標擊鍵事件的響應窗口區域。
按鈕的各種形狀是在運行時設置的而不是在設計時設置。設計時按鈕的形狀仍然是長方形或正方形。
按鈕形狀的設計分成兩個步驟:
第一步創建按鈕的外形,即定義窗口區域。使用API的區域創建函數就可達到目的。區域創建函數很多,主要有CreateEllipticRgn 、CreatePolygonRgn、 CreateRectRgn、 CreateRoundRectRgn,用於創建不同類型的區域顯示。如果需要一個復雜區域形狀,那麼可以分別使用不同的區域函數創建不同的區域,然後調用CombineRgn API函數把它們組合起來。所以說,不僅可以創建出圓形、三角形的按鈕,而且還可以創建出其它各種形狀的按鈕。
第二步將區域顯示應用到窗口上。一旦使用區域函數創建了一個新的區域顯示,就可以使用SetWindowsRgn函數將這個區域應用到窗口上。
下面給出圓形、三角形按鈕實現的具體代碼。為了直觀顯示效果,將窗體的背景色設置為了黑色(Color設置為clBtnText),並將兩個按鈕的Cursor設置crCross。在窗體放置兩個Button按鈕,分別定義為RButton、TButton。實現窗口區域的最佳時機是在窗體首次創建時,所以將處理程序放在OnCreate事件中。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//創建園形按鈕
HRGN hRgnR = CreateEllipticRgn(0,0,RButton→
Width,RButton→Height);
SetWindowRgn(RButton→Handle,hRgnR,TRUE);
//創建三角形按鈕
TrPoint[0].x=TButton→Width/2;
TrPoint[0].y=0;
TrPoint[1].x=0;
TrPoint[1].y=TButton→Height;
TrPoint[2].x=TButton→Width;
TrPoint[2].y=TButton→Height;
HRGN hRgnT = CreatePolygonRgn(TrPoint,3,ALTERNATE);
SetWindowRgn(TButton→Handle,hRgnT,TRUE);
}
其中TrPoint在Unit.h頭文件中定義如下:
private: // User declarations
POINT TrPoint[3];
上面的代碼在按鈕的邊界內分別創建了一個園形區域和一個三角形區域,然後作為新的窗口區域把它賦給各自的按鈕。在創建園形按鈕時使用了橢圓形區域創建函數,要使按鈕為園形在設計時該按鈕應設計為正方形。另外區域是以按鈕坐標的形式定義的,而不是用屏幕坐標。(0,0)點是按鈕的最左上角,而(寬,高)點是按鈕的最右下角。
應該注意的是,一旦將區域句柄賦給按鈕,就不能再對區域句柄作任何操作。如果將區域句柄賦給按鈕後,修改或刪除這個句柄將導致程序崩潰,所以……千萬不要這樣做,否則,你的程序雖然花哨了一些,但卻是“拾了芝麻丟了西瓜”而因小失大!說到這裡,我想,程序設計首先要注意“穩定性”,至於其它的都次要。