Page 1 sur 1

[RESOLU] GIF Transparent

Publié : lun. 30/avr./2007 11:06
par Progi1984
Voilà, grâce à ce code, j'arrive à afficher sans problème un GIF...

Mais petit problème : il affiche en zone noire la partie transparente.
On m'a dit qu'il y avait des possibilités avec GDI+ mais n'étant pas un expert de ce type de code, j'en appelle à vous...
Lien intéressant : http://marknelson.us/2002/07/01/renderi ... -revisited

Code : Tout sélectionner

; Pour quitter, clic droit 
Procedure LoadPictureFile(image,szFile.s)  
  ;  
  ; Loads  
  ;        BMP, GIF, JPG, WMF, EMF, ICO  
  ;  
  hFile = CreateFile_(szFile, #GENERIC_READ, 0, #Null, #OPEN_EXISTING, 0, #Null)  
  If hFile  
    dwFileSize = GetFileSize_(hFile, #Null)  
    HGLOBAL    = GlobalAlloc_(#GMEM_MOVEABLE, dwFileSize)  
    If HGLOBAL  
      pvData = GlobalLock_(HGLOBAL)  
 
      bRead = ReadFile_(hFile, pvData, dwFileSize, @dwBytesRead, #Null)  
      GlobalUnlock_(HGLOBAL)  
       
      If bRead  
        If CreateStreamOnHGlobal_(HGLOBAL, #True, @pstm.IStream) = #S_OK  
          If OleLoadPicture_(pstm, dwFileSize, #False,?IID_IPicture, @Bild.IPicture) = #S_OK  
 
            ; Here we got the IPicture Object  
 
            Bild\get_Height(@Height)  
            Bild\get_Width(@Width)  
             
            hDC = GetDC_(GetDesktopWindow_())  
            ScreenPixels_X = GetDeviceCaps_(hDC,#LOGPIXELSX)  
            ScreenPixels_Y = GetDeviceCaps_(hDC,#LOGPIXELSY)  
            ReleaseDC_(GetDesktopWindow_(),hDC)  
 
            PicHeight = (Height * ScreenPixels_X) / 2540  
            PicWidth  = (Width  * ScreenPixels_Y) / 2540  
             
            result = CreateImage(image,PicWidth,PicHeight)  
             
            If result  
              hDC = StartDrawing(ImageOutput(image))  
                Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0)  
              StopDrawing()  
            EndIf  
             
            Bild\Release()  
          EndIf  
          pstm\Release()  
        EndIf  
      EndIf  
    EndIf  
    CloseHandle_(hFile)  
  EndIf  
  ProcedureReturn Image  
 
  DataSection  
    IID_IPicture:  
      Data.l $7BF80980  
      Data.w $BF32,$101A  
      Data.b $8B,$BB,$00,$AA,$00,$30,$0C,$AB  
  EndDataSection  
EndProcedure  


Image = LoadPictureFile(1,"C:\Perso\PureBasic\CodeArchiv\Graphics\Gfx\anim_surprize.gif")
If Image
  OpenWindow(1,0,0,ImageWidth(Image),ImageHeight(Image),"ImageV!ew",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
  CreateGadgetList(WindowID(1))
  ImageGadget(1,0,0,ImageWidth(Image),ImageHeight(Image),ImageID(Image))
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : End
      Case #WM_RBUTTONUP         : End
      Case #WM_LBUTTONDOWN       : SendMessage_(WindowID(1),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
    EndSelect
  ForEver
EndIf

Publié : lun. 30/avr./2007 13:52
par Anonyme2
Salut Progi1984

je ne pense pas que GDI+ corrigera ton problème (tout au moins en conservant la même manière de faire).

Voilà ce que je pense :
Tu affiches ton image non pas sur la fenêtre avec l'identifiant statique 1 (ta fenêtre principale) mais sur une imagegadget qui n'est rien d'autre qu'une fenêtre qui a le fond noir. Une imageGadget est une fenêtre Windows avec la classe "Static" (c'était comme ça juste avant la version 4, je n'ai pas recontrôlé).

La classe "Static" est enregistrée avec le paramètre hbrBackground de la structure WNDCLASSEX valant 0, qui n'est ni plus ni moins que du noir. MS dit que si ce paramètre est à 0, l'application doit repeindre son fond etc etc... (j'ai testé ton code avec l'API GetClassInfoEx_() et j'ai bien ce paramètre à 0). Ton image applique bien la transparence sur du noir.

Si on utilise GDI+ en affichant sur une imageGadget, on aura le même problème.

Mais que veux-tu faire ?

Avoir une image mobile que tu puisses déplacer sur tout l'écran dont les pixels transparents laisseraient passer le fond ?
Si c'est ça, reportes-toi à l'excellent exemple de l'horloge d'erix14. Tu pourrais t'en inspirer, en particulier de l'API UpdateLayeredWindow_().

Publié : lun. 30/avr./2007 14:57
par Progi1984
Denis a écrit :Mais que veux-tu faire ?
Je souhaite que la couleur de transparence soit égale à la couleur de fond des fenêtres... soit en général le gris et non pas le noir !

Publié : lun. 30/avr./2007 15:19
par Anonyme2
J'ai peut être dit des conneries, c'est plutôt du à la création de l'image avec createimage qui d'origine à le fond noir (les variables mise à 0 par défaut
Sinon un simple StartDrawing doit faire l'affaire.
Bizarre ton histoire de fond de fenêtre grise, en général c'est beige, voire blanc.

voilà comment modifier le code dans ta procedure LoadPictureFile, j'ai ajouté Box(0, 0, PicWidth, PicHeight , 255) qui mettra le fond en rouge

Moi j'utilise ceci pour avoir la couleur système des fenêtres :

Code : Tout sélectionner

GetSysColor_(#COLOR_BTNFACE)

Code : Tout sélectionner

            If result 
              hDC = StartDrawing(ImageOutput(image))
                Box(0, 0, PicWidth, PicHeight , 255)  ; <---   ici
                Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0) 
              StopDrawing() 
            EndIf 

ce qui donne pour le fond couleur système

Code : Tout sélectionner

            If result 
              hDC = StartDrawing(ImageOutput(image))
                Box(0, 0, PicWidth, PicHeight , GetSysColor_(#COLOR_BTNFACE))  ; <---   ici
                Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0) 
              StopDrawing() 
            EndIf 
Si ca ne va pas , regarde les nombreuses constantes de Getsyscolor (en particulier #COLOR_WINDOW)

Publié : lun. 30/avr./2007 15:31
par Progi1984
C'est nickel ! Merci Denis !

Publié : sam. 05/mai/2007 10:43
par RV
C'est nickel pour une fenetre avec une couleur comme fond mais pas pour une fenetre avec comme fond une image!

Y-a-t'il un code pour ce cas?

Publié : lun. 07/mai/2007 8:09
par Anonyme2
RV a écrit :C'est nickel pour une fenetre avec une couleur comme fond mais pas pour une fenetre avec comme fond une image!

Y-a-t'il un code pour ce cas?

RV, commences par poster ton code de base car s'il faut tout faire de a à z, t'auras pas beaucoup de réponse.

Publié : lun. 07/mai/2007 10:13
par RV
Salut Denis,

C'est vrai, j'aurais du.
En même temps je n'attends plus de soluces car j'en ai une!

Donc ce post est [RESOLU]

PS: ma soluce ne concerne pas les GIFs, mais simplement les images.

Publié : lun. 07/mai/2007 10:33
par Backup
RV a écrit :PS: ma soluce ne concerne pas les GIFs, mais simplement les images.
ce qui est dommage c'est de ne pas en faire profiter le forum, de ta soluce .. :?

Publié : lun. 07/mai/2007 11:18
par RV
Salut Dobro,

Je suis hors sujet sur ce post car je ne parle pas de GIFs.
Je bosse sur les skins de gadgets et je voulais savoir comment récupérer un bout d'image de fond pour dessiner dessus afin de créer genre un bouton avec ImageGadget(), ce que fait très bien GrabImage().

Désolé pour le dérangement!

Publié : mar. 08/mai/2007 6:22
par Kwai chang caine
Bonjour à tous

Et pour les GIF animés ....

Quelqu'un aurait il trouvé quelque chose de mieux que le webgadget pour les afficher ????