ButtonImageGadget & Transparence de PNG

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

ButtonImageGadget & Transparence de PNG

Message 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
@+
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

C'est pour cela que je cherche une solution par api ou dll...
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

un debut de solution ici peut être
http://www.purebasic.fr/french/viewtopi ... hlight=png
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

C'est pas grave, c'est une bonne approche :D


Denis
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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:
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Non, je ne t'ai pas snobbé ! Je t'ai zappé ! :lol: Désolé !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

:mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ? :)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 :)
Répondre