Newsgroup: it.comp.lang.visual-basic
Titolo: Window Poligonali xchè non vanno a me??





Ciao sto cercando di fare una form di forma 
poligonale come sapete (ovviamente) basta settare la proprietà di REGION! Per 
fare questo ho richiamato dalla libreria la funzione che lo fa (comunque qui 
sotto c'è il codice). Io creo un array di POINT che andranno a comporre la forma 
della finestra. Quando ho tutti i punti setto la forma ma la form non cambia 
come mai?? 


Qui c'è il codice il programma funziona così si 
fanno 4 clic in 4 punti e con questi punti si dovrebbe creare una form di forma 
poligonale!


Qualcuno sa cosa devo fare ? Cosa c'è di sbagliato 
? HO provato un bel po' ma non ho ottenuto risultati. 


Quello che mi sorprende è che ho 'importato' anche 
altre funzioni sempre per le region e queste funzionano.


 


Mi affido a voi e ringrazio preventivamente 



   Filippo 


 


 


 


 


 


'Ad ogni clic di mouse il vettore di punti viene 
settato
'alla fine poi tutti i punti creano un poligono che
'verrà settato 
come region della finestra
'


 


'Winapi POINT
Private Type POINT
X As 
Long
Y As Long
End Type


 


Private Type RECT
     
left As Long   'x1
     top As 
Long    'y1
     right As Long  
'x2
     bottom As Long  'y2


 


End Type


 


Private Const max As Integer = 5
Dim vet(max) 
As POINT
Dim bound As RECT
'contatore per il poligono
Dim cont As 
Integer
'contatore per le linee
Dim lcont As Integer


 


'Region Function
'Setta la region di una form 
argomenti : l'handle della finesta,l'handle della region,se ridisegnare la form 
dopo il settaggio
Private Declare Function SetWindowRgn Lib "user32.dll" 
(ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As 
Long
'Crea un region elittica e ritorna l'handle
Private Declare Function 
CreateEllipticRgn Lib "Gdi32.dll" (ByVal x1 As Long, ByVal y1 As Long, ByVal x2 
As Long, ByVal y2 As Long) As Long
'crea un region poligonale (array di 
point,grandezza dell'array,il fill mode)
Private Declare Function 
CreatePolygonRgn Lib "Gdi32.dll" (ppt() As POINT, ByVal cPoints As Integer, 
ByVal fnPolyFillMode As Integer) As Long
'crea un region rettangolare (x 
angolo superio sn,y angolo sup sn, x angolo inferiore dx, y ang inf 
dx)
Private Declare Function CreateRectRgn Lib "Gdi32.dll" (ByVal nLeftRect 
As Integer, ByVal nTopRect As Integer, ByVal nRightRect As Integer, ByVal 
nBottomRect As Integer) As Long
'Costanti per il fill mode del region 
poligonare
Private Const ALTERNATE As Long = 1
Private Const WINDING As 
Long = 2
   
'Funzioni per la gestione del mouse
Private 
Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINT) As 
Long
Private Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, 
ByVal Y As Long) As Long
Private Declare Function GetWindowRect Lib 
"user32.dll" (ByVal hWnd As Long, ByRef lpRect As RECT) As Long


 


Private Sub Form_Click()
Dim ese As 
Long
Dim p As POINT
ese = GetCursorPos(p)
'ritorno le coordinate 
relative alla mia finestra
vet(cont).X = p.X - bound.left
vet(cont).Y = 
p.Y - bound.top
MsgBox cont & "°click (" & vet(cont).X & "," 
& vet(cont).Y & ")"
cont = cont + 1
If (cont >= max) 
Then
        'Chiudo il 
poligono
        vet(max) = 
vet(0)
        

        Dim h As 
Long
        h = CreatePolygonRgn(vet(), 
max, WINDING)
        'h = 
CreatePolygonRgn(vet(), 5, 
ALTERNATE)
        'se la funzione 
fallisce ritorna null
        'altrimenti 
l'handle
        If (h = Null) 
Then
           MsgBox 
"ERRORE NELLA CREAZIONE REGION ", vbOKOnly + 
vbCritical
           Exit 
Sub
        End 
If
        

        Dim err As 
Long
        err = SetWindowRgn(Me.hWnd, 
h, True)
        

        'se err è 0 allora la 
funzione
        'non ha eseguito 
l'operazione
        If (err = 0) Then 
MsgBox "ERRORE IN SETREGION " & 
err
        cont = 
0
        
Me.Refresh
        
End If


 


End Sub


 


Private Sub Form_Load()
cont = 0
lcont = 
0
'MsgBox Me.Width & "x" & Me.Height
'SetWindowRgn Me.hWnd, 
CreateRectRgn(10, 10, 30, 30), True
Dim res As Long
res = 
GetWindowRect(Me.hWnd, bound)
If (res = 0) Then
 MsgBox "ERRORE GET 
WINDOW"
 Unload Me
Else
    MsgBox bound.left & 
"," & bound.top & ")(" & bound.right & "," & 
bound.bottom
End If
End Sub


 


 



 wrote in message
news:93t01f$34v$1...@serv1.albacom.net...






Non credo possa utilizzare un vettore di punti come 
primo parametro di createpolygonrgn, infatti è definito come un pontatore long a 
un struttura POINTAPI.


Devi creare una striuttura POINTAPi


 


Private Type POINTAPI
    X1 As 
Long
    Y1 As Long
    X2 As 
Long
    Y2 As Long
    X3 As 
Long
    Y3 As Long
    X4 As 
Long
    Y4 As Long
    X5 As 
Long
    Y5 As Long
    X6 As 
Long
    Y6 As Long
End Type


Private Declare Function CreatePolygonRgn Lib 
"Gdi32.dll" (ppt As POINTAPI, ByVal cPoints As Integer, ByVal fnPolyFillMode As 
Integer) As Long


Dim S As POINTAPI
....


...evento click


... 


If (cont >= max) 
Then
        'Chiudo il 
poligono


 


        VET(max) 
= VET(0)
        S.X1 = 
VET(0).X
        S.Y1 = 
VET(0).Y
        S.X2 = 
VET(1).X
        S.Y2 = 
VET(1).Y
        S.X3 = 
VET(2).X
        S.Y3 = 
VET(2).Y
        S.X4 = 
VET(3).X
        S.Y4 = 
VET(3).Y
        S.X5 = 
VET(4).X
        S.Y5 = 
VET(4).Y
        S.X6 = 
VET(5).X
        S.Y6 = 
VET(5).Y
        

        Dim h As 
Long
        h = CreatePolygonRgn(S, max, 
WINDING)
....


 


    Ciao



 wrote in message
news:93v89f$qo3$1...@nread2.inwind.it...



Già funziona anche così. Questo vuole dire che Vb tratta i vettori
memorizzando gli elementi in aree contigue di memoria come in C... buono a
sapersi. Quello che mi domando è se questa cosa è documentata ovvero se
questa compatibilià e garantita per il futuro.
    ciao

 wrote in message
news:941pec$omq$1...@nread2.inwind.it...
