核心 API
CreateRoundRectRgn(x1, y1, x2, y2, w, h):建立圓角矩形區域,w/h 為橢圓寬高。
SetWindowRgn(hWnd, hRgn, bRedraw):將視窗顯示區域限制為指定區域,bRedraw=True 立即重繪。
圓角矩形視窗範例
procedure TForm1.FormCreate(Sender: TObject);
var
hRgn: HRGN;
begin
hRgn := CreateRoundRectRgn(0, 0, Width, Height, 20, 20); // 圓角半徑 20
SetWindowRgn(Handle, hRgn, True);
end;
procedure TForm1.FormResize(Sender: TObject);
var
hRgn: HRGN;
begin
hRgn := CreateRoundRectRgn(0, 0, Width, Height, 20, 20);
SetWindowRgn(Handle, hRgn, True); // 尺寸變更時重建區域
end;
任意多邊形視窗(進階)
procedure TForm1.FormCreate(Sender: TObject);
var
Pt: array[0..4] of TPoint;
hRgn: HRGN;
begin
// 定義五邊形頂點
Pt[0] := Point(Width div 2, 0);
Pt[1] := Point(0, Height div 2);
Pt[2] := Point(Width div 2, Height);
Pt[3] := Point(Width, Height div 2);
Pt[4] := Point(Width, 0);
hRgn := CreatePolygonRgn(Pt, 5, WINDING);
SetWindowRgn(Handle, hRgn, True);
end;
進階技巧與避坑指南
- 區域所有權:
SetWindowRgn 成功後系統接管區域記憶體,**不可**自行 DeleteObject(hRgn),否則視窗重繪時會崩潰。
- 點擊穿透:非矩形區域外的滑鼠訊息會穿透至下層視窗,若需阻擋可在
WM_NCHITTEST 回傳 HTTRANSPARENT。
- 標題列與邊框:建議設定
BorderStyle := bsNone 並自繪標題列,避免系統非客戶區繪製與自訂區域衝突。
- 高 DPI:啟用 Per-Monitor DPI 感知後,座標需以邏輯單位計算或呼叫
SetProcessDpiAwarenessContext。
- 動畫過渡:結合
AnimateWindow 或逐步縮放區域實現視窗彈出/收合特效。
應用場景
- 媒體播放器外觀(如 Winamp 風格)。
- 桌面小工具、啟動器、彈出面板。
- 遊戲啟動器、防偽驗證視窗。