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 :
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
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:
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
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
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é

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

Désolé !
Publié : ven. 08/mai/2009 8:21
par Anonyme2
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 