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

C# WinForms 不規則窗體實作全攻略:四種核心技術詳解

     編輯:關於C語言

方案一:GraphicsPath 繪製幾何形狀

適用於圓形、橢圓等規則幾何圖形。在 Form_Paint 事件中重繪窗體區域:

var shape = new GraphicsPath();
shape.AddEllipse(0, 0, this.Height, this.Width);
this.Region = new Region(shape);

優點:程式碼極簡、無圖片依賴、效能最佳。缺點:無法實現複雜非幾何造型。

方案二:背景圖片 + TransparencyKey(靜態資源)

  1. 準備 16/24 位 BMP,背景色設為透明色(如亮綠 #00FF00)。
  2. 屬性設定:BackgroundImage = 圖片,TransparencyKey = 背景色,FormBorderStyle = None。

坑點:用戶螢幕色深若超過 24 位,非透明區域會顯示異常。需提醒用戶調整顯示設定,體驗較差。

方案三:動態位圖掃描生成 Region(核心技術)

原理:讀取位圖每像素,將非透明色區域合併為矩形加入 GraphicsPath,最後指派給 Form.Region。關鍵演算法:

private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap) {
    var path = new GraphicsPath();
    Color transparent = bitmap.GetPixel(0, 0); // 左上角為透明色
    for (int y = 0; y < bitmap.Height; y++) {
        int xStart = -1;
        for (int x = 0; x < bitmap.Width; x++) {
            if (bitmap.GetPixel(x, y) != transparent) {
                if (xStart == -1) xStart = x;
            } else if (xStart != -1) {
                path.AddRectangle(new Rectangle(xStart, y, x - xStart, 1));
                xStart = -1;
            }
        }
        if (xStart != -1) // 行尾收尾
            path.AddRectangle(new Rectangle(xStart, y, bitmap.Width - xStart, 1));
    }
    return path;
}

優點:支援任意複雜造型、執行期動態載入、無色深限制。缺點:大圖掃描耗時,啟動稍慢;需處理高 DPI 縮放。

方案四:GDI API 多邊形區域

透過 CreatePolygonRgn + SetWindowRgn 直接操作視窗區域:

[DllImport("gdi32.dll")]
private static extern IntPtr CreatePolygonRgn(ref POINT[] pts, int count, int mode);
[DllImport("user32.dll")]
private static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, ref bool redraw);

// 定義五個頂點構成不規則多邊形
var pts = new POINT[5] { ... };
var hRgn = CreatePolygonRgn(ref pts[0], 5, 1);
SetWindowRgn(this.Handle, hRgn, ref flag);

優點:極低記憶體佔用、適合簡單多邊形。缺點:僅限直線邊緣、需手動計算座標、非托管程式碼風險較高。

綜合比較與選型建議

場景推薦方案關鍵注意
圓/橢圓/矩形圓角方案一最簡潔高效
設計師提供複雜造型圖片方案三預先快取 GraphicsPath;高 DPI 下用 1.5x/2x 圖
簡單多邊形、極致效能方案四座標用相對比例,配合 Resize 事件重算
快速原型、不追求完美方案二僅限內部工具,避開色深坑

進階技巧:拖曳與點擊穿透

  • 無標題列時,在 WndProc 處理 WM_NCHITTEST 回傳 HTCAPTION 實現整體拖曳。
  • 若需點擊穿透(如桌面小工具),結合 WS_EX_TRANSPARENT + WS_EX_LAYERED 擴展樣式。

附件提供完整範例專案(.NET 2.0 可升級),含動態掃描、GDI 多邊形、自訂軌跡動畫三種 Demo,建議下載實測體驗差異。

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