web-dev-qa-db-fra.com

Formulaire C # avec bordure personnalisée et bords arrondis

J'utilise ce code pour créer mon formulaire (FormBorderStyle = none) avec des bords arrondis:

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

Et ceci pour définir une bordure personnalisée sur l'événement 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);

Mais vois ça screenshot.

Le rectangle de la forme intérieure n'a pas d'arêtes arrondies.

Comment faire en sorte que le rectangle intérieur bleu ait un contour arrondi pour ne pas ressembler à la capture d'écran?

12
Meredith

Les biens de la région coupent simplement les coins. Pour avoir un vrai coin arrondi, vous devrez dessiner les rectangles arrondis.

Dessin de rectangles arrondis

Il serait peut-être plus facile de dessiner une image de la forme souhaitée et de la placer sur la forme transparente. Plus facile à dessiner mais ne peut pas être redimensionné.

9
Erno de Weerd

Notez que vous perdez le descripteur renvoyé par CreateRoundRectRgn () , vous devez le libérer avec DeleteObject () après son utilisation.

Region.FromHrgn () copie la définition afin de ne pas libérer le descripteur.

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

(ajouterait comme commentaire mais la réputation est déduite)

0
Phi