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
