web-dev-qa-db-de.com

C # -Formular mit abgerundeten Kanten

Ich verwende diesen Code, um mein Formular (FormBorderStyle = none) mit abgerundeten Kanten zu erstellen:

[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));
}

Und so legen Sie einen benutzerdefinierten Rahmen für das Paint-Ereignis fest:

    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);

Aber sieh dir das an screenshot.

Das innere Formularrechteck hat keine abgerundeten Kanten.

Wie kann ich das blaue innere Formularrechteck so gestalten, dass es auch eine abgerundete Kante hat, damit es nicht wie der Screenshot aussieht?

12
Meredith

Die Region schneidet einfach die Ecken ab. Um eine echte abgerundete Ecke zu erhalten, müssen Sie die abgerundeten Rechtecke zeichnen.

Abgerundete Rechtecke zeichnen

Es ist möglicherweise einfacher, ein Bild der gewünschten Form zu zeichnen und dieses auf das transparente Formular zu setzen. Einfacher zu zeichnen, aber nicht in der Größe veränderbar.

9
Erno de Weerd

Beachten Sie, dass Sie das von CreateRoundRectRgn () zurückgegebene Handle verlieren. Sie sollten es mit DeleteObject () freigeben, nachdem es verwendet wurde.

Die Region.FromHrgn () kopiert die Definition, sodass das Handle nicht freigegeben wird.

[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);
}

(würde als Kommentar hinzufügen, aber der Ruf ist dediziert)

0
Phi