Crear “Skins” para Formularios en VB.NET

Fecha: 25/Oct/2004 (19/10/2004)
Autor: Alvaro Regalado; alvaritus@msn.com

 


Como crear un formulario irregular en .NET

Los otros días fui a una reunión del grupo uruguayo de usuarios .NET en la cual unos compañeros explicaban de que se trataba el G.D.I+ y que se podía hacer con la misma. Gracias a los elementos expuestos en dicha reunión me planteé la posibilidad de crear un “skin” para un formulario en .NET. Después de investigar un poco sobre el tema me di cuenta de que (por lo menos para mí) no es un tema trivial. De todas maneras les mando mi solución (a medias) a ver si juntos la podemos pulir un poco. Salu2 para todos desde Uruguay y gracias!!! .
Nota para Guille: En este ejemplo usé Option Strict ON tal cual me lo aconsejaste ;)  

Option Strict On

Option Explicit On

 

Imports System.Drawing

 

Public Class Form1

    Inherits System.Windows.Forms.Form

 

    Dim Arrastre As Boolean

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Aca tiene que cargar su imagen de fondo...

        Dim imagen As Image = Bitmap.FromFile("C:\Fondo.BMP")

        Me.BackgroundImage = imagen

        Me.Height = imagen.Height

        Me.Width = imagen.Width

        Dim mibitmap As Bitmap = CType(imagen, Bitmap)

        'Le paso a la funcion la imagen el bitmap de fondo y el color transparente ( En este caso tomo el color del pixel 0,0 del bitmap)

        'Dicha función me retorna la región de la imagen para poder asignarla a la región del formulario

        Me.Region = ObtenerRegionDelBitmap(mibitmap, mibitmap.GetPixel(0, 0))

    End Sub

 

    Private Function ObtenerRegionDelBitmap(ByVal MiImagen As Bitmap, ByVal ColorTransparente As Color) As Region

        Dim RegionLocal As Region

 

        If MiImagen Is Nothing Then Return RegionLocal

 

        Dim ColorDeFondo As Color = ColorTransparente

        Dim Largo As Integer = MiImagen.Height - 1

        Dim Ancho As Integer = MiImagen.Width

        Dim Fila As Integer

        Dim Columna As Integer

 

        RegionLocal = New Region(New Rectangle(0, 0, 0, 0))

 

        For Fila = 0 To Largo

            Dim ColumnaComienzo As Integer = -1

            Dim ColumnaFin As Integer = -1

 

            For Columna = 0 To Ancho

                If Columna = Ancho Then

                    If ColumnaComienzo <> -1 Then

                        ColumnaFin = Columna

 

                        Dim regUnion As New Region(New Rectangle(ColumnaComienzo, Fila, ColumnaFin - ColumnaComienzo, 1))

                        RegionLocal.Union(regUnion)

                        regUnion = Nothing

                    End If

                Else

                    If Not MiImagen.GetPixel(Columna, Fila).Equals(ColorDeFondo) Then

                        If ColumnaComienzo = -1 Then ColumnaComienzo = Columna

                    ElseIf MiImagen.GetPixel(Columna, Fila).Equals(ColorDeFondo) Then

                        If ColumnaComienzo <> -1 Then

                            ColumnaFin = Columna

 

                            Dim regUnion As New Region(New Rectangle(ColumnaComienzo, Fila, ColumnaFin - ColumnaComienzo, 1))

                            RegionLocal.Union(regUnion)

                            regUnion = Nothing

 

                            ColumnaComienzo = -1

                            ColumnaFin = -1

                        End If

                    End If

                End If

            Next

        Next

 

        Return RegionLocal

 

    End Function

 

    'Estas tres subs me permiten desplazar el formulario.

    'Falta código para que se posicione correctamente dentro del formulario.

 

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown

        Arrastre = True

    End Sub

 

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp

        Arrastre = False

    End Sub

 

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove

        If Arrastre Then Me.Location = Me.PointToScreen(New Point(e.X, e.Y))

    End Sub

End Class


ir al índice