系列第三篇:在攔截視窗訊息 (Hook) 與 NativeWindow 封裝就緒後,本文示範如何透過 Windows API CreateRoundRectRgn 設定視窗 Region 屬性,實現圓角視窗效果,為後續 GDI+ 完整自繪奠基。
Region 定義視窗可見與點擊回應區域。預設為矩形,設定非矩形 Region 可建立圓角、橢圓或任意多邊形視窗。需在視窗樣式/大小變更時重新計算:
WM_STYLECHANGEDWM_SHOWWINDOWWM_SIZEWM_WINDOWPOSCHANGEDpublic 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); // 釋放非托管資源
}
left, top, right, bottom, width_of_ellipse, height_of_ellipse。right/bottom 需 +1 確保完整覆蓋邊緣像素。Region.FromHrgn 建立托管包裝後,必須呼叫 ReleaseHrgn 釋放原始 HRGN,避免 GDI 物件洩漏。engine.SkinAppearance.SetRegion(form)。
目前僅設定裁剪區域,視窗內容仍為空白。下一篇將引入 GDI+ 繪製邊框、標題列與按鈕,賦予視窗完整視覺語言。