带有自定义边框和圆边的C#表单

我正在使用此代码来创建带有圆边的表单(FormBorderStyle = none):

[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] private static extern IntPtr CreateRoundRectRgn ( int nLeftRect, // x-coordinate of upper-left corner int nTopRect, // y-coordinate of upper-left corner int nRightRect, // x-coordinate of lower-right corner int nBottomRect, // y-coordinate of lower-right corner int nWidthEllipse, // height of ellipse int nHeightEllipse // width of ellipse ); public Form1() { InitializeComponent(); Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20)); } 

这是为了在Paint事件上设置自定义边框:

  ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid); 

但看到这个 截图

内部forms矩形没有圆角。

我如何使蓝色内部forms矩形也具有圆形边缘所以它看起来不像截图?

该地区的特色只是切断角落。 要拥有真正的圆角,您必须绘制圆角矩形。

绘制圆角矩形

绘制所需形状的图像并将其放在透明表格上可能更容易。 更容易绘制但无法resize。

注意,你正在泄漏CreateRoundRectRgn()返回的句柄,你应该在使用后用DeleteObject()释放它。

Region.FromHrgn()复制定义,因此它不会释放句柄。

 [DllImport("Gdi32.dll", EntryPoint = "DeleteObject")] public static extern bool DeleteObject(IntPtr hObject); public Form1() { InitializeComponent(); IntPtr handle = CreateRoundRectRgn(0, 0, Width, Height, 20, 20); if (handle == IntPtr.Zero) ; // error with CreateRoundRectRgn Region = System.Drawing.Region.FromHrgn(handle); DeleteObject(handle); } 

(会添加评论但声誉是ded)