Créer une icône

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Créer une icône

Message par Octavius »

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).

Code : Tout sélectionner

Procedure CreateIcon(Image.l)
  Protected NewIcon.ICONINFO,Mask.l,Icon.l
  
  Mask=CreateImage(#PB_Any,ImageWidth(Image),ImageHeight(Image),32)
  
  NewIcon\fIcon=#True
  NewIcon\hbmMask=ImageID(Mask)
  NewIcon\hbmColor=ImageID(Image)
  
  Icon=CreateIconIndirect_(@NewIcon)
  FreeImage(Mask)
  
  ProcedureReturn Icon
EndProcedure
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Créer une icône

Message par Backup »

8O 8O 8O 8O
ça a l'air bien , (pas encore utilisé) , mais quelque chose me chiffone grave ! :lol:

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 ...

en tout cas , bien joué... :)
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Créer une icône

Message par Octavius »

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).
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Créer une icône

Message par Le Soldat Inconnu »

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

Re: Créer une icône

Message par Anonyme2 »

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

Il faudra détruire l'icône retournée avec l'API DestroyIcon_()

Code : Tout sélectionner

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

Re: Créer une icône

Message par Anonyme2 »

J'ai retrouvé les 3 lignes d'explication sur la création du mask.
C'est extrait du fichier README.TXT lorsque vous aurez décompressés le fichier 4493.exe ici
http://msdn.microsoft.com/en-us/library/ms997538.aspx

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.
Répondre