Page 1 sur 2

ButtonImageGadget & Transparence de PNG

Publié : sam. 06/sept./2008 18:52
par Progi1984
Bijr à tous,

Voilà, je suis en train de faire une appli multiplateforme. Actuellement, la transparence de mes images est correctement chargée sous Ubuntu. Par contre pas sous XP, j'ai un beau carré noir. J'en appelle à vous pour battre ce carré noir ! Pas de pb d'api :)
Et parcequ'il faut du code :

Code : Tout sélectionner

  UsePNGImageDecoder()
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      #OS_Dir_Separator = "\"
    CompilerCase #PB_OS_Linux
      #OS_Dir_Separator = "/"
  CompilerEndSelect
  If OpenWindow(0, 0, 0, 160, 100, "ButtonImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    If LoadImage(0, "images"+#OS_Dir_Separator+"00.png")
      ButtonImageGadget(0, 10, 10, 100, 83, ImageID(0))
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Et la tite image : Image

Merci à vous
@+

Publié : sam. 06/sept./2008 19:29
par Jacobus
j'ai essayé (avec Vista) en catch et c'est pareil, le format png ne fonctionne pas avec les gadgets (imagegadget et buutonimagegadget) mais c'est peut-être normal...

extrait de la doc:
Windows: les icônes doivent être utilisées pour avoir de la transparence dans les gadgets et les toolbars.

Linux: les PNG avec alpha-channel doivent être utilisées pour avoir de la transparence dans les gadgets et les toolbars.

MacOS X: les PNG avec alpha-channel doivent être utilisées pour avoir de la transparence dans les gadgets et les toolbars. L'alpha-channel est complètement préservé, ce qui permet d'afficher des effets d'ombre pour les images.

Publié : sam. 06/sept./2008 20:53
par Progi1984
C'est pour cela que je cherche une solution par api ou dll...

Publié : sam. 06/sept./2008 21:47
par Thyphoon
un debut de solution ici peut être
http://www.purebasic.fr/french/viewtopi ... hlight=png

Publié : sam. 06/sept./2008 21:54
par Anonyme2
Voilà un code que j'ai fait il y a quelques mois et qui marche. Change le chemin de l'image (variable file$)

Denis

Code : Tout sélectionner

EnableExplicit

#Return_Error = 0
#Fichier = 0


;- Structures Image
Structure Image
     StructureUnion
          bm.BITMAP
          pii.ICONINFO
     EndStructureUnion
EndStructure

Global file$, *Memory_File, Resultat.l, icone.l


Procedure.l BitmapToIcon(hBmpSrc.l, width.l, height.l)
     ; permet de créer une icône depuis l'image Bmp passée en paramètre par hBmpSrc
     ; les paramètres width et height sont la largeur et la hauteur de l'icône
     ; pour un résultat valable la taille de l'image doit correspondre à celle de l'icône
     
     ; mémorise le handle du contexte de périphérique
     Protected hdc.l
     ; mémorise le handle de l'icône créée
     Protected LocalIcon.l
     ; mémorise le handle de l'image bmp crée pour le masque de l'icône créée
     Protected BmpCreated.l
     ; mémoire partagée pour retrouver les infos du bitmap puis celle d''icône
     Protected Var.Image
     
     If GetObject_(hBmpSrc, SizeOf(BITMAP), @Var) = #Return_Error
          ProcedureReturn #Return_Error
     EndIf
     
     hdc = CreateCompatibleDC_(0)
     If hdc = #Return_Error
          ProcedureReturn #Return_Error
     EndIf
     
     BmpCreated = CreateCompatibleBitmap_(hdc, width, height)
     If BmpCreated = #Return_Error
          DeleteDC_(hdc)
          ProcedureReturn #Return_Error
     EndIf
     
     Var\pii.ICONINFO\fIcon = #True
     Var\pii\hbmMask = BmpCreated
     Var\pii\hbmColor = hBmpSrc
     LocalIcon = CreateIconIndirect_(@Var)
     
     DeleteDC_(hdc)
     DeleteObject_(BmpCreated)
     DeleteObject_(Var\pii\hbmMask)
     DeleteObject_(Var\pii\hbmColor)
     
     ProcedureReturn LocalIcon
EndProcedure

Procedure.l ExtractIcon(Memory_Add.l)
     ; crée une icône à partir d'un bmp au format png
     ;
     ; Memory_Add --> est l'adresse du 1er octet de l'image Png
     ;
     ; La fonction retourne #Return_Error en cas d'erreur sinon le handle de l'icône
     ; non compressée qui devra être détruit par la fonction appelante
     
     ; mémorise l'image décodée, c'est un identifiant statique
     Protected LocalBmp.l
     ; mémorise le handle de l'icône crée au format RGB/A non compressé
     Protected LocalIcon.l
     
     
     LocalBmp = CatchImage(#PB_Any, Memory_Add)
     
     If LocalBmp = #Return_Error
          ProcedureReturn #Return_Error
     EndIf
     LocalIcon = BitmapToIcon(ImageID(LocalBmp), ImageWidth(LocalBmp), ImageHeight(LocalBmp))
     FreeImage(LocalBmp)
     
     ProcedureReturn LocalIcon
EndProcedure


UsePNGImageDecoder()

file$ = "00.png"

*Memory_File = AllocateMemory(FileSize(file$))
If *Memory_File
     ; on copie les données
     If ReadFile(0, file$)
          Resultat = ReadData(0, *Memory_File, FileSize(file$))
          
          If Resultat <>  FileSize(file$)
               MessageRequester("Erreur", "ReadData n'a pas retournée la bonne valeur", 16)
          Else
               icone = ExtractIcon(*Memory_File)
               If icone
                    If OpenWindow(0, 0, 0, 160, 100, "ButtonImageGadget    ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
                         ButtonImageGadget(0, 10, 10, 100, 83, icone)
                         Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
                    EndIf
                    DestroyIcon_(icone)
               EndIf
          EndIf
     Else
          MessageRequester("Erreur", "impossible d'ouvrir le fichier", 16)
     EndIf
Else
     MessageRequester("Erreur", "impossible d'allouer de la mémoire", 16)
EndIf

If *Memory_File
     FreeMemory(*Memory_File)
EndIf

End

Publié : sam. 06/sept./2008 22:44
par nico
Les boutons sous XP accepte une image_list, donc il suffit de la créer et de l'affecter au bouton:

Image

Code : Tout sélectionner

	Structure BUTTON_IMAGELIST
	    himl.l
	    margin.rect
	    uAlign.l
	EndStructure 
	
	Global BUTTON_IMAGELIST.BUTTON_IMAGELIST

  UsePNGImageDecoder()
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      #OS_Dir_Separator = "\"
    CompilerCase #PB_OS_Linux
      #OS_Dir_Separator = "/"
  CompilerEndSelect
  
  If OpenWindow(0, 0, 0, 300, 300, "ButtonImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CreateGadgetList(WindowID(0))

    If LoadImage(0, "c:\anneaux.png")
    ; Important 256,256 sont les dimensions de l'image, pensez à les modifier
		Himl=ImageList_Create_(256,256,#ILC_COLOR32,0,0)
		ImageList_Add_(himl,ImageID(0),0)
    EndIf
    
    ButtonImageGadget(0, 10, 10, 256, 256, 0)
    
    #BCM_SETIMAGELIST=$1602
    #BUTTON_IMAGELIST_ALIGN_CENTER=4
	BUTTON_IMAGELIST\himl=himl
	BUTTON_IMAGELISTuAlign=#BUTTON_IMAGELIST_ALIGN_CENTER
    SendMessage_(GadgetID(0),#BCM_SETIMAGELIST,0,@BUTTON_IMAGELIST)
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Publié : dim. 07/sept./2008 9:10
par Progi1984
Désolé Denis, je préfère le code de Nico :D

Nico, j'en ai créé une procédure :

Code : Tout sélectionner

Structure BUTTON_IMAGELIST
  himl.l
  margin.RECT
  uAlign.l
EndStructure
#BCM_SETIMAGELIST=$1602
#BUTTON_IMAGELIST_ALIGN_CENTER=4
Procedure ButtonImageGadget_(Gadget, X, Y, Width, Height, Image)
  Protected hImg.l
  Protected btnImgList.BUTTON_IMAGELIST
  hImg = ImageList_Create_(ImageWidth(Image),ImageHeight(Image),#ILC_COLOR32,0,0)
  ImageList_Add_(hImg,ImageID(Image),0)
  ButtonImageGadget(Gadget, X, Y, Width, Height, 0)
  btnImgList\himl=hImg
  btnImgList\uAlign=#BUTTON_IMAGELIST_ALIGN_CENTER
  SendMessage_(GadgetID(Gadget),#BCM_SETIMAGELIST,0,@btnImgList)
EndProcedure
  UsePNGImageDecoder()
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      #OS_Dir_Separator = "\"
    CompilerCase #PB_OS_Linux
      #OS_Dir_Separator = "/"
  CompilerEndSelect
  If OpenWindow(0, 0, 0, 160, 100, "ButtonImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    If LoadImage(0, "images"+#OS_Dir_Separator+"00.png")
      ButtonImageGadget_(0, 10, 10, 100, 83, 0)
      ButtonImageGadget_(1, 110, 10, 100, 83, 0)
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Publié : dim. 07/sept./2008 11:45
par Anonyme2
C'est pas grave, c'est une bonne approche :D


Denis

Publié : dim. 07/sept./2008 11:59
par Anonyme2
N'oublies pas de détruire l'ImageList lorsque tu n'en as plus besoin avec ImageList_Destroy()

http://msdn.microsoft.com/en-us/library ... S.85).aspx

Denis

Publié : jeu. 07/mai/2009 22:04
par Backup
apres multiples tests , vos 2 codes ne fonctionne plus !!

je parle du code a Nico et la version en procedure de progi1984 ;)

celui de Denis fonctionne :)

Publié : ven. 08/mai/2009 7:06
par Anonyme2
C'est le code que j'utilise (dans la librairie que je développe) après décompression des icônes Vista (format PNG) pour recréer une icône, ça marche très bien.

Mais bon, Progi1984 m'a snobé :mrgreen:

Publié : ven. 08/mai/2009 8:20
par Progi1984
Non, je ne t'ai pas snobbé ! Je t'ai zappé ! :lol: Désolé !

Publié : ven. 08/mai/2009 8:21
par Anonyme2
:mrgreen:

Publié : ven. 08/mai/2009 8:38
par Backup
Denis a écrit :C'est le code que j'utilise (dans la librairie que je développe)
ha? quand la sortie de ta lib ??

et elle fera quoi ? :)

Publié : ven. 08/mai/2009 10:40
par Thyphoon
pour la 4.40 ce problème sera réglé !
http://www.purebasic.fr/blog/?p=131

Edit: la balise url ne marche plus ?

Dobro :-> pas vraiment utile dans notre forum de toute façon :)