+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Automatizzare la creazione di Shaped-controls

  1. #1
    John Hawk non è in linea Scolaretto
    Buongiorno a tutti.

    In un programma che sto realizzando ho la necessità di inserire delle immagini in formato .PNG che possiedono delle aree trasparenti. Poichè non è possibile caricare immagini con tale formato usando i metodi nativi di VB mi avvalgo di un modulo (scaricabile da qui), che però riempie le zone trasparenti con un BackColor stabilito a run-time.

    Ma il risultato che io voglio raggiungere è assimililabile a quello ottenibile usando immagini .GIF : infatti, se io carico una .GIF che possiede delle trasparenze in un controllo Image, riesco a vedere cosa c'è sotto la mia immagine nelle zone trasparenti. E' ovvio che se io, con il metodo sopra, riempio le trasparenze con un colore non potrò vedere più cosa c'è sotto la mia immagine nelle zone riempite da suddetto colore.

    Ho pensato quindi di ritagliare l'area del controllo che ospita l'immagine seguendo il bordo dell'immagine stessa.
    Allego qui un'immagine per rendere meglio l'idea di quanto ho intenzione di fare.

    Se riuscissi a ritagliare l'immagine seguendo il contorno deliniato in ROSSO è come se io avessi reso visibili solo le aree visibili dell'immagine e conseguentemente invisibili le zone trasparenti... So che è contorto ma abbiate pietà (e pazienza ahahah)

    Ho elaborato un pò di codice, ma ovviamente non funziona:
    Private Sub ShapePic (ByVal myPic As PictureBox, ByVal FillColor As Long)
        Dim Pt() As POINTAPI, wX As Long, hY As Long
        Dim hRgn As Long, oldRgn As Long
    
        `Carico prima l`immagine PNG usando i metodi del modulo sopra, poi
        myPic.ScaleMode = vbPixels
        For wX = 1 To myPic.ScaleWidth
            For hY = 1 To myPic.ScaleHeight
                If myPic.Point(wX, hY) = FillColor Then
                    On Error Resume Next
                    ReDim Preserve Pt(1 To Ubound(Pt) + 1) As POINTAPI
                    If Err Then 
                       ReDim Pt(1 To 1) As POINTAPI
                       Err.Clear
                    End If
                    With Pt(Ubound(Pt))
                         .X = wX
                         .Y = hY
                    End With
               End If
           Next
        Next
        hRgn = CreatePolygonRgn (Pt(1), UBound(Pt), 2)
        Call SetWindowRgn(myPic.hWnd, hRgn, True)
        myPic.Refresh
    End Sub
    
    Inoltre, seguendo questo metodo avrei la possibilità di delimitare le azioni del Mouse solo sulle zone visibili del controllo, esclundendo un Click nel buco al centro dell'immagine (come in questo esempio).

    Spero di aver dato tutte le informazioni necessarie affinchè possiate capire il perchè di questa mia scelta. Ed ora ecco la domanda:
    come fare per ritagliare un'immagine seguendone i bordi?

    Inoltre avrei delle condizioni particolari sul quesito:

    1. vorrei essere quanto più accurato, preciso e veloce possibile (al limite del maniacale)

    2. vorrei che la routine risultante si possa riutilizzare per qualunque immagine (cioè non deve essere strettamente legata all'esempio)

    3. e SE l'immagine contiene dei buchi (come quella di esempio) come fare per ritagliare anche queste zone?


    Grazie anche solo per aver letto tutta questa pappardella ,
    John

  2. #2
    John Hawk non è in linea Scolaretto
    up, please

  3. #3
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Quote Originariamente inviato da John Hawk Visualizza il messaggio
    up, please
    é inutile uppare!

    Non pretenderai che i membri di questo forum si scorazzino tutto il sito che hai linkato alla ricerca di un qualcosa che nemmeno sanno cos'è?

    Inoltre, con tutti i siti gratuiti ed efficienti che esistono, hai caricato l'immagine su un sito che
    - bisogna leggersi una pagina
    - capire come si fa
    - aspettare 2 minuti
    - inserire il captcha

    insomma, peggio di così non si può, ce la metti tutta per non farti aiutare.

    ℹ️ Leggi di più su gibra ...

  4. #4
    John Hawk non è in linea Scolaretto
    Ciao Gibra,
    ho dovuto caricare l'immagine su quel sito perchè non stavo riuscendo a visualizzare la pagina di MediaFire.com (che solitamente uso per queste occasioni).

    Per quanto riguarda il link al tuo sito (è tuo vero? ) pensavo fosse più facile e immediato trovare i sorgenti del modulo in questione. Sarà che sei un pò disordinato?

    Ma non è possibile inserire un allegato ai post? Senza doversi appoggiare a siti esterni?
    Se si, mi diresti come devo fare?

    Infine, ho uppato il messaggio perchè m'è sembrato stesse andando troppo in giù e senza una soluzione
    Mi dispiace e mi scuso

    Aspetto comunque risposte perchè non sono riuscito a combinare niente fino ad ora

    Ciao, John

  5. #5
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Quote Originariamente inviato da John Hawk Visualizza il messaggio
    Per quanto riguarda il link al tuo sito (è tuo vero? ) pensavo fosse più facile e immediato trovare i sorgenti del modulo in questione. Sarà che sei un pò disordinato?
    Se non ci arrivi da solo, non vale la pena di spiegartelo.

    ℹ️ Leggi di più su gibra ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. automatizzare creazione collegamento ipertestuale
    Da bibo60100 nel forum Microsoft Excel
    Risposte: 12
    Ultimo Post: 08-04-2013, 15:08
  2. Risposte: 2
    Ultimo Post: 17-11-2011, 07:08
  3. [ACCESS] Automatizzare la creazione di macro
    Da deidedeide nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 20-04-2007, 17:41
  4. [Jet/VB6] Shaped report
    Da cippalippa nel forum Altri Database Server
    Risposte: 0
    Ultimo Post: 13-07-2006, 09:23
  5. Shaped query
    Da cippalippa nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 15-01-2006, 00:01