首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 建立圓角與非矩形視窗:SetWindowRgn 區域裁剪技術詳解

     編輯:Delphi

核心 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;
五邊形視窗效果

進階技巧與避坑指南

  1. 區域所有權:SetWindowRgn 成功後系統接管區域記憶體,**不可**自行 DeleteObject(hRgn),否則視窗重繪時會崩潰。
  2. 點擊穿透:非矩形區域外的滑鼠訊息會穿透至下層視窗,若需阻擋可在 WM_NCHITTEST 回傳 HTTRANSPARENT。
  3. 標題列與邊框:建議設定 BorderStyle := bsNone 並自繪標題列,避免系統非客戶區繪製與自訂區域衝突。
  4. 高 DPI:啟用 Per-Monitor DPI 感知後,座標需以邏輯單位計算或呼叫 SetProcessDpiAwarenessContext。
  5. 動畫過渡:結合 AnimateWindow 或逐步縮放區域實現視窗彈出/收合特效。

應用場景

  • 媒體播放器外觀(如 Winamp 風格)。
  • 桌面小工具、啟動器、彈出面板。
  • 遊戲啟動器、防偽驗證視窗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved