Voilà un petit bout de code qui permet de transformer une image (32 bits avec couche alpha gérée) en icône. Le handle qui est retourné par cette procédure peut être utilisé par exemple comme argument de ButtonImageGadget à la place d'une image ou pour n'importe quel endroit où on aurait besoin d'une icône et où les images ne fonctionnent pas (certaines fonctions API par exemple).
ça a l'air bien , (pas encore utilisé) , mais quelque chose me chiffone grave !
ton code parait bien simple , lorsque je sais combien le Soldat inconnu a galéré a faire des icones
en utilisant un mix de Purebasic et de photoshop
a mon avis (et si ta procedure marche...) ; il a du faire une crise cardiaque en voyant qu'en si peu de lignes , il aurai pu résoudre son probleme, qui etait la fabrication d'icone ...
Merci, mais tu as raison, ce code ne contient pas toutes les informations d'un icône "normal". Déjà, j'utilise une image vide pour faire le masque, alors que le masque d'un icône normal contient des informations pour certains effets graphiques (mais je ne sais pas trop lesquels). Et il y a aussi le fait qu'une icône possède souvent plusieurs formats dans le même fichier 96*96, 48*48, etc. alors que là il n'y en a qu'un (celui de l'image d'origine). Mais bon, moi ça ne m'a jamais gêné pour l'instant, je pense que tous ces trucs qui manquent sont très secondaires.
PS: une autre petite astuce, si on remplace NewIcon\fIcon=#True par NewIcon\fIcon=#False, on crée un curseur (mais je ne m'en suis jamais servi).
oui, ça ne crée que un format de l'icône, la galère, c'est pour faire du multiformat, avec création du masque en automatique, etc ...
Denis en a fait les frais lui aussi, de ce beau bordel made in crochiotte
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Voilà ce que j'utilise dans mon projet actuel, je crois bien que je l'ai déjà posté (supprimer les lignes de gestion des erreurs qui sont propres à mon projet)
De souvenir, il me semble avoir vu une explication de MS (elles sont rares) pour créer le mask voir même un code en C, il faut que je retrouve, à moins que mon code en tienne compte, beaucoup d'eau a coulé depuis
Il faudra détruire l'icône retournée avec l'API DestroyIcon_()
ProcedureDLL.i PIM_BitmapToIcon(hBmpSrc, width, height)
;///////////////////////////////////////////////////////////////////////////////////////////////////
;
; FONCTION: BitmapToIcon()
;
; BUT: créer une icône depuis l'image Bmp passée en paramètre par hBmpSrc
;
; PARAMS: hBmpSrc - identifiant dynamique de l'image bitmap à convertir en icône
; hBmpSrc = ImageId(#image)
; width - largeur de l'icône
; width - hauteur de l'icône
;
; RETOURNE: le handle Microsoft sur l'icône, qui est détruit ensuite par la fonction
; appelante
; Retourne #Return_Error (= 0) en cas d'erreur
;
;///////////////////////////////////////////////////////////////////////////////////////////////////
;- Structures Image
Structure Image
StructureUnion
bm.BITMAP
pii.ICONINFO
EndStructureUnion
EndStructure
;// mémorise le handle du contexte de périphérique (hdc)
Protected hdc
;// mémorise le handle de l'icône créée
Protected LocalIcon
;// mémoire partagée pour retrouver les infos du bitmap puis celle de l'icône
Protected Var.Image
;// retrouve les informations sur l'image passée en paramètre
If GetObject_(hBmpSrc, SizeOf(BITMAP), 0) = #Return_Error
PIM_SetError_Code(#Error_Unable_to_Get_BitmapInformation)
ProcedureReturn #Return_Error
EndIf
;// crée un contexte de périphérique basée compatible avec l'écran courant
hdc = CreateCompatibleDC_(0)
If hdc = #Return_Error
PIM_SetError_Code(#Error_Unable_to_Create_CompatibleDC)
ProcedureReturn #Return_Error
EndIf
;// crée un bitmap compatible avec le périphérique basé sur le hdc
Var\pii\hbmMask = CreateCompatibleBitmap_(hdc, width, height)
If Var\pii\hbmMask = #Return_Error
DeleteDC_(hdc)
PIM_SetError_Code(#Error_Unable_to_Create_CompatibleBitmap)
ProcedureReturn #Return_Error
EndIf
;// libération des ressources des divers éléments créés
DeleteDC_(hdc)
;// remplissage des champs de la variable (pour l'icône
Var\pii.ICONINFO\fIcon = #True
Var\pii\hbmColor = hBmpSrc
;// création de l'icône
LocalIcon = CreateIconIndirect_(@Var)
DeleteObject_(Var\pii\hbmMask)
DeleteObject_(Var\pii\hbmColor)
;// si la création de l'icône a échouée, on définit l'erreur correspondante
If LocalIcon = #Return_Error
PIM_SetError_Code(#Error_Code_CreateIcon_Failed)
EndIf
;// retourne le handle de l'icône
ProcedureReturn LocalIcon
EndProcedure
La doc est ancienne mais toujours valable. Je me suis basé sur le code C donné (en particulier le fichier DIB.C) pour écrire les fonctions que j'utilise dans l'utilitaire que je développe (PureIconManager), j'ai adapté le tout pour supporter les icônes Vista.
C'est tout ce que j'ai trouvé sur les icônes, il existe un livre de MS qui date de Win95 qui détaille les icônes mais je n'ai pas réussi à le trouver (je ne retrouve plus la ref de ce bouquin)
When creating the AND mask for an icon (or any transparent BitBlt), a simple
method is to BitBlt from the source image to a mono bitmap and let GDI do the
conversions based on SetBkColor(). This will not work with DIBSections. Any
BitBlt'ing with DIBSections results in color mapping without regard to the
background color.