Colaboraciones en el Guille

Formulario redondeado

[Aplicar regiones a un formulario, usando objetos GraphicsPath, para cambiar su forma]

 

Fecha: 15/Feb/2006 (15 de Febrero de 2006)
Autor: Miliuco (Emilio Pérez Egido)

 


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 4 formas:

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

Para conseguir el aspecto de un formulario con forma de estrella:

'ACTUAMOS EN EL EVENTO LOAD DE Form4
Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   'objeto Bitmap para contener la imagen que se usa de fondo del formulario
   Dim bmp As Bitmap
   bmp = New Bitmap(Application.StartupPath & "\Fondo.bmp")
   'el color del pixel(1,1) (esquina sup. izda.) del Bitmap será renderizado
   'como transparente en el Bitmap (color RGB 255,0,0)
   bmp.MakeTransparent(bmp.GetPixel(1, 1))
   'colocar el Bitmap como fondo del formulario
   Me.BackgroundImage = bmp
   'el color del pixel(1,1) (esquina sup. izda.) del Bitmap será renderizado
   'como transparente también en el formulario (color RGB 255,0,0)
   Me.TransparencyKey = bmp.GetPixel(1, 1)
End Sub

Imagen del programa en funcionamiento


Espacios de nombres usados en el código de este artículo:

System.Drawing
System.Drawing.Drawing2D


Fichero con el código de ejemplo: miliuco_formredondo.zip - 280 KB

(MD5 checksum: [75601219C080DE6F84AF3CAF58AF7327])


ir al índice principal del Guille