Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Form s(form)ati

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    128

    Form s(form)ati

    Mi chiedo: è possibile dare al form una forma diversa?
    Per esempio, se avete presente la schermata del DivX Player, non ha la forma rettangolare. Non so se ha una base rettangolare con uno sfondo trasparente, ma in Visual Basic non è possibile... o si?


  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012

    Creare una finestra dalla forma anormale

    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)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    128

    Veramente tanto gentile!!! Non me l'aspettavo proprio una spiegazione così dettagliata!!

    Ora provo, poi ti faccio sapere

    Mille grazie!

    Allanon

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    128
    P.S.: PROPONGO L'INSERIMENTO NELLE PILLOLE DI SAGGEZZA

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    128
    ho due dubbi...

    codice:
    Public Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    lo metto in un modulo?

    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
    Perchè VB mi cancella automaticamnte Alias "CreateEllipticRgn" ?

  6. #6
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Se le usi come Public le devi mettere per forza in un modulo.
    Se sono Private, va bene anche un form.

    2) Probabilmente xkè non è necessario l'alias.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    128
    Perchè mi dice "non valido all'esterno di una routine"?

  8. #8
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Dove lo hai messo?

    Posta il codice

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    128
    Adesso non ce l'ho sotto mano, l'ho fatto ieri sera e mi diceva in quel modo.

    Ho fatto un form e un modulo.
    tutte le public le ho messe nel modulo.

    In effetti non mi resta molto facile, voglio fare il passo più lungo della gamba?

  10. #10
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Se non hai il codice sotto mano c'è poco da fare!

    Su che linea ti dava l'errore?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.