Formulario redondeado en VB .NET

Aplicar regiones a un formulario en Visual Basic .NET, usando objetos GraphicsPath, para cambiar su forma

Resumen

Utilizando objetos GraphicsPath y aplicando regiones de recorte es sencillo modificar la forma de un formulario. Podemos darle prácticamente cualquier aspecto pero, por sencillez del código, en este ejercicio nos restringiremos a 3 formas, círculo, rombo y polígono, usando objetos GraphicsPath y regiones de recorte con el aspecto deseado.

Imagen del programa en funcionamiento

Aplicación completa en Visual Basic .NET 2005: formularioredondo

Código en Visual Basic .NET

La presentación de este tipo de formularios queda mejor si en el diseñador de Visual Studio configuramos su propiedad FormBorderStyle en none.

Para conseguir el aspecto de un formulario redondeado:

'ACTUAMOS EN EL EVENTO PAINT DE Form1 
Private Sub Captura_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
'objeto de la clase GraphicsPath
Dim gp As GraphicsPath = New GraphicsPath
'rectángulo para hacer el recorte
Dim rect As Rectangle
'las medidas (0, 0, 294, 294) equivalen a (Left, Top, Width, Height) de Form1
rect = New Rectangle(0, 0, 294, 294)
'método que superpone una figura (círculo en este caso) al objeto GraphicsPath
gp.AddEllipse(rect)
'región de recorte que se crea a partir del objeto GraphicsPath recortado
Dim reg As Region
reg = New Region(gp)
'ésta es la región visible de Form1
Me.Region = reg
'mejorar el aspecto del borde redondeado aplicando antialias
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
End Sub

Para conseguir el aspecto de un formulario romboidal:

'ACTUAMOS EN EL EVENTO LOAD DE Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'objeto de la clase GraphicsPath
'para determinar cómo se rellena su interior se usa un parámetro,
'un objeto de la emumeración FillMode que tiene 2 miembros: Alternate y Winding
Dim GP As GraphicsPath = New GraphicsPath(FillMode.Alternate)
'se van añadiendo líneas, definidas por su punto x.y de inicio y de final
'coordenadas calculadas respecto a la ventana visible del formulario
GP.AddLine(0, 147, 147, 0)
GP.AddLine(147, 0, 294, 147)
GP.AddLine(294, 147, 147, 294)
GP.AddLine(147, 294, 0, 147)
'recortar el objeto GraphicsPath con la forma generada por las líneas
Me.Region = New Region(GP)
End Sub

Para conseguir el aspecto de un formulario poligonal:

'ACTUAMOS EN EL EVENTO LOAD DE Form3
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'objeto de la clase GraphicsPath
'para determinar cómo se rellena su interior se usa un parámetro,
'un objeto de la emumeración FillMode que tiene 2 miembros: Alternate y Winding
Dim GP As GraphicsPath = New GraphicsPath(FillMode.Alternate)
'se van añadiendo líneas, definidas por su punto x.y de inicio y de final
'coordenadas calculadas respecto a la ventana visible del formulario
GP.AddLine(60, 0, 234, 0)
GP.AddLine(234, 0, 294, 294)
GP.AddLine(294, 294, 0, 294)
GP.AddLine(0, 294, 60, 0)
'recortar el objeto GraphicsPath con la forma generada por las líneas
Me.Region = New Region(GP)
End Sub