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 .
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?
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.
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)