2011-01-24 6 views
0

Dans une application MFC.Utilisation d'une barre d'outils MFC et d'une image PNG avec transparence, effets de transparence incorrects

Je charge un fichier PNG 32 bits avec des bits de canal alpha dans un fichier Gdiplus :: Bitmap en utilisant FromFile. J'utilise ensuite Bitmap :: GetHBitmap pour récupérer un HBITMAP du Gdiplus :: Bitmap. J'utilise cette poignée pour ajouter le bitmap à une liste d'images. J'utilise cette liste d'images pour ajouter des boutons de barre d'outils à une barre d'outils.

Cependant, pour une raison étrange, l'image n'utilise pas le canal alpha comme prévu. Au lieu d'utiliser le canal alpha pour déterminer la transparence, il utilise la combinaison du canal alpha et la proximité de la couleur du pixel en blanc (0x ?? FFFFFF) pour calculer la transparence. Ainsi, une image avec des pixels blancs progressivement transparents n'apparaît pas du tout, cependant une image avec des pixels noirs progressivement transparents s'affiche correctement. J'ai ensuite modifié le code pour m'assurer que mon bitmap vers HBitmap utilise transparent comme couleur d'arrière-plan et que la couleur d'arrière-plan de la liste d'images et de la barre d'outils est transparente et donne les mêmes résultats. J'ai également utilisé le HBITMAP pour obtenir un CBitmap et prémultiplié les bitmapbits en utilisant la méthode AlphaBlend() pour dessiner sur une fenêtre, et cela dessine correctement.

Je me suis assuré que ma liste d'images utilise le paramètre d'image 32 bits, le drapeau ILC_COLOR32. Donc, je sais que le problème réside dans la façon dont l'image est ajoutée à la liste d'images ou à la barre d'outils, mais ne peut pas comprendre comment corriger cela.

Tout cela est fait dynamiquement, donc je n'ai pas le même problème que les gens se plaignent de VisualStudio en supprimant le canal alpha.

+0

Lorsque vous créez la liste d'images, spécifiez-vous l'indicateur 'ILC_COLOR32'? –

+0

Oui, je précise que le drapeau –

+0

Pourquoi avez-vous passé autant de temps * décrivant * votre code au lieu de * l'afficher *? Il est tellement plus facile de déboguer le problème si je peux lire le code source. –

Répondre

0

Problème résolu, il s'agissait d'un code incroyablement caché qui convertissait la blancheur en transparence. C'est au-delà de moi pourquoi, mais voilà.

ne hésitez pas à fermer la question.

Questions connexes