E' possibile usando le funzioni API del sistema operativo.
In particolare:
codice:
Public Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Accetta per parametri:
[/CODE]
hWnd = handle alla finestra.
Puoi usare NomeForm.HWnd oppure Me.HWnd
hRgn = Regione della nuova finestra che ti spiego dopo come la crei
bRedraw = True se vuoi che la finestra venga ridisegnata dal SO.
Metti true
Per creare una "regione":
Per fare questo puoi usare diverse funzioni API.
codice:
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As _
POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
lpPoint è il primo indice di un array di tipo POINTAPI
nCount è la lunghezza dell'array
nPolyFillMode: metti 1 e nn preoccuparti
La funzione crea un poligono che per vertici ha le coordinate messe nell' array.
codice:
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As _
Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
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
La prima ha per 4 parametri le coordinate in pixel di un rettangolo e ne restituisce la "regione".
La seconda è identica alla prima solo che crea un rettangolo smussato e gli ultimi 2 parametri indica di quanti pixel sarà smussato.
codice:
Public Declare Function CreateEllipticRgn Lib "gdi32" Alias "CreateEllipticRgn" (ByVal X1 As Long, ByVal Y1 As Long,ByVal _
X2 As Long, ByVal Y2 As Long) As Long
Ha sempre 4 coordinate per parametri, ma le usa per creare un ovale.
codice:
Private Const RGN_XOR = 3
Private Const RGN_OR = 2
Private Const RGN_DIFF = 4
Private Const RGN_COPY = 5
Private Const RGN_AND = 1
Private Declare Function CombineRgn Lib "gdi32" Alias "CombineRgn" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As _
Long, ByVal nCombineMode As Long) As Long
Con questa funzione puoi combinare diverse regioni.
hDestRgn è una regione in cui verrà inserito il risultato dell' operazione.
Attenzione: deve per forza già esistere!
La puoi creare come rettangolo con tutte le coordinate 0, tanto verrà sovrascritta.
hSrcRgn1 e hSrcRgn2 sono le due regioni che verranno combinate tra loro.
nCombineMode è la modalità di conbinamento.
Puoi usare le costanti che ti ho elencato sopra.
Ecco il loro significato:
RGN_OR = imposta il risultato come somma delle due regioni di partenza.
RGN_DIFF = imposta il risultato come differenza tra hSrcRgn1 e hSrcRgn2, cioè solo la parte di regione di hSrcRgn1 che nn è occupata da hSrcRgn2.
RGN_AND = solo ciò che è compreso da tutte e 2 le regioni
RGN_XOR = la somma delle 2 regioni esclusa l'intersezione
RGN_COPY = restituisce semplicemente le copia di hSrcRgn1.
Ed ora qualche esempio:
Prova questo codice:
codice:
Dim x1 As Long, x2 As Long, x3 As Long
'Crea un rettangolo 100x100
x1 = CreateRectRgn(0, 0, 100, 100)
'Crea un ellisse a partire da 100 in orizzontale e 100 in verticale,
'di dimensioni 100x100
x2 = CreateEllipticRgn(100, 100, 200, 200)
'Inizializza x3
x3 = CreateRectRgn(0, 0, 0, 0)
'Imposta x3 come somma di x1 e x2
Call CombineRgn(x3, x1, x2, RGN_OR)
'Ora la finestra occupa la regione x3.
Call SetWindowRgn(hWnd, x3, True)
Esempio #2:
codice:
Me.BackColor = &HCCFF88
Dim Punti(1 To 10) As POINTAPI
Dim SIZE As Integer
SIZE = 60
Dim i As Integer
For i = 1 To 10 Step 2
Punti(i).x = i * SIZE
Punti(i).y = SIZE
Punti(i + 1).x = (i + 1) * SIZE
Punti(i + 1).y = SIZE * 2
Next i
Dim x As Long
x = CreatePolygonRgn(Punti(1), 10, 1)
Call SetWindowRgn(hWnd, x, True)