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;
}
}
本文介绍了一种使用 C# 在 Windows Forms 应用中创建圆形窗口的方法。通过调用 GDI+ 和 User32 API 实现了窗体边界的定义及交互优化。
3310

被折叠的 条评论
为什么被折叠?



