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

Delphi 多邊形視窗設計:CreatePolygonRgn 與 SetWindowRgn 打造五邊形介面

     編輯:Delphi

實作原理

Windows 視窗預設為矩形,透過 CreatePolygonRgn 建立多邊形區域,再以 SetWindowRgn 套用至視窗,即可實現任意形狀視窗。

五邊形視窗完整程式碼

unit Unit1;

interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

var Form1: TForm1;

implementation {$R *.dfm}

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;

end.

執行效果

五邊形視窗運行結果

進階應用與注意事項

  1. 區域所有權轉移:SetWindowRgn(..., True) 成功後系統接管 hRgn 生命週期,**嚴禁**自行 DeleteObject。
  2. Resize 重建:視窗大小改變時需在 OnResize 重新計算頂點並重建區域。
  3. 非客戶區處理:建議 BorderStyle := bsNone 自繪標題列與按鈕,避免系統繪製邊框與區域衝突。
  4. 點擊穿透:區域外滑鼠訊息穿透至下層視窗,若需阻擋可處理 WM_NCHITTEST 回傳 HTTRANSPARENT。
  5. 複雜形狀:結合 CreateEllipticRgn、CreateRectRgn 並用 CombineRgn(RGN_OR/RGN_XOR/RGN_DIFF) 組合出缺口、齒輪、對話氣泡等造型。
  6. 高 DPI:座標需為邏輯像素,或在 OnResize 依 CurrentPPI 換算。

應用場景

  • 媒體播放器皮膚、桌面小工具、遊戲啟動器。
  • 非矩形對話框、工具提示、彈出面板。
  • 防偽驗證視窗、品牌形象展示介面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved