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

C# WinForms 使用 Win32 API 實現橢圓形非矩形窗體:Region 裁剪避免閃爍

     編輯:程式設計綜合問答

問題

在 Paint 事件繪製橢圓,系統卡頓時先顯示矩形窗體再裁剪,體驗差。

解決方案:建立視窗區域 (Window Region)

在窗體建立時 (建構子/Load) 呼叫 SetWindowRgn,系統級裁剪,**無閃爍、無繪製延遲**。

核心代碼


using System.Runtime.InteropServices;

public partial class EllipseForm : Form {
    [DllImport("gdi32.dll")]
    static extern IntPtr CreateEllipticRgn(int x1, int y1, int x2, int y2);
    [DllImport("user32.dll")]
    static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);

    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        // 建立橢圓區域 (客戶區座標)
        IntPtr hRgn = CreateEllipticRgn(0, 0, this.ClientSize.Width, this.ClientSize.Height);
        SetWindowRgn(this.Handle, hRgn, true);
        // 系統接管區域所有權,無需手動 DeleteObject
    }

    protected override void OnResize(EventArgs e) {
        base.OnResize(e);
        if (this.Handle != IntPtr.Zero) {
            IntPtr hRgn = CreateEllipticRgn(0, 0, this.ClientSize.Width, this.ClientSize.Height);
            SetWindowRgn(this.Handle, hRgn, true);
        }
    }
}

進階:任意形狀 (圖片透明區域)

  • 掃描 Bitmap 非透明像素建立多個矩形區域 CreateRectRgn,CombineRgn(RGN_OR) 合成。
  • 或使用 GraphicsPath.AddPolygon + Region (GDI+),再 region.GetHrgn(Graphics) 轉 HRGN。

參考資源

完整範例:C# Win32 API 非矩形窗體

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