Page 1 sur 1

Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : ven. 18/oct./2024 9:53
par Jacobus
Bonjour tout le monde.
Aujourd'hui je vous propose un programme qui va vous permettre d'utiliser des icônes facilement pour agrémenter les codes que vous poster sur le forum, sans être obligé de faire de longues listes de Datasection, ou de préciser qu'il faut charger ses propres icônes. C'est toujours plus sympathique pour l'utilisateur de vos codes. Bien entendu, vous pouvez aussi l'utiliser pour vos applis perso ou encore l'ajouter dans les outils de PB.
Les icônes sont extraites de la DLL Shell32. J'en ai trouvé 334 exactement dans Windows 11, ce qui laisse un large choix :)
J'ai essayé de commenter suffisamment pour les débutants, qu'ils ne soient pas trop perdus avec les API.
Le code montre entre autres l'usage simple : d'un Thread, du redimensionnement de la fenêtre, d'un bouton image+texte.
Si vous êtes "open" vous pouvez même compléter ce petit programme avec diverses fonctions de gestion des icônes, en fonction de vos besoins.

J'ai ajouté une petite fonction qui permet de générer le code à insérer directement dans votre projet, via le presse-papier.
Soit par un clic-droit sur l'icône dans la liste, soit en sélectionnant une icône et en cliquant sur le bouton "Générer le code".

Code : Tout sélectionner

;-===========================
;Extracteur d'icônes by Jacobus/utilisateurs PB
;facilitant l'utilisation d'icônes dans les codes mis sur le forum
;PB 6.11LTS - Windows11
;Utilisation des API
;-===========================
Enumeration ;{
  #WIN_DOW
  #BTN_Refresh
  #BTN_Code
  #BTN_Quit
  #ListIcones
  ;}
EndEnumeration
#PROGRAMNAME = "Extracteur d'icônes Shell32.dll"
Global Quit
Global Thread = 0 ;On en aura besoin plusieurs fois, donc on le rend d'usage global
Procedure Extraction_icones(*param) 
  For a = 1 To 334 ; (334 icônes trouvées dans Windows11) 
    ico = ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", a) ; <--- fonction d'extraction à utiliser dans vos codes et applis
    AddGadgetItem(#ListIcones,-1,Str(a),ico)
  Next 
  Thread = 0 ; une fois la tâche terminée on remet le thread à zéro. Ainsi on pourra actualiser la liste si besoin.
EndProcedure
Procedure Generer_Code()
  ;Génère le code automatiquement placé dans le Clipboard()
  ;pour le coller dans votre code
  ClearClipboard() ; efface le presse-papier
  Nbico = CountGadgetItems(#ListIcones)
  If Nbico <> 0
    For nd = 0 To Nbico - 1
      Resultat = GetGadgetItemState(#ListIcones, nd)
      If Resultat & #PB_ListIcon_Selected
        SelectedIcon$ = GetGadgetItemText(#ListIcones, nd, 0)
        ;Le code est créé avec le numéro de l'icône voulu et placé dans le presse-papier
        ;prêt à être collé là où vous voulez
        SetClipboardText("ExtractIcon_(GetModuleHandle_(#Null), "+Chr(34)+"Shell32.dll"+Chr(34)+","+SelectedIcon$+")")
      EndIf 
    Next
  EndIf 
EndProcedure
Procedure Resize_WIN_DOW()
  WinWidth  = WindowWidth(#WIN_DOW,#PB_Window_InnerCoordinate)
  WinHeight = WindowHeight(#WIN_DOW,#PB_Window_InnerCoordinate)  
  ResizeGadget(#ListIcones,#PB_Ignore,#PB_Ignore,WinWidth-20,WinHeight-50)
  ResizeGadget(#BTN_Quit,WinWidth-130,#PB_Ignore,#PB_Ignore,#PB_Ignore)
  UpdateWindow_(#WIN_DOW)
EndProcedure

;Petit test pour ne pas lancer le programme plusieurs fois.
#SW_SHOWNORMAL = 1
hwnd.l = FindWindow_(#Null,#PROGRAMNAME)
If hwnd ;si le programme est déjà lancé
  ShowWindow_(hwnd, #SW_SHOWNORMAL) ;on affiche la fenêtre
Else 
;sinon on crée la fenêtre et on démarre le programme
If OpenWindow(#WIN_DOW, 100, 100, 1024, 768, #PROGRAMNAME, #PB_Window_SystemMenu |#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget | #PB_Window_ScreenCentered|#PB_Window_Invisible)
  WindowBounds(#WIN_DOW,1024, 768, #PB_Default, #PB_Default);taille minimale de la fenêtre
  ;Exemple concret d'utilisation, une fois l'icône choisie dans la liste
  ;il vous suffit de saisir son numéro comme ci-dessous pour l'utiliser avec votre bouton.
  ;Mais aussi dans vos menus, popupmenus,... et là où vous en avez besoin.
  ButtonGadget(#BTN_Refresh,10, 5, 120, 30,Space(2)+"Actualiser") 
  SetWindowLongPtr_(GadgetID(#BTN_Refresh), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#BTN_Refresh), #GWL_STYLE) |#BS_LEFT)
  SendMessage_(GadgetID(#BTN_Refresh), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 270)) ;<-- utilisation de l'icône n° 270 trouvée dans Shell32.dll
  GadgetToolTip(#BTN_Refresh,"Rafraichir la liste - exemple d'utilisation d'un icône extraite")
  
  ButtonGadget(#BTN_Code,135, 5, 150, 30,Space(2)+"Générer le code") 
  SetWindowLongPtr_(GadgetID(#BTN_Code), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#BTN_Code), #GWL_STYLE) |#BS_LEFT)
  SendMessage_(GadgetID(#BTN_Code), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 137)) ;<-- utilisation de l'icône n° 72 trouvée dans Shell32.dll
  GadgetToolTip(#BTN_Code,"Générer le code et le placer dans le presse-papier")
  
  ButtonGadget(#BTN_Quit,WindowWidth(#WIN_DOW,#PB_Window_InnerCoordinate)-130, 5, 120, 30,Space(2)+"Quitter") 
  SetWindowLongPtr_(GadgetID(#BTN_Quit), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#BTN_Quit), #GWL_STYLE) |#BS_LEFT)
  SendMessage_(GadgetID(#BTN_Quit), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 215)) ;<-- utilisation de l'icône n° 215 trouvée dans Shell32.dll
  GadgetToolTip(#BTN_Quit,"Fermer la fenêtre et quitter le programme")
  
  ;Affichage des icônes trouvées dans une liste dédiée  
  ListIconGadget(#ListIcones,10,40,1004,728,"Shell32.dll Icônes",100)
  SetGadgetAttribute(#ListIcones, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon) ;nécessaire pour afficher les images 
  
  ;Redimensionnement de la fenêtre en temps réel, c'est magique! 
  BindEvent(#PB_Event_SizeWindow, @Resize_WIN_DOW())
  ;Affichage de la fenêtre après la création de tous les gadgets
  HideWindow(#WIN_DOW,#False)
  
  ;-PROGRAMME
  ;Un Thread est plus efficace pour ce genre de tâche
  ;ne pas oublier de cocher l'option Activer la gestion des threads avant de compiler!
  Thread = CreateThread(@Extraction_icones(),0)
  ;Gestion des évènements  
  Repeat  
    Select WaitWindowEvent()
        ;-===========================
        ;-Event Menus      
      Case #PB_Event_Menu
        Select EventMenu()
            
        EndSelect
        ;-===========================     
        ;-Event Gadgets      
      Case #PB_Event_Gadget  
        Select EventGadget()
            
          Case #ListIcones  ;{
            Pos = GetGadgetState(#ListIcones)
            If Pos >= 0
              If EventType() = #PB_EventType_RightClick
                If GetGadgetItemState(#ListIcones, Pos) = #PB_ListIcon_Selected
                  SelectedIcon$ = GetGadgetItemText(#ListIcones, Pos, 0)
                  ;Le code est créé avec le numéro de l'icône voulu et placé dans le presse-papier
                  ;prêt à être collé là où vous voulez
                  SetClipboardText("ExtractIcon_(GetModuleHandle_(#Null), "+Chr(34)+"Shell32.dll"+Chr(34)+","+SelectedIcon$+")")
                  Debug GetClipboardText()
                EndIf
              EndIf
            EndIf
            ;}            
          Case #BTN_Refresh ;{
            If Thread <> 0  ; si le thread est en cours
            ;on ne fait rien, on le laisse se terminer
            ElseIf Thread = 0  ;sinon s'il n'y a pas de thread...           
              ClearGadgetItems(#ListIcones) ;on nettoie la liste
              Thread = CreateThread(@Extraction_icones(),0) ;que l'on remplie à nouveau grâce au Thread
            EndIf 
            ;}
          Case #BTN_Code : Generer_Code() : Debug GetClipboardText() ;si vous laissez le Debug, cela permet de créer une liste de codes disponibles
          Case #BTN_Quit : Quit = 1
            
        EndSelect
        ;-===========================     
        ;-Event Close Window      
      Case #PB_Event_CloseWindow      
        Select EventWindow()     
          Case #WIN_DOW 
            Quit = 1          
        EndSelect
        
    EndSelect 
    ;-END  
  Until Quit = 1
  ;tout est libéré
  End    
EndIf      
EndIf  
Amusez-vous bien :)

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : ven. 18/oct./2024 12:13
par cage
Bonjour,

@Jacobus: Merci pour ton code.

Fonctionne très bien chez moi, mais ne trouve que 328 icônes.

cage

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : ven. 18/oct./2024 13:15
par Ar-S
Cool,

Peut être pourrais tu fusionner avec : https://www.purebasic.fr/english/viewtopic.php?t=65091

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : ven. 18/oct./2024 14:19
par Jacobus
Hello :)
cage a écrit : ven. 18/oct./2024 12:13 Fonctionne très bien chez moi, mais ne trouve que 328 icônes.
Cela dépend de ton système, chaque version de Windows doit avoir des icônes différentes.
Ar-S a écrit : ven. 18/oct./2024 13:15 Peut être pourrais tu fusionner avec : https://www.purebasic.fr/english/viewtopic.php?t=65091
Ce programme est très bien mais n'a pas le même objectif. Je propose simplement d'utiliser les icônes existantes de Windows pour se simplifier la vie. vectoricons ne permet pas ça. Mais chacun peut intégrer l'un dans l'autre s'il le souhaite.

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : ven. 18/oct./2024 17:08
par ZapMan
Excellente idée ! Merci ! Je viens de l'ajouter à ma liste d'utilitaires.

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : ven. 18/oct./2024 19:32
par Jacobus
Salut ZapMan, le genre de petit truc qui peut faire gagner du temps.
J'ai modifié le code dans le premier post pour ajouter une fonction qui fera gagner encore plus de temps.
Un clic droit sur une icône permet de générer le code à insérer dans son projet. Et avec le Debugger, on peut en faire une liste.

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : sam. 19/oct./2024 8:38
par Mesa
Très bonne idée.

Cependant, je n'arrive pas à modifier le code pour obtenir les dimensions des icônes, imagewidth() ne fonctionne pas.

Alors pour ceux que ça intéresse, j'ai trouvé ce code qui me donne ça et c'est pas simple.
https://www.purebasic.fr/english/viewto ... 43#p417143

Mesa.

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : sam. 19/oct./2024 9:12
par cage
Bonjour,

Je me permet de citer un site que je trouve très intéressant pour la diversité des utilitaires qu'il propose

MiTeC Homepage

et en particulier l'utilitaire Icon Explorer

cage
Image

Re: Extracteur d'icônes - à utiliser dans vos codes sur le forum

Publié : sam. 19/oct./2024 14:32
par Jacobus
Mesa a écrit : sam. 19/oct./2024 8:38 Très bonne idée.

Cependant, je n'arrive pas à modifier le code pour obtenir les dimensions des icônes, imagewidth() ne fonctionne pas.

Alors pour ceux que ça intéresse, j'ai trouvé ce code qui me donne ça et c'est pas simple.
https://www.purebasic.fr/english/viewto ... 43#p417143

Mesa.
Salut Mesa, oui le problème est d'extraire le fichier de la DLL pour en récupérer les données. Je ne connaissais pas le programme de Nalor qui est excellent, il fait très bien le travail pour récupérer des icônes au format png, mais il faut retravailler dessus pour utiliser l'icône par la suite. Je le garde dans mes archives pour un usage ultérieur.
Dans le même genre, LSI avait fait un prog un peu similaire, ici : https://www.purebasic.fr/french/viewtop ... it=GetIcon