首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WinForms 介面開發 (三):設定視窗 Region 實現圓角視窗與非矩形佈局

     編輯:關於.NET

系列第三篇:在攔截視窗訊息 (Hook) 與 NativeWindow 封裝就緒後,本文示範如何透過 Windows API CreateRoundRectRgn 設定視窗 Region 屬性,實現圓角視窗效果,為後續 GDI+ 完整自繪奠基。

Region 概念與時機

Region 定義視窗可見與點擊回應區域。預設為矩形,設定非矩形 Region 可建立圓角、橢圓或任意多邊形視窗。需在視窗樣式/大小變更時重新計算:

  • WM_STYLECHANGED
  • WM_SHOWWINDOW
  • WM_SIZE
  • WM_WINDOWPOSCHANGED

SkinAppearance.SetRegion 實作

public void SetRegion(SkinningForm form)
{
    if (form == null) return;

    Size size = form.Size;
    // 圓角半徑設大 (90,90) 效果明顯,實際專案可依設計調整
    Size cornerSize = new Size(90, 90);

    // Win32 API 建立圓角矩形區域
    IntPtr hRegion = NativeMethod.CreateRoundRectRgn(0, 0, 
        size.Width + 1, size.Height + 1, 
        cornerSize.Width, cornerSize.Height);

    Region region = Region.FromHrgn(hRegion);
    form.Region = region;           // 套用至視窗
    region.ReleaseHrgn(hRegion);    // 釋放非托管資源
}

關鍵點解析

  • CreateRoundRectRgn 參數:left, top, right, bottom, width_of_ellipse, height_of_ellipse。right/bottom 需 +1 確保完整覆蓋邊緣像素。
  • 非托管資源釋放:Region.FromHrgn 建立托管包裝後,必須呼叫 ReleaseHrgn 釋放原始 HRGN,避免 GDI 物件洩漏。
  • 觸發時機:在 Hook 訊息處理器中,針對上述四個訊息呼叫 engine.SkinAppearance.SetRegion(form)。

執行效果

圓角視窗效果:四角呈現大弧度圓角,但尚未繪製邊框與標題列,呈現純白背景

目前僅設定裁剪區域,視窗內容仍為空白。下一篇將引入 GDI+ 繪製邊框、標題列與按鈕,賦予視窗完整視覺語言。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved