Como puedo aplicar Skin en un formulario deVB6.0

Hector
06 de Mayo del 2006
Quisiera sber como aplicar un in formulario en VB6.0. Es decir cambiar la forma del formulario, que ya no sea el rectangular sino poder darle forma que uno quiera.

Juan
06 de Mayo del 2006
Aqui tienes un programa de ejemplo que hice para una chica
que preguntó lo mismo en otro foro.
Para ver como funciona abre un proyecto nuevo y pega este
código en el módulo de código del formulario. Después
ejecútalo y empieza a hacer click en el formulario, verás como
va cambiando de forma.
El códogo:

Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
'Establece la region visible de la ventana.Devuelve cero si falla.
'PRMs(hwnd:controlador de ventana,hrgn:controlador de region,bRedraw:true/false determina si se redibuja la ventana)

Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
'Devuelve un controlador de region(hrgn) si tiene éxito, null si falla
'PRMs: indican las coordenadas de las esquinas SUP-IZQ y INF-DCHA del rectángulo que encierra la elipse

Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
'Devuelve lo mismo que la anterior
'PRMs(Los 4 primeros lo mismo que arriba,X3 e Y3:ancho y alto de la ellipse que forma las esquinas redondeadas)

Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
'Devuelve lo mismo que la anterior
'PRMs(lpPoint:array de puntos que definen los vértices,cPoints:Nº de puntos en lpPoints,nPolyFillMode:determina que píxels forman la region ¿?

Private Declare Function CreatePolyPolygonRgn Lib "gdi32" (lpPoint As POINTAPI, lpPolyCounts As Long, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
'Crea una region compuesta de varios polígonos. Devuelve lo mismo
'PRMs(lpPoint:igual anterior,lpPolyCounts:array con el Nº de puntos para cada polígono,nCount:Nº de elementos en lpPolyCounts,nPolyFillMode:igual anterior

Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
'Sin comentarios

Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
'Crea una region combinando otras dos.Devuelve NULLREGION,SIMPLEREGION,COMPLEXREGION o ERROR(cero supongo)
'PRMs(hDestRgn:region que almacenará el resultado,hSrcRgn1 y 2:regiones a combinar,nCombineMode:modo de combinacion(una de las constantes de abajo)
Private Const RGN_AND = 1 'crea la interseccion de las dos regiones
Private Const RGN_OR = 2 'crea la union de las dos regiones
Private Const RGN_XOR = 3 'crea la union de las dos regiones excepto las zonas superpuestas
Private Const RGN_DIFF = 4 'combina las partes de hSrcRgn1 que no son parte de hSrcRgn2
Private Const RGN_COPY = 5 'copia hSrcRgn1 a hDestRgn

Private Const NULLREGION = 1 'La region está vacia
Private Const SIMPLEREGION = 2 'La region es un rectángulo
Private Const COMPLEXREGION = 3 'La region es mas que un simple rectángulo

'Constantes para el parámetro nPolyFillMode de CreatePolygonRgn y CreatePolyPolygonRgn:
Private Const ALTERNATE = 1
Private Const WINDING = 2

Private hRegion(4) As Long
Private msg(4) As String

Private Sub Form_Load()
Me.Move 50 * 15, 50 * 15, 230 * 15, 200 * 15
crearRegiones
End Sub
Private Sub Form_Click()
Static i As Integer
Dim retVal As Long
retVal = SetWindowRgn(Me.hWnd, hRegion(i), True)
MsgBox msg(i)
i = i + 1
If i > 4 Then
i = 0
crearRegiones 'Si no las creo cada vez acaban todas con la misma forma!!!!
End If
End Sub
Private Sub crearRegiones()
Dim pPoligono(9) As POINTAPI 'puntos para polígonos
Dim cpPoligono(1) As Long 'reparto de los puntos para CreatePolyPolygonRgn
Dim retVal As Long
cpPoligono(0) = 5
cpPoligono(1) = 5
pPoligono(0).x = 0: pPoligono(0).y = 0
pPoligono(1).x = 80: pPoligono(1).y = 10
pPoligono(2).x = 150: pPoligono(2).y = 15
pPoligono(3).x = 190: pPoligono(3).y = 50
pPoligono(4).x = 180: pPoligono(4).y = 100
pPoligono(5).x = 195: pPoligono(5).y = 170
pPoligono(6).x = 155: pPoligono(6).y = 190
pPoligono(7).x = 110: pPoligono(7).y = 175
pPoligono(8).x = 25: pPoligono(8).y = 185
pPoligono(9).x = 10: pPoligono(9).y = 110
hRegion(0) = CreateEllipticRgn(0, 0, Me.ScaleWidth, Me.ScaleHeight)
msg(0) = "Elipse"
hRegion(1) = CreateRoundRectRgn(0, 0, Me.ScaleWidth, Me.ScaleHeight, 50, 70)
msg(1) = "Rectángulo con bordes redondeados"
hRegion(2) = CreatePolygonRgn(pPoligono(0), 10, ALTERNATE)
msg(2) = "Polígono"
hRegion(3) = CreatePolyPolygonRgn(pPoligono(0), cpPoligono(0), 2, WINDING)
msg(3) = "Polígono múltiple"
hRegion(4) = CreateRectRgn(0, 0, Me.ScaleWidth, Me.ScaleHeight)
retVal = CombineRgn(hRegion(4), hRegion(0), hRegion(2), RGN_AND)
msg(4) = "Combinación de la elipse y el póligono "
End Sub