12

我正在使用此代码使我的表单 (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);

但是看到这个截屏

内部窗体矩形没有圆角边缘。

我怎样才能使蓝色的内部矩形也有圆角边缘,这样它就不会像截图一样?

4

2 回答 2

9

Region 属性只是切断了角落。要获得真正的圆角,您必须绘制圆角矩形。

绘制圆角矩形

绘制所需形状的图像并将其放在透明表单上可能会更容易。更容易绘制,但不能调整大小。

于 2011-02-23T14:40:37.510 回答
0

请注意,您正在泄漏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);
}

(将添加为评论,但声誉已被删除)

于 2017-09-02T13:38:48.277 回答