1. 新建一个工程demo
2. 添加以下引用:
[System.Runtime.InteropServices.DllImport( " gdi32 " )] private static extern IntPtr BeginPath(IntPtr hdc);[System.Runtime.InteropServices.DllImport( " gdi32 " )] private static extern int SetBkMode(IntPtr hdc, int nBkMode); const int TRANSPARENT = 1 ;[System.Runtime.InteropServices.DllImport( " gdi32 " )] private static extern IntPtr EndPath(IntPtr hdc);[System.Runtime.InteropServices.DllImport( " gdi32 " )] private static extern IntPtr PathToRegion(IntPtr hdc);[System.Runtime.InteropServices.DllImport( " gdi32 " )] private static extern int Ellipse(IntPtr hdc, int X1, int Y1, int X2, int Y2);[System.Runtime.InteropServices.DllImport( " user32 " )] private static extern IntPtr SetWindowRgn(IntPtr hwnd,IntPtr hRgn, bool bRedraw);[System.Runtime.InteropServices.DllImport( " user32 " )] private static extern IntPtr GetDC(IntPtr hwnd);
2. 添加窗体的Load方法:
private void 用获取路径的方法得到圆形窗体_Load( object sender, System.EventArgs e) ... { IntPtr dc; IntPtr region; dc=GetDC(this.Handle); BeginPath(dc); //根据路径创建不规则窗体 SetBkMode(dc,TRANSPARENT); //设置为透明模式 Ellipse(dc,20,20,220,220); EndPath(dc); region=PathToRegion(dc); SetWindowRgn(this.Handle,region,true); }
4. 最后在添加一些函数和变量即可。
const int WM_NCHITTEST = 0x0084 ; const int HTCLIENT = 0x0001 ; const int HTCAPTION = 0x0002 ; protected override void WndProc( ref System.Windows.Forms.Message m) ... { switch(m.Msg) ...{ case WM_NCHITTEST: base.WndProc(ref m); if (m.Result==(IntPtr)HTCLIENT) m.Result=(IntPtr)HTCAPTION; break; default: base.WndProc(ref m); break; } }