2011-02-23 67 views
12

Estoy utilizando este código para hacer que mi forma (FormBorderStyle = ninguno) con bordes redondeados:C# formulario con borde personalizado y bordes redondeados

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

Y esto para establecer un borde personalizado en el evento 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); 

Pero vea esto screenshot.

El rectángulo de formulario interior no tiene bordes redondeados.

¿Cómo puedo hacer que el rectángulo azul dentro de la forma tenga el borde redondeado también para que no se vea como la captura de pantalla?

Respuesta

9

La propiedad de la Región simplemente corta las esquinas. Para tener una verdadera esquina redondeada, deberás dibujar los rectángulos redondeados.

Drawing rounded rectangles

Podría ser más fácil para dibujar una imagen de la forma que desee y poner eso en forma transparente. Más fácil de dibujar, pero no se puede cambiar el tamaño.

0

Tenga en cuenta que está goteando el mango devuelto por CreateRoundRectRgn(), debe liberarlo con DeleteObject() después de su uso.

Region.FromHrgn() copia la definición, por lo que no liberará el identificador.

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

(sería agregar como comentario, pero la reputación es DED)

Cuestiones relacionadas