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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

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

Message 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 :)
Dernière modification par Jacobus le ven. 18/oct./2024 20:11, modifié 2 fois.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

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

Message par cage »

Bonjour,

@Jacobus: Merci pour ton code.

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

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message par Ar-S »

Cool,

Peut être pourrais tu fusionner avec : https://www.purebasic.fr/english/viewtopic.php?t=65091
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

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

Message 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.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

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

Message par ZapMan »

Excellente idée ! Merci ! Je viens de l'ajouter à ma liste d'utilitaires.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

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

Message 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.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

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

Message 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.
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

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

Message 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
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

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

Message 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
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre