Windows 95 起支援視窗區域,決定視窗可見/可點擊範圍。按鈕 (TButton) 也是視窗,可用 SetWindowRgn 設定任意形狀區域。區域建立函數:CreateEllipticRgn (橢圓/圓)、CreatePolygonRgn (多邊形)、CreateRectRgn、CreateRoundRectRgn;複雜形狀可用 CombineRgn 組合。
OnCreate 建立區域句柄。SetWindowRgn(Button->Handle, hRgn, TRUE) 套用 (TRUE 表重繪)。// 表單頭檔宣告
private: POINT TrPoint[3];
// 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);
}
座標以按鈕客戶區左上角為原點 (0,0)。設計時按鈕仍為矩形,運行時才變形。建議將表單背景設深色、按鈕 Cursor = crCross 以明顯展示效果。
區域句柄一旦 SetWindowRgn 成功,系統接管其生命週期,絕不可再呼叫 DeleteObject 或修改該句柄,否則會導致不可預期的崩潰。程式設計首重穩定,視覺效果其次。