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);
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);
}
... {
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;
}
}
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;
}
}