Page 1 sur 1

Une ToolBar "améliorée"

Publié : sam. 19/déc./2009 14:55
par Anonyme2
C'est pour répondre au Soldat Inconnu concernant la ToolBar que j'utilise dans PureIconManager.

Je poste ici pour ne pas encombrer mon message sur PureIconManager car j'aimerais des retours.

Pour la ToolBar, voici 2 codes. C'est du code brut, à vous de tester et corriger.

Le premier sans Rebar (la Rebar permet de faire par exemple une toolbar flottante) donc le fond de la ToolBar est celui de la fenêtre (sous Seven c'est ça).

Le second, lorsque la ToolBar est créée, je l'inclue dans une Rebar et là le fond est bleu, c'est du au thème par défaut.

Sous XP c'est moins joli, mais XP c'est déjà de l'histoire ancienne :mrgreen:

Si on n'active pas les thèmes, le résultat est médiocre, dans mon code PureIconManager, j'ai écrit des fonctions qui permettent d'afficher correctement mais je n'ai pas mis ici, ça m'a pris déjà pas mal de temps à extraire ça et à tester (il faut utiliser DrawAlphaImage).

Je met un zip pour les images png de PureIconeManager, mais vous pouvez utiliser des images png 32x32 de votre choix (modifier le chemin en Datasection).

Le zip ici

Code : Tout sélectionner

EnableExplicit

;// constante de la ToolBar
#Flag = #TBSTYLE_LIST | #TBSTYLE_ALTDRAG | #TBSTYLE_FLAT | #TBSTYLE_TOOLTIPS | #TBSTYLE_TRANSPARENT | #TBSTYLE_WRAPABLE | #CCS_TOP | #WS_CHILD | #WS_OVERLAPPED | #WS_VISIBLE
#IE1_style = #RBS_BANDBORDERS | #RBS_DBLCLKTOGGLE | #RBS_REGISTERDROP | #RBS_VARHEIGHT | #CCS_NODIVIDER | #CCS_NOPARENTALIGN
#IE_style = #IE1_style | #WS_CLIPSIBLINGS | #WS_VISIBLE | #WS_BORDER | #WS_CHILD | #WS_CLIPCHILDREN
;- constante de dimension des icônes de la barre d'outils
#Hauteur_Icone_Toolbar = 32
#Largeur_Icone_Toolbar = #Hauteur_Icone_Toolbar

;// Options de la fenêtre
#Option_Fenetre = #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered


;// fenêtres
Enumeration 0
     #MainWindow
EndEnumeration

;// gadgets
Enumeration 0
     #Listicon
EndEnumeration

#Id_ToolBar_Boutons = 500
Enumeration #Id_ToolBar_Boutons ; boutons Toolbar principale
     #Bouton_folder_ouvrir
     #Bouton_Extraire
     #Bouton_Convertir
     #Bouton_supprimer
     #Bouton_Favoris
     #Bouton_Tools
     #Bouton_Aide
     #Bouton_Apropos
     #Bouton_Quit
     #Bouton_Separation_1 ; n'existe pas
EndEnumeration

#Premiere_Icone_ToolBar = 0
Enumeration #Premiere_Icone_ToolBar ; icônes Toolbar principale
     #folder_ouvrir
     #Enregistrer
     #Convertir
     #supprimer
     #Favoris
     #Tools
     #Aide
     #Apropos
     #Quit
     #Separateur_ToolBar
     #Derniere_Icone_ToolBar = #Quit
EndEnumeration


Enumeration 1 ; Popupmenu
     #PopupImageMenu_ToolBar_Bouton_Enregistrer
     
EndEnumeration




;- variables
;// la ToolBar
Global h_Main_ToolBar.l
Global Old_Window_Proc.i
Global L_OriginProc.i
;// La fenêter principale
Global hMainWindow.l
;// L'imageList des boutons
Global ImageList_Toolbar.l

Global Old_Window_Proc.i


Procedure CleanUp()
     ;// libère tous les éléments de la ToolBar et met les variables globales à 0
     
     ;// détruit la ListImage si existe
     If ImageList_Toolbar
          ImageList_Destroy_(ImageList_Toolbar)
          ImageList_Toolbar = 0
     EndIf
     
     ;//
     If h_Main_ToolBar
          ;// La fenêtre ToolBar existe
          
          ;// La callback ToolBar existe ?
          If L_OriginProc
               SetWindowLongPtr_(h_Main_ToolBar, #GWL_WNDPROC, L_OriginProc)
               L_OriginProc = 0
          EndIf
          
          ;// destruction de la fenêtre ToolBar
          DestroyWindow_(h_Main_ToolBar)
          h_Main_ToolBar = 0
     EndIf
     
     If Old_Window_Proc
          If IsWindow(#MainWindow)
               SetWindowLongPtr_(WindowID(#MainWindow), #GWL_WNDPROC, Old_Window_Proc)
          EndIf
          Old_Window_Proc = 0
     EndIf
EndProcedure

Procedure.i MainToolBarCallBack(Window, Message, wParam, lParam)
     Protected ReturnValue = CallWindowProc_(Old_Window_Proc, Window, Message, wParam, lParam)
     
     Protected rc.RECT
     ; mémorise le nombre de fichiers lors de l'ouverture de la boite Openfilerequester
     Protected FileNumber.l
     ;// mémorise les coordonnées de la zone client de la fenêtre principale
     Protected rcClient.RECT
     ;// mémorise les données de la barre pour mise à jour
     Protected lprbbi.REBARBANDINFO
     
     
     Select Message
               
               ; Case #WM_THEMECHANGED
               
          Case #WM_COMMAND
               Select (wParam & $FFFF) ; l'identifiant statique du bouton
                         
                    Case #Bouton_folder_ouvrir
                         MessageRequester("Bouton", "Bouton Ouvrir enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Extraire
                         MessageRequester("Bouton", "Bouton Extraire enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Convertir
                         MessageRequester("Bouton", "Bouton Convertir enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_supprimer
                         MessageRequester("Bouton", "Bouton supprimer enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Favoris
                         MessageRequester("Bouton", "Bouton Favoris enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Tools
                         MessageRequester("Bouton", "Bouton Tools enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Aide
                         MessageRequester("Bouton", "Bouton Aide enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Apropos
                         MessageRequester("Bouton", "Bouton A propos de enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Quit
                         MessageRequester("Bouton", "Bouton Quitter enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
               EndSelect
               
               ; Case #WM_ACTIVATEAPP
               
          Case #WM_ACTIVATE
               Select wParam
                    Case #WA_ACTIVE, #WA_CLICKACTIVE
                         If IsWindow(#MainWindow)
                              BringWindowToTop_(WindowID(#MainWindow))
                         EndIf
               EndSelect
               
               
          Case #WM_NOTIFY
               Protected *notify.NMTOOLBAR
               Protected tb.TBBUTTON
               Protected Item.l
               
               *notify = lparam
               
               If *notify\hdr\code = #TBN_DROPDOWN
                    SendMessage_(*notify\hdr\hwndFrom, #TB_GETRECT, *notify\iItem, @rc)
                    MapWindowPoints_(*notify\hdr\hwndFrom, #HWND_DESKTOP, @rc, 2)
                    Item = SendMessage_(*notify\hdr\hwndFrom, #TB_GETHOTITEM, 0, 0)
                    If Item > -1
                         SendMessage_(*notify\hdr\hwndFrom, #TB_GETBUTTON, item, tb)
                         ;DisplayPopupMenu(tb\dwdata, *notify\hdr\hwndFrom, rc\left, rc\bottom)
                         ProcedureReturn 0
                    EndIf
               EndIf
               
     EndSelect
     
     ProcedureReturn ReturnValue
EndProcedure

Procedure AddImageToImageList(ImageList.l, StaticIcon.l, Position.l = -1)
     
     ;// insère une icône dans l'ImageList de la Toolbar
     ;// les tailles des icônes sont définies lors de la création de la toolbar
     ;// La procedure ne retourne pas de valeur mais le programme se terminera si une icône n'a pu être insérée
     ;// L'icône d'origine est détruite par la procédure
     ;
     ;// mémorise le contexte de périphérique
     Protected hdc
     ;// mémorise l'erreur de l'API
     Protected Erreur
     ;// mémorise l'imageId de l'image courante
     Protected Image
     
     
     If IsImage(StaticIcon)
          Image = ImageID(StaticIcon)
          
          ;// on ajoute les images à la liste d'image, transparence gérée par Windows
          Erreur = ImageList_Add_(ImageList, Image, 0)
          FreeImage(StaticIcon)
          If Erreur < 0
               CleanUp()
               MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
               End
          EndIf
          
          
     Else
          SetWindowLongPtr_(h_Main_ToolBar, #GWL_WNDPROC, L_OriginProc)
          CleanUp()
          End
     EndIf
EndProcedure

Procedure AddToolBarButton(ImageList.l, StaticIcon.l, State.l, Style.l, dwData, *String)
     ; La procedure ajoute le bouton à la toolbar avec les valeurs passées en paramètres
     Protected Item.TBBUTTON ; structure création des boutons de la toolbar
     
     
     Item\iBitmap = StaticIcon ; index 1ere image de la liste
     If StaticIcon = #Separateur_ToolBar
          Item\idCommand = -1
     Else
          Item\idCommand = StaticIcon + #Id_ToolBar_Boutons
     EndIf
     Item\fsState = State
     Item\fsStyle = Style
     Item\dwData = dwData
     Item\iString = *String
     If SendMessage_(ImageList, #TB_INSERTBUTTON, Item\idCommand, @Item) = #False
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
EndProcedure

Procedure CreateMainToolBarButtons()
     ;// chargement des toutes les icônes de la barre d'outils 48x48 RVB/A
     
     ;// compteur de boucle
     Protected i.l
     ;// mémorise la chaine de la resource
     Protected Texte$
    
     
     UsePNGImageDecoder()
     CatchImage(#folder_ouvrir, ?folder_ouvrir)
     CatchImage(#Enregistrer, ?Enregistrer)
     CatchImage(#Convertir, ?Convertir)
     CatchImage(#supprimer, ?supprimer)
     CatchImage(#Favoris, ?Favoris)
     CatchImage(#Tools, ?Tools)
     CatchImage(#Aide, ?Aide)
     CatchImage(#Apropos, ?Apropos)
     CatchImage(#Quit, ?Quit)
     
     For i = #Premiere_Icone_ToolBar To #Derniere_Icone_ToolBar
          If IsImage(i) = 0
               CleanUp()
               MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
               End
          EndIf
     Next
     
     ; on ajoute les icônes à la liste d'image et dans l'ordre d'apparition
     AddImageToImageList(ImageList_Toolbar, #folder_ouvrir)
     AddImageToImageList(ImageList_Toolbar, #Enregistrer)
     AddImageToImageList(ImageList_Toolbar, #Convertir)
     AddImageToImageList(ImageList_Toolbar, #supprimer)
     AddImageToImageList(ImageList_Toolbar, #Favoris)
     AddImageToImageList(ImageList_Toolbar, #Tools)
     AddImageToImageList(ImageList_Toolbar, #Aide)
     AddImageToImageList(ImageList_Toolbar, #Apropos)
     AddImageToImageList(ImageList_Toolbar, #Quit)
     
     ;// on ajoute les boutons à la toolbar et dans l'ordre
     ;le bouton Ouvrir
     Texte$ = "Ouvrir"
     AddToolBarButton(h_Main_ToolBar, #folder_ouvrir, #TBSTATE_ENABLED, #BTNS_SHOWTEXT, 0, @Texte$)
     
     Texte$ = "Enregistrer"
     AddToolBarButton(h_Main_ToolBar, #Enregistrer, #TBSTATE_ENABLED, #BTNS_DROPDOWN | #BTNS_SHOWTEXT, #PopupImageMenu_ToolBar_Bouton_Enregistrer, @Texte$)
     
     ;// le bouton convertir
     Texte$ = "Convertir"
     AddToolBarButton(h_Main_ToolBar, #Convertir, #TBSTATE_INDETERMINATE, #BTNS_DROPDOWN | #BTNS_SHOWTEXT, 0, @Texte$)
     
     ;// le bouton supprimer
     Texte$ = "Supprimer"
     AddToolBarButton(h_Main_ToolBar, #supprimer, #TBSTATE_ENABLED, #BTNS_SHOWTEXT, 0, @Texte$)
     
     ;le bouton 1ere barre de séparation
     AddToolBarButton(h_Main_ToolBar, #Separateur_ToolBar, #TBSTATE_ENABLED, #BTNS_SEP, 0, 0)
     
     ;// le bouton faoris
     Texte$ = "Favoris"
     AddToolBarButton(h_Main_ToolBar, #Favoris, #TBSTATE_INDETERMINATE, 0, 0, @Texte$)
     
     ;// le bouton préférences
     Texte$ = "Préférences"
     AddToolBarButton(h_Main_ToolBar, #Tools, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
     ;//  le bouton d'aide
     Texte$ = "Aide"
     AddToolBarButton(h_Main_ToolBar, #Aide, #TBSTATE_INDETERMINATE, 0, 0, @Texte$)
     
     ;// le bouton barre de séparation
     AddToolBarButton(h_Main_ToolBar, #Separateur_ToolBar, #TBSTATE_ENABLED, #BTNS_SEP, 0, 0)
     
     ; le bouton A propos de
     Texte$ = "A propos de"
     AddToolBarButton(h_Main_ToolBar, #Apropos, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
     ; le bouton quitter
     Texte$ = "Quitter"
     AddToolBarButton(h_Main_ToolBar, #Quit, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
EndProcedure

Procedure CreateMainToolBar()
     ;// mémorise l'adresse d'origine de la calback toolbar
     Protected L_OriginProc
     ;// mémorise le style de la toolbar
     Protected style
     
     
     
     h_Main_ToolBar = CreateWindow_("ToolbarWindow32", 0, #Flag, 0, 0, 0, 0, hMainWindow, 0, 0, 0)
     If h_Main_ToolBar = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     ;// envoi du message obligatoire #TB_BUTTONSTRUCTSIZE après création de la barre avec CreateWindowEx_ mais avant l'ajout de boutons etc
     ;// Ce message n'a pas de valeur de retour
     SendMessage_(h_Main_ToolBar, #TB_BUTTONSTRUCTSIZE, SizeOf(TBBUTTON), 0)
     
     ;// retrouve le style avant de le modifier
     style = SendMessage_(h_Main_ToolBar, #TB_GETEXTENDEDSTYLE, 0, 0)
     ; ajout des styles #TBSTYLE_EX_MIXEDBUTTONS,#TBSTYLE_EX_DRAWDDARROWS et #TBSTYLE_EX_HIDECLIPPEDBUTTONS
     SendMessage_(h_Main_ToolBar, #TB_SETEXTENDEDSTYLE, 0, style | #TBSTYLE_EX_MIXEDBUTTONS | #TBSTYLE_EX_DRAWDDARROWS | #TBSTYLE_EX_HIDECLIPPEDBUTTONS)
     
     ;- ImageList Toolbar
     ;// création de l'ImageList associée à la barre d'outils
     ImageList_Toolbar = ImageList_Create_(#Hauteur_Icone_Toolbar, #Largeur_Icone_Toolbar, #ILC_MASK | #ILC_COLOR32, 8, 12)
     If ImageList_Toolbar = #Null
          ;// L'API a échouée, on libère les ressource avnt de quitter
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     ;// associe l'ImageList à la barre d'outils
     SendMessage_(h_Main_ToolBar, #TB_SETIMAGELIST, 0, ImageList_Toolbar)
     
     ;// Réglage de la taille des boutons, du style et de la position de la barre
     SendMessage_(h_Main_ToolBar, #TB_SETBUTTONSIZE, 0, #Largeur_Icone_Toolbar + (#Hauteur_Icone_Toolbar<<16))
     
     SendMessage_(h_Main_ToolBar, #TB_SETSTYLE, 0, #IE_style|#CCS_NOMOVEY); | #CCS_NORESIZE)
     
     
     SendMessage_(h_Main_ToolBar, #TB_AUTOSIZE, 0, 0)
     
     ;// retrouve le style avant de le changer, permet afficher les barres de séparation
     style = GetWindowLong_(h_Main_ToolBar, #GWL_STYLE)
     SetWindowLongPtr_(h_Main_ToolBar, #GWL_STYLE, style | #CCS_NODIVIDER)
     
     ;// fige la taille de l'indentation
     SendMessage_(h_Main_ToolBar, #TB_SETINDENT, 2, 0)
     
     ;// subclass la toolbar (fenêtre principale pour les événements comme WM_COMMAND etc)
     Old_Window_Proc = SetWindowLongPtr_(hMainWindow, #GWL_WNDPROC, @MainToolBarCallBack())
     
     If Old_Window_Proc = #Null
          ;// L'API a échouée, on libère les ressource avnt de quitter
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     ; création des boutons de la Toolbar
     CreateMainToolBarButtons()
     
EndProcedure


;- Fenêtre principale
hMainWindow = OpenWindow(#MainWindow, 0, 0, 980, 650, "Essai TolBar32", #Option_Fenetre) ;|#PB_Window_SizeGadget)
If hMainWindow = 0
     MessageRequester("Erreur", "Impossible de créer la fenêtre principale", 16)
     End
EndIf

;// limite de la fenêtre
WindowBounds(#MainWindow, 980, 650, #PB_Ignore , #PB_Ignore)

;// création de la ToolBar
CreateMainToolBar()

If ListIconGadget(#Listicon, 10, 100, WindowWidth(#mainwindow)-20, 150, "ListIcon", WindowWidth(#mainwindow)-20)
     
EndIf

;// affiche la fenêtre
HideWindow(#MainWindow, 0)


;- Boucle
Repeat
     
     Select WaitWindowEvent()
               
          Case #PB_Event_CloseWindow
               CleanUp()
               Break
     EndSelect
     
ForEver
End


DataSection
     IncludePath "E:\PureBasic\Projets\Editeur d icones\PureIconManager\PIM_1_0\Icone_barre_outils"
     
     ;// les image PNG
     folder_ouvrir :
     IncludeBinary "Folder ouvrir.png"
     
     Enregistrer :
     IncludeBinary "Enregistrer_sous.png"
     
     Convertir :
     IncludeBinary "Convertir.png"
     
     supprimer :
     IncludeBinary "supprimer_32_32.png"
     
     Favoris :
     IncludeBinary "Favoris.png"
     
     Tools :
     IncludeBinary "Tools.png"
     
     Aide :
     IncludeBinary "Aide.png"
     
     Apropos :
     IncludeBinary "logo_PB.png"
     
     Quit :
     IncludeBinary "exit_32x32.png"
EndDataSection
et le second avec Rebar

Code : Tout sélectionner

EnableExplicit

;// constante de la ToolBar
#Flag = #TBSTYLE_LIST | #TBSTYLE_ALTDRAG | #TBSTYLE_FLAT | #TBSTYLE_TOOLTIPS | #TBSTYLE_TRANSPARENT | #TBSTYLE_WRAPABLE | #CCS_TOP | #WS_CHILD | #WS_OVERLAPPED | #WS_VISIBLE
#IE1_style = #RBS_BANDBORDERS | #RBS_DBLCLKTOGGLE | #RBS_REGISTERDROP | #RBS_VARHEIGHT | #CCS_NODIVIDER | #CCS_NOPARENTALIGN
#IE_style = #IE1_style | #WS_CLIPSIBLINGS | #WS_VISIBLE | #WS_BORDER | #WS_CHILD | #WS_CLIPCHILDREN
;- constante de dimension des icônes de la barre d'outils
#Hauteur_Icone_Toolbar = 32
#Largeur_Icone_Toolbar = #Hauteur_Icone_Toolbar

;// Options de la fenêtre
#Option_Fenetre = #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered

#TB_GETBUTTONSIZE = #WM_USER + 58
#TBSTYLE_EX_MIXEDBUTTONS = $00000008
#BTNS_SHOWTEXT = $40
#BTNS_AUTOSIZE = #TBSTYLE_AUTOSIZE
#TB_SETLISTGAP = #WM_USER + 96
#TBN_DROPDOWN = -710
#TB_GETRECT = $400 + 51

#TBSTYLE_DROPDOWN = $8
#TBSTYLE_EX_DRAWDDARROWS = $1
#TB_SETEXTENDEDSTYLE = $400 + 84
#TB_GETEXTENDEDSTYLE = $400 + 85
#TBSTYLE_EX_HIDECLIPPEDBUTTONS = $00000010
#BTNS_DROPDOWN = #TBSTYLE_DROPDOWN
#RBBS_USECHEVRON = $00000200
#RBN_CHEVRONPUSHED = (#RBN_FIRST-10)
#RBBS_HIDETITLE = $00000400
#RB_SETBANDWIDTH = #WM_USER + 44

;// fenêtres
Enumeration 0
     #MainWindow
EndEnumeration

;// gadgets
Enumeration 0
     #Listicon
EndEnumeration

#Id_ToolBar_Boutons = 500
Enumeration #Id_ToolBar_Boutons ; boutons Toolbar principale
     #Bouton_folder_ouvrir
     #Bouton_Extraire
     #Bouton_Convertir
     #Bouton_supprimer
     #Bouton_Favoris
     #Bouton_Tools
     #Bouton_Aide
     #Bouton_Apropos
     #Bouton_Quit
     #Bouton_Separation_1 ; n'existe pas
EndEnumeration

#Premiere_Icone_ToolBar = 0
Enumeration #Premiere_Icone_ToolBar ; icônes Toolbar principale
     #folder_ouvrir
     #Enregistrer
     #Convertir
     #supprimer
     #Favoris
     #Tools
     #Aide
     #Apropos
     #Quit
     #Separateur_ToolBar
     #Derniere_Icone_ToolBar = #Quit
EndEnumeration


Enumeration 1 ; Popupmenu
     #PopupImageMenu_ToolBar_Bouton_Enregistrer
EndEnumeration




;- variables
;// la ToolBar
Global h_Main_ToolBar.l
Global Old_Window_Proc.i
Global L_OriginProc.i
;// La fenêter principale
Global hMainWindow.l
;// L'imageList des boutons
Global ImageList_Toolbar.l
;// L'adresse de la procedure standart de gestion des événements de la fenêtre
Global Old_Window_Proc.i

;// la rebar qui recevra la ToolBar
Global h_horizontal_Rebar


Procedure CleanUp()
     ;// libère tous les éléments de la ToolBar et met les variables globales à 0
     
     ;// détruit la ListImage si existe
     If ImageList_Toolbar
          ImageList_Destroy_(ImageList_Toolbar)
          ImageList_Toolbar = 0
     EndIf
     
     ;//
     If h_Main_ToolBar
          ;// La fenêtre ToolBar existe
          
          ;// La callback ToolBar existe ?
          If L_OriginProc
               SetWindowLongPtr_(h_Main_ToolBar, #GWL_WNDPROC, L_OriginProc)
               L_OriginProc = 0
          EndIf
          
          ;// destruction de la fenêtre ToolBar
          DestroyWindow_(h_Main_ToolBar)
          h_Main_ToolBar = 0
     EndIf
     
     ;// destruction de la Rebar
     If h_horizontal_Rebar
          DestroyWindow_(h_horizontal_Rebar)
          h_horizontal_Rebar = 0
     EndIf
     
     If Old_Window_Proc
          If IsWindow(#MainWindow)
               SetWindowLongPtr_(WindowID(#MainWindow), #GWL_WNDPROC, Old_Window_Proc)
          EndIf
          Old_Window_Proc = 0
     EndIf
EndProcedure

Procedure.i MainToolBarCallBack(Window, Message, wParam, lParam)
     Protected ReturnValue = CallWindowProc_(Old_Window_Proc, Window, Message, wParam, lParam)
     
     Protected rc.RECT
     ; mémorise le nombre de fichiers lors de l'ouverture de la boite Openfilerequester
     Protected FileNumber.l
     ;// mémorise les coordonnées de la zone client de la fenêtre principale
     Protected rcClient.RECT
     ;// mémorise les données de la barre pour mise à jour
     Protected lprbbi.REBARBANDINFO
     
     
     Select Message
               
               ; Case #WM_THEMECHANGED
               
          Case #WM_COMMAND
               Select (wParam & $FFFF) ; l'identifiant statique du bouton
                         
                    Case #Bouton_folder_ouvrir
                         MessageRequester("Bouton", "Bouton Ouvrir enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Extraire
                         MessageRequester("Bouton", "Bouton Extraire enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Convertir
                         MessageRequester("Bouton", "Bouton Convertir enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_supprimer
                         MessageRequester("Bouton", "Bouton supprimer enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Favoris
                         MessageRequester("Bouton", "Bouton Favoris enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Tools
                         MessageRequester("Bouton", "Bouton Tools enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Aide
                         MessageRequester("Bouton", "Bouton Aide enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Apropos
                         MessageRequester("Bouton", "Bouton A propos de enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Quit
                         MessageRequester("Bouton", "Bouton Quitter enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
               EndSelect
               
               ; Case #WM_ACTIVATEAPP
               
          Case #WM_ACTIVATE
               Select wParam
                    Case #WA_ACTIVE, #WA_CLICKACTIVE
                         If IsWindow(#MainWindow)
                              BringWindowToTop_(WindowID(#MainWindow))
                         EndIf
               EndSelect
               
               
          Case #WM_NOTIFY
               Protected *notify.NMTOOLBAR
               Protected tb.TBBUTTON
               Protected Item.l
               
               *notify = lparam
               
               If *notify\hdr\code = #TBN_DROPDOWN
                    SendMessage_(*notify\hdr\hwndFrom, #TB_GETRECT, *notify\iItem, @rc)
                    MapWindowPoints_(*notify\hdr\hwndFrom, #HWND_DESKTOP, @rc, 2)
                    Item = SendMessage_(*notify\hdr\hwndFrom, #TB_GETHOTITEM, 0, 0)
                    If Item > -1
                         SendMessage_(*notify\hdr\hwndFrom, #TB_GETBUTTON, item, tb)
                         ;DisplayPopupMenu(tb\dwdata, *notify\hdr\hwndFrom, rc\left, rc\bottom)
                         ProcedureReturn 0
                    EndIf
               EndIf
               
     EndSelect
     
     ProcedureReturn ReturnValue
EndProcedure

Procedure AddImageToImageList(ImageList.l, StaticIcon.l, Position.l = -1)
     
     ;// insère une icône dans l'ImageList de la Toolbar
     ;// les tailles des icônes sont définies lors de la création de la toolbar
     ;// La procedure ne retourne pas de valeur mais le programme se terminera si une icône n'a pu être insérée

     ;// mémorise l'erreur de l'API
     Protected Erreur
     ;// mémorise l'imageId de l'image courante
     Protected Image
     
     
     If IsImage(StaticIcon)
          Image = ImageID(StaticIcon)
          
          ;// on ajoute les images à la liste d'image, transparence gérée par Windows
          Erreur = ImageList_Add_(ImageList, Image, 0)
          FreeImage(StaticIcon)
          If Erreur < 0
               CleanUp()
               MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
               End
          EndIf
          
          
     Else
          SetWindowLongPtr_(h_Main_ToolBar, #GWL_WNDPROC, L_OriginProc)
          CleanUp()
          End
     EndIf
EndProcedure

Procedure AddToolBarButton(ImageList.l, StaticIcon.l, State.l, Style.l, dwData, *String)
     ; La procedure ajoute le bouton à la toolbar avec les valeurs passées en paramètres
     Protected Item.TBBUTTON ; structure création des boutons de la toolbar
     
     
     Item\iBitmap = StaticIcon ; index 1ere image de la liste
     If StaticIcon = #Separateur_ToolBar
          Item\idCommand = -1
     Else
          Item\idCommand = StaticIcon + #Id_ToolBar_Boutons
     EndIf
     Item\fsState = State
     Item\fsStyle = Style
     Item\dwData = dwData
     Item\iString = *String
     If SendMessage_(ImageList, #TB_INSERTBUTTON, Item\idCommand, @Item) = #False
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
EndProcedure

Procedure CreateMainToolBarButtons()
     ;// chargement des toutes les icônes de la barre d'outils 48x48 RVB/A
     
     ;// compteur de boucle
     Protected i.l
     ;// mémorise la chaine de la resource
     Protected Texte$
     
     
     UsePNGImageDecoder()
     CatchImage(#folder_ouvrir, ?folder_ouvrir)
     CatchImage(#Enregistrer, ?Enregistrer)
     CatchImage(#Convertir, ?Convertir)
     CatchImage(#supprimer, ?supprimer)
     CatchImage(#Favoris, ?Favoris)
     CatchImage(#Tools, ?Tools)
     CatchImage(#Aide, ?Aide)
     CatchImage(#Apropos, ?Apropos)
     CatchImage(#Quit, ?Quit)
     
     For i = #Premiere_Icone_ToolBar To #Derniere_Icone_ToolBar
          If IsImage(i) = 0
               CleanUp()
               MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
               End
          EndIf
     Next
     
     ; on ajoute les icônes à la liste d'image et dans l'ordre d'apparition
     AddImageToImageList(ImageList_Toolbar, #folder_ouvrir)
     AddImageToImageList(ImageList_Toolbar, #Enregistrer)
     AddImageToImageList(ImageList_Toolbar, #Convertir)
     AddImageToImageList(ImageList_Toolbar, #supprimer)
     AddImageToImageList(ImageList_Toolbar, #Favoris)
     AddImageToImageList(ImageList_Toolbar, #Tools)
     AddImageToImageList(ImageList_Toolbar, #Aide)
     AddImageToImageList(ImageList_Toolbar, #Apropos)
     AddImageToImageList(ImageList_Toolbar, #Quit)
     
     ;// on ajoute les boutons à la toolbar et dans l'ordre
     ;le bouton Ouvrir
     Texte$ = "Ouvrir"
     AddToolBarButton(h_Main_ToolBar, #folder_ouvrir, #TBSTATE_ENABLED, #BTNS_SHOWTEXT, 0, @Texte$)
     
     Texte$ = "Enregistrer"
     AddToolBarButton(h_Main_ToolBar, #Enregistrer, #TBSTATE_ENABLED, #BTNS_DROPDOWN | #BTNS_SHOWTEXT, #PopupImageMenu_ToolBar_Bouton_Enregistrer, @Texte$)
     
     ;// le bouton convertir
     Texte$ = "Convertir"
     AddToolBarButton(h_Main_ToolBar, #Convertir, #TBSTATE_INDETERMINATE, #BTNS_DROPDOWN | #BTNS_SHOWTEXT, 0, @Texte$)
     
     ;// le bouton supprimer
     Texte$ = "Supprimer"
     AddToolBarButton(h_Main_ToolBar, #supprimer, #TBSTATE_ENABLED, #BTNS_SHOWTEXT, 0, @Texte$)
     
     ;le bouton 1ere barre de séparation
     AddToolBarButton(h_Main_ToolBar, #Separateur_ToolBar, #TBSTATE_ENABLED, #BTNS_SEP, 0, 0)
     
     ;// le bouton faoris
     Texte$ = "Favoris"
     AddToolBarButton(h_Main_ToolBar, #Favoris, #TBSTATE_INDETERMINATE, 0, 0, @Texte$)
     
     ;// le bouton préférences
     Texte$ = "Préférences"
     AddToolBarButton(h_Main_ToolBar, #Tools, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
     ;//  le bouton d'aide
     Texte$ = "Aide"
     AddToolBarButton(h_Main_ToolBar, #Aide, #TBSTATE_INDETERMINATE, 0, 0, @Texte$)
     
     ;// le bouton barre de séparation
     AddToolBarButton(h_Main_ToolBar, #Separateur_ToolBar, #TBSTATE_ENABLED, #BTNS_SEP, 0, 0)
     
     ; le bouton A propos de
     Texte$ = "A propos de"
     AddToolBarButton(h_Main_ToolBar, #Apropos, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
     ; le bouton quitter
     Texte$ = "Quitter"
     AddToolBarButton(h_Main_ToolBar, #Quit, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
EndProcedure

Procedure CreateMainToolBar()
     ;// mémorise l'adresse d'origine de la calback toolbar
     Protected L_OriginProc
     ;// mémorise le style de la toolbar
     Protected style
     ;// Utiliser pour initialiser les controls
     Protected icex.INITCOMMONCONTROLSEX
     ;// mémorise l'instance
     Protected hInstance.l
     ;// structure définissant les éléments de la ReBar
     Protected rbi.REBARINFO
     ;// mémorise la taille des boutons
     Protected dwBtnSize
     ;// structure définissant les éléments de chaque band ajoutés à la ReBar
     Protected rbBand.REBARBANDINFO
     
     
     hInstance = GetModuleHandle_(0)
     If hInstance = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     h_Main_ToolBar = CreateWindow_("ToolbarWindow32", 0, #Flag, 0, 0, 0, 0, hMainWindow, 0, 0, 0)
     If h_Main_ToolBar = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     ;// envoi du message obligatoire #TB_BUTTONSTRUCTSIZE après création de la barre avec CreateWindowEx_ mais avant l'ajout de boutons etc
     ;// Ce message n'a pas de valeur de retour
     SendMessage_(h_Main_ToolBar, #TB_BUTTONSTRUCTSIZE, SizeOf(TBBUTTON), 0)
     
     ;// retrouve le style avant de le modifier
     style = SendMessage_(h_Main_ToolBar, #TB_GETEXTENDEDSTYLE, 0, 0)
     ; ajout des styles #TBSTYLE_EX_MIXEDBUTTONS,#TBSTYLE_EX_DRAWDDARROWS et #TBSTYLE_EX_HIDECLIPPEDBUTTONS
     SendMessage_(h_Main_ToolBar, #TB_SETEXTENDEDSTYLE, 0, style | #TBSTYLE_EX_MIXEDBUTTONS | #TBSTYLE_EX_DRAWDDARROWS | #TBSTYLE_EX_HIDECLIPPEDBUTTONS)
     
     ;- ImageList Toolbar
     ;// création de l'ImageList associée à la barre d'outils
     ImageList_Toolbar = ImageList_Create_(#Hauteur_Icone_Toolbar, #Largeur_Icone_Toolbar, #ILC_MASK | #ILC_COLOR32, 8, 12)
     If ImageList_Toolbar = #Null
          ;// L'API a échouée, on libère les ressource avnt de quitter
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     ;// associe l'ImageList à la barre d'outils
     SendMessage_(h_Main_ToolBar, #TB_SETIMAGELIST, 0, ImageList_Toolbar)
     
     ;// Réglage de la taille des boutons, du style et de la position de la barre
     SendMessage_(h_Main_ToolBar, #TB_SETBUTTONSIZE, 0, #Largeur_Icone_Toolbar + (#Hauteur_Icone_Toolbar<<16))
     
     SendMessage_(h_Main_ToolBar, #TB_SETSTYLE, 0, #IE_style|#CCS_NOMOVEY); | #CCS_NORESIZE)
     
     
     SendMessage_(h_Main_ToolBar, #TB_AUTOSIZE, 0, 0)
     
     ;// retrouve le style avant de le changer, permet afficher les barres de séparation
     style = GetWindowLong_(h_Main_ToolBar, #GWL_STYLE)
     SetWindowLongPtr_(h_Main_ToolBar, #GWL_STYLE, style | #CCS_NODIVIDER)
     
     ;// fige la taille de l'indentation
     SendMessage_(h_Main_ToolBar, #TB_SETINDENT, 2, 0)
     
     ;// subclass la toolbar (fenêtre principale pour les événements comme WM_COMMAND etc)
     Old_Window_Proc = SetWindowLongPtr_(hMainWindow, #GWL_WNDPROC, @MainToolBarCallBack())
     
     If Old_Window_Proc = #Null
          ;// L'API a échouée, on libère les ressource avnt de quitter
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la Rebar", 16)
          End
     EndIf
     
     ; création des boutons de la Toolbar
     CreateMainToolBarButtons()
     
     ;// ajout de la Rebar qu recevra la ToolBar
     ;// initialise les controls
     icex\dwSize = SizeOf(INITCOMMONCONTROLSEX)
     icex\dwICC  = #ICC_COOL_CLASSES | #ICC_BAR_CLASSES
     InitCommonControlsEx_(@icex)
     
     ;// création de la ReBar
     h_horizontal_Rebar = CreateWindowEx_(#WS_EX_TOOLWINDOW, "ReBarWindow32", #Null, #WS_CHILD | #RBS_BANDBORDERS | #WS_VISIBLE | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN | #RBS_VARHEIGHT | #CCS_NODIVIDER, 0, 0, 0, 0, hMainWindow, #Null, hInstance, #Null)
     ; h_horizontal_Rebar = CreateWindowEx_(#WS_EX_TOOLWINDOW, "ReBarWindow32", #Null, #WS_CHILD | #RBS_BANDBORDERS | #WS_VISIBLE | #WS_CLIPSIBLINGS | #RBS_VARHEIGHT | #CCS_NODIVIDER, 0, 0, 0, 0, hwndOwner, #Null, hInstance, #Null)
     If h_horizontal_Rebar = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la Rebar", 16)
          End
     EndIf
     
     ;// défini les infos de la ReBar
     rbi\cbSize = SizeOf(REBARINFO)
     rbi\fMask  = 0
     rbi\himl = #Null
     SendMessage_(h_horizontal_Rebar, #RB_SETBARINFO, 0, @rbi)
     
     ;/ Retrouve la hauteur des boutons de la ToolBar
     dwBtnSize = SendMessage_(h_Main_ToolBar, #TB_GETBUTTONSIZE, 0,0)
     
     ;/ Initialises les valeurs de la band avec la ToolBar
     rbBand\cbSize = SizeOf(REBARBANDINFO)
     rbBand\fMask  =  #RBBIM_TEXT | #RBBIM_STYLE | #RBBIM_CHILD  | #RBBIM_CHILDSIZE | #RBBIM_SIZE
     rbBand\lpText = 0                        ; texte à afficherpour la Toolbar
     rbBand\hwndChild = h_Main_ToolBar        ; handle de la ToolBar
     rbBand\cxMinChild = 100                  ; largeur mini de la bande Rebar
     rbBand\cyMinChild = dwBtnSize >> 16      ; hauteur mini de la bande Rebar pour les boutons
     rbBand\cx = WindowWidth(#MainWindow)
     rbBand\fStyle = #RBBS_CHILDEDGE | #RBBS_NOVERT | #RBBS_NOGRIPPER | #RBBS_USECHEVRON
     ;/ Ajoute la band qui a la toolbar
     If SendMessage_(h_horizontal_Rebar, #RB_INSERTBAND, -1, @rbBand) = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la Rebar", 16)
     EndIf
     
EndProcedure


;- Fenêtre principale
hMainWindow = OpenWindow(#MainWindow, 0, 0, 980, 650, "Essai TolBar32", #Option_Fenetre) ;|#PB_Window_SizeGadget)
If hMainWindow = 0
     MessageRequester("Erreur", "Impossible de créer la fenêtre principale", 16)
     End
EndIf

;// limite de la fenêtre
WindowBounds(#MainWindow, 980, 650, #PB_Ignore , #PB_Ignore)

;// création de la ToolBar
CreateMainToolBar()

If ListIconGadget(#Listicon, 10, 100, WindowWidth(#mainwindow)-20, 150, "ListIcon", WindowWidth(#mainwindow)-20)
     
EndIf

;// affiche la fenêtre
HideWindow(#MainWindow, 0)


;- Boucle
Repeat
     
     Select WaitWindowEvent()
               
          Case #PB_Event_CloseWindow
               CleanUp()
               Break
     EndSelect
     
ForEver
End


DataSection
     IncludePath "E:\PureBasic\Projets\Editeur d icones\PureIconManager\PIM_1_0\Icone_barre_outils"
     
     ;// les image PNG
     folder_ouvrir :
     IncludeBinary "Folder ouvrir.png"
     
     Enregistrer :
     IncludeBinary "Enregistrer_sous.png"
     
     Convertir :
     IncludeBinary "Convertir.png"
     
     supprimer :
     IncludeBinary "supprimer_32_32.png"
     
     Favoris :
     IncludeBinary "Favoris.png"
     
     Tools :
     IncludeBinary "Tools.png"
     
     Aide :
     IncludeBinary "Aide.png"
     
     Apropos :
     IncludeBinary "logo_PB.png"
     
     Quit :
     IncludeBinary "exit_32x32.png"
EndDataSection

Re: Une ToolBar "améliorée"

Publié : sam. 19/déc./2009 15:17
par Ar-S
Je n'ai pas le temps de tester ça en ce moment mais je le ferai.
Merci pour ton partage :D

Re: Une ToolBar "améliorée"

Publié : sam. 19/déc./2009 17:12
par venom
Merci Denis,
j'ai compiler sa en jet pas mal je vais voir pour me faire un soft avec histoire de bien voir le rendu.






@++

Re: Une ToolBar "améliorée"

Publié : sam. 19/déc./2009 18:12
par Kwai chang caine
Merci beaucoup denis de ton partage 8)

Pour pas changer les bonnes habitudes, j'suis le seul que ça marche pas Ligne 267 :D

Code : Tout sélectionner

Protected Var.ItemParams
Voila...si t'as besoin d'autres emmerdes...surtout n'hesite pas à m'appeller :mrgreen:

Re: Une ToolBar "améliorée"

Publié : sam. 19/déc./2009 18:13
par Le Soldat Inconnu
Super :)

Juste 2 petites questions

Code : Tout sélectionner

Protected Var.ItemParams
Ne compile pas chez moi, j'ai mis en commentaire (Structure inconnu)

Ensuite, sur le bouton enregistrer, il y a une petite flèche sur le coté du bouton, comment fais tu pour l'utiliser. Merci

Re: Une ToolBar "améliorée"

Publié : sam. 19/déc./2009 18:19
par Anonyme2
Kwai chang caine a écrit :Merci beaucoup denis de ton partage 8)

Pour pas changer les bonnes habitudes, j'suis le seul que ça marche pas Ligne 267 :D

Code : Tout sélectionner

Protected Var.ItemParams
Voila...si t'as besoin d'autres emmerdes...surtout n'hesite pas à m'appeller :mrgreen:
C'est une variable que j'utlise pour ma librairie des lmenus en couleur, donc pas utilisée dans l'exemple posté, supprimes la ligne.

J'ai corrigé les 2 codes

Re: Une ToolBar "améliorée"

Publié : sam. 19/déc./2009 18:23
par Anonyme2
Le Soldat Inconnu a écrit :Super :)

Ensuite, sur le bouton enregistrer, il y a une petite flèche sur le coté du bouton, comment fais tu pour l'utiliser. Merci
Il faut lui associer un popupmenu, je fais un exempel rapide et je poste, mais c'est déjà prêt dans la callback pour afficher le popupmenu.


Voilà le code avec un popupmenu associer à la flèche du bouton Enregistrer. On peut mettre un popupmenucolor.

On associe le popup au bouton Enregistrer, #PopupImageMenu_ToolBar_Bouton_Enregistrer est l'identifiant du popupmenu

Code : Tout sélectionner

     AddToolBarButton(h_Main_ToolBar, #Enregistrer, #TBSTATE_ENABLED, #BTNS_DROPDOWN | #BTNS_SHOWTEXT, #PopupImageMenu_ToolBar_Bouton_Enregistrer, @Texte$)

L'affichage du Popupmenu se fait dans la callback de la ToolBar, MainToolBarCallBack(), sur l'événement #WM_NOTIFY.
Comme le bouton a le style DROPDOWN, le code de l'événement #WM_NOTIFY est #TBN_DROPDOWN, ensuite je place le menu sous le bouton.

Il faudrait regarder les API, lorsque l'on veut avoir plusieurs boutons avec des popupmenu pour retrouver le bon bouton correspondant au bon menu, je l'avais fait au début mais maintenant je ne l'utilise plus.

Code : Tout sélectionner

               Protected *notify.NMTOOLBAR
               Protected tb.TBBUTTON
               Protected Item.l
               
               *notify = lparam
               
               If *notify\hdr\code = #TBN_DROPDOWN
                    SendMessage_(*notify\hdr\hwndFrom, #TB_GETRECT, *notify\iItem, @rc)
                    MapWindowPoints_(*notify\hdr\hwndFrom, #HWND_DESKTOP, @rc, 2)
                    Item = SendMessage_(*notify\hdr\hwndFrom, #TB_GETHOTITEM, 0, 0)
                    If Item > -1
                         SendMessage_(*notify\hdr\hwndFrom, #TB_GETBUTTON, item, tb)
                            DisplayPopupMenu(tb\dwdata, *notify\hdr\hwndFrom, rc\left, rc\bottom)
                         ProcedureReturn 0
                    EndIf
               EndIf

Code : Tout sélectionner

EnableExplicit

;// constante de la ToolBar
#Flag = #TBSTYLE_LIST | #TBSTYLE_ALTDRAG | #TBSTYLE_FLAT | #TBSTYLE_TOOLTIPS | #TBSTYLE_TRANSPARENT | #TBSTYLE_WRAPABLE | #CCS_TOP | #WS_CHILD | #WS_OVERLAPPED | #WS_VISIBLE
#IE1_style = #RBS_BANDBORDERS | #RBS_DBLCLKTOGGLE | #RBS_REGISTERDROP | #RBS_VARHEIGHT | #CCS_NODIVIDER | #CCS_NOPARENTALIGN
#IE_style = #IE1_style | #WS_CLIPSIBLINGS | #WS_VISIBLE | #WS_BORDER | #WS_CHILD | #WS_CLIPCHILDREN
;- constante de dimension des icônes de la barre d'outils
#Hauteur_Icone_Toolbar = 32
#Largeur_Icone_Toolbar = #Hauteur_Icone_Toolbar

;// Options de la fenêtre
#Option_Fenetre = #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered

#TB_GETBUTTONSIZE = #WM_USER + 58
#TBSTYLE_EX_MIXEDBUTTONS = $00000008
#BTNS_SHOWTEXT = $40
#BTNS_AUTOSIZE = #TBSTYLE_AUTOSIZE
#TB_SETLISTGAP = #WM_USER + 96
#TBN_DROPDOWN = -710
#TB_GETRECT = $400 + 51

#TBSTYLE_DROPDOWN = $8
#TBSTYLE_EX_DRAWDDARROWS = $1
#TB_SETEXTENDEDSTYLE = $400 + 84
#TB_GETEXTENDEDSTYLE = $400 + 85
#TBSTYLE_EX_HIDECLIPPEDBUTTONS = $00000010
#BTNS_DROPDOWN = #TBSTYLE_DROPDOWN
#RBBS_USECHEVRON = $00000200
#RBN_CHEVRONPUSHED = (#RBN_FIRST-10)
#RBBS_HIDETITLE = $00000400
#RB_SETBANDWIDTH = #WM_USER + 44

;// fenêtres
Enumeration 0
     #MainWindow
EndEnumeration

;// gadgets
Enumeration 0
     #Listicon
EndEnumeration

#Id_ToolBar_Boutons = 500
Enumeration #Id_ToolBar_Boutons ; boutons Toolbar principale
     #Bouton_folder_ouvrir
     #Bouton_Extraire
     #Bouton_Convertir
     #Bouton_supprimer
     #Bouton_Favoris
     #Bouton_Tools
     #Bouton_Aide
     #Bouton_Apropos
     #Bouton_Quit
     #Bouton_Separation_1 ; n'existe pas
EndEnumeration

#Premiere_Icone_ToolBar = 0
Enumeration #Premiere_Icone_ToolBar ; icônes Toolbar principale
     #folder_ouvrir
     #Enregistrer
     #Convertir
     #supprimer
     #Favoris
     #Tools
     #Aide
     #Apropos
     #Quit
     #Separateur_ToolBar
     #Derniere_Icone_ToolBar = #Quit
EndEnumeration


Enumeration 0 ; Popupmenu
     #PopupImageMenu_ToolBar_Bouton_Enregistrer
EndEnumeration




;- variables
;// la ToolBar
Global h_Main_ToolBar.l
Global Old_Window_Proc.i
Global L_OriginProc.i
;// La fenêter principale
Global hMainWindow.l
;// L'imageList des boutons
Global ImageList_Toolbar.l
;// L'adresse de la procedure standart de gestion des événements de la fenêtre
Global Old_Window_Proc.i

;// la rebar qui recevra la ToolBar
Global h_horizontal_Rebar


Procedure CleanUp()
     ;// libère tous les éléments de la ToolBar et met les variables globales à 0
     
     ;// détruit la ListImage si existe
     If ImageList_Toolbar
          ImageList_Destroy_(ImageList_Toolbar)
          ImageList_Toolbar = 0
     EndIf
     
     ;//
     If h_Main_ToolBar
          ;// La fenêtre ToolBar existe
          
          ;// La callback ToolBar existe ?
          If L_OriginProc
               SetWindowLongPtr_(h_Main_ToolBar, #GWL_WNDPROC, L_OriginProc)
               L_OriginProc = 0
          EndIf
          
          ;// destruction de la fenêtre ToolBar
          DestroyWindow_(h_Main_ToolBar)
          h_Main_ToolBar = 0
     EndIf
     
     ;// destruction de la Rebar
     If h_horizontal_Rebar
          DestroyWindow_(h_horizontal_Rebar)
          h_horizontal_Rebar = 0
     EndIf
     
     If Old_Window_Proc
          If IsWindow(#MainWindow)
               SetWindowLongPtr_(WindowID(#MainWindow), #GWL_WNDPROC, Old_Window_Proc)
          EndIf
          Old_Window_Proc = 0
     EndIf
EndProcedure

Procedure.i MainToolBarCallBack(Window, Message, wParam, lParam)
     Protected ReturnValue = CallWindowProc_(Old_Window_Proc, Window, Message, wParam, lParam)
     
     Protected rc.RECT
     ; mémorise le nombre de fichiers lors de l'ouverture de la boite Openfilerequester
     Protected FileNumber.l
     ;// mémorise les coordonnées de la zone client de la fenêtre principale
     Protected rcClient.RECT
     ;// mémorise les données de la barre pour mise à jour
     Protected lprbbi.REBARBANDINFO
     
     
     Select Message
               
               ; Case #WM_THEMECHANGED
               
          Case #WM_COMMAND
               Select (wParam & $FFFF) ; l'identifiant statique du bouton
                         
                    Case #Bouton_folder_ouvrir
                         MessageRequester("Bouton", "Bouton Ouvrir enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Extraire
                         MessageRequester("Bouton", "Bouton Extraire enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Convertir
                         MessageRequester("Bouton", "Bouton Convertir enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_supprimer
                         MessageRequester("Bouton", "Bouton supprimer enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Favoris
                         MessageRequester("Bouton", "Bouton Favoris enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Tools
                         MessageRequester("Bouton", "Bouton Tools enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Aide
                         MessageRequester("Bouton", "Bouton Aide enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Apropos
                         MessageRequester("Bouton", "Bouton A propos de enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
                    Case #Bouton_Quit
                         MessageRequester("Bouton", "Bouton Quitter enfoncé", #PB_MessageRequester_Ok)
                         ProcedureReturn 0
                         
               EndSelect
               
               ; Case #WM_ACTIVATEAPP
               
          Case #WM_ACTIVATE
               Select wParam
                    Case #WA_ACTIVE, #WA_CLICKACTIVE
                         If IsWindow(#MainWindow)
                              BringWindowToTop_(WindowID(#MainWindow))
                         EndIf
               EndSelect
               
               
          Case #WM_NOTIFY
               Protected *notify.NMTOOLBAR
               Protected tb.TBBUTTON
               Protected Item.l
               
               *notify = lparam
               
               If *notify\hdr\code = #TBN_DROPDOWN
                    SendMessage_(*notify\hdr\hwndFrom, #TB_GETRECT, *notify\iItem, @rc)
                    MapWindowPoints_(*notify\hdr\hwndFrom, #HWND_DESKTOP, @rc, 2)
                    Item = SendMessage_(*notify\hdr\hwndFrom, #TB_GETHOTITEM, 0, 0)
                    If Item > -1
                         SendMessage_(*notify\hdr\hwndFrom, #TB_GETBUTTON, item, tb)
                            DisplayPopupMenu(tb\dwdata, *notify\hdr\hwndFrom, rc\left, rc\bottom)
                         ProcedureReturn 0
                    EndIf
               EndIf
               
     EndSelect
     
     ProcedureReturn ReturnValue
EndProcedure

Procedure AddImageToImageList(ImageList.l, StaticIcon.l, Position.l = -1)
     
     ;// insère une icône dans l'ImageList de la Toolbar
     ;// les tailles des icônes sont définies lors de la création de la toolbar
     ;// La procedure ne retourne pas de valeur mais le programme se terminera si une icône n'a pu être insérée

     ;// mémorise l'erreur de l'API
     Protected Erreur
     ;// mémorise l'imageId de l'image courante
     Protected Image
     
     
     If IsImage(StaticIcon)
          Image = ImageID(StaticIcon)
          
          ;// on ajoute les images à la liste d'image, transparence gérée par Windows
          Erreur = ImageList_Add_(ImageList, Image, 0)
          FreeImage(StaticIcon)
          If Erreur < 0
               CleanUp()
               MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
               End
          EndIf
          
          
     Else
          SetWindowLongPtr_(h_Main_ToolBar, #GWL_WNDPROC, L_OriginProc)
          CleanUp()
          End
     EndIf
EndProcedure

Procedure AddToolBarButton(ImageList.l, StaticIcon.l, State.l, Style.l, dwData, *String)
     ; La procedure ajoute le bouton à la toolbar avec les valeurs passées en paramètres
     Protected Item.TBBUTTON ; structure création des boutons de la toolbar
     
     
     Item\iBitmap = StaticIcon ; index 1ere image de la liste
     If StaticIcon = #Separateur_ToolBar
          Item\idCommand = -1
     Else
          Item\idCommand = StaticIcon + #Id_ToolBar_Boutons
     EndIf
     Item\fsState = State
     Item\fsStyle = Style
     Item\dwData = dwData
     Item\iString = *String
     If SendMessage_(ImageList, #TB_INSERTBUTTON, Item\idCommand, @Item) = #False
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
EndProcedure

Procedure CreateMainToolBarButtons()
     ;// chargement des toutes les icônes de la barre d'outils 48x48 RVB/A
     
     ;// compteur de boucle
     Protected i.l
     ;// mémorise la chaine de la resource
     Protected Texte$
     ;// variable données des popup menus
     Protected Var.ItemParams
     
     
     UsePNGImageDecoder()
     CatchImage(#folder_ouvrir, ?folder_ouvrir)
     CatchImage(#Enregistrer, ?Enregistrer)
     CatchImage(#Convertir, ?Convertir)
     CatchImage(#supprimer, ?supprimer)
     CatchImage(#Favoris, ?Favoris)
     CatchImage(#Tools, ?Tools)
     CatchImage(#Aide, ?Aide)
     CatchImage(#Apropos, ?Apropos)
     CatchImage(#Quit, ?Quit)
     
     For i = #Premiere_Icone_ToolBar To #Derniere_Icone_ToolBar
          If IsImage(i) = 0
               CleanUp()
               MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
               End
          EndIf
     Next
     
     ; on ajoute les icônes à la liste d'image et dans l'ordre d'apparition
     AddImageToImageList(ImageList_Toolbar, #folder_ouvrir)
     AddImageToImageList(ImageList_Toolbar, #Enregistrer)
     AddImageToImageList(ImageList_Toolbar, #Convertir)
     AddImageToImageList(ImageList_Toolbar, #supprimer)
     AddImageToImageList(ImageList_Toolbar, #Favoris)
     AddImageToImageList(ImageList_Toolbar, #Tools)
     AddImageToImageList(ImageList_Toolbar, #Aide)
     AddImageToImageList(ImageList_Toolbar, #Apropos)
     AddImageToImageList(ImageList_Toolbar, #Quit)
     
     ;// on ajoute les boutons à la toolbar et dans l'ordre
     ;le bouton Ouvrir
     Texte$ = "Ouvrir"
     AddToolBarButton(h_Main_ToolBar, #folder_ouvrir, #TBSTATE_ENABLED, #BTNS_SHOWTEXT, 0, @Texte$)
     
     Texte$ = "Enregistrer"
     AddToolBarButton(h_Main_ToolBar, #Enregistrer, #TBSTATE_ENABLED, #BTNS_DROPDOWN | #BTNS_SHOWTEXT, #PopupImageMenu_ToolBar_Bouton_Enregistrer, @Texte$)
     
     ;// le bouton convertir
     Texte$ = "Convertir"
     AddToolBarButton(h_Main_ToolBar, #Convertir, #TBSTATE_INDETERMINATE, #BTNS_DROPDOWN | #BTNS_SHOWTEXT, 0, @Texte$)
     
     ;// le bouton supprimer
     Texte$ = "Supprimer"
     AddToolBarButton(h_Main_ToolBar, #supprimer, #TBSTATE_ENABLED, #BTNS_SHOWTEXT, 0, @Texte$)
     
     ;le bouton 1ere barre de séparation
     AddToolBarButton(h_Main_ToolBar, #Separateur_ToolBar, #TBSTATE_ENABLED, #BTNS_SEP, 0, 0)
     
     ;// le bouton faoris
     Texte$ = "Favoris"
     AddToolBarButton(h_Main_ToolBar, #Favoris, #TBSTATE_INDETERMINATE, 0, 0, @Texte$)
     
     ;// le bouton préférences
     Texte$ = "Préférences"
     AddToolBarButton(h_Main_ToolBar, #Tools, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
     ;//  le bouton d'aide
     Texte$ = "Aide"
     AddToolBarButton(h_Main_ToolBar, #Aide, #TBSTATE_INDETERMINATE, 0, 0, @Texte$)
     
     ;// le bouton barre de séparation
     AddToolBarButton(h_Main_ToolBar, #Separateur_ToolBar, #TBSTATE_ENABLED, #BTNS_SEP, 0, 0)
     
     ; le bouton A propos de
     Texte$ = "A propos de"
     AddToolBarButton(h_Main_ToolBar, #Apropos, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
     ; le bouton quitter
     Texte$ = "Quitter"
     AddToolBarButton(h_Main_ToolBar, #Quit, #TBSTATE_ENABLED, 0, 0, @Texte$)
     
EndProcedure

Procedure CreateMainToolBar()
     ;// mémorise l'adresse d'origine de la calback toolbar
     Protected L_OriginProc
     ;// mémorise le style de la toolbar
     Protected style
     ;// Utiliser pour initialiser les controls
     Protected icex.INITCOMMONCONTROLSEX
     ;// mémorise l'instance
     Protected hInstance.l
     ;// structure définissant les éléments de la ReBar
     Protected rbi.REBARINFO
     ;// mémorise la taille des boutons
     Protected dwBtnSize
     ;// structure définissant les éléments de chaque band ajoutés à la ReBar
     Protected rbBand.REBARBANDINFO
     
     
     hInstance = GetModuleHandle_(0)
     If hInstance = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     h_Main_ToolBar = CreateWindow_("ToolbarWindow32", 0, #Flag, 0, 0, 0, 0, hMainWindow, 0, 0, 0)
     If h_Main_ToolBar = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     ;// envoi du message obligatoire #TB_BUTTONSTRUCTSIZE après création de la barre avec CreateWindowEx_ mais avant l'ajout de boutons etc
     ;// Ce message n'a pas de valeur de retour
     SendMessage_(h_Main_ToolBar, #TB_BUTTONSTRUCTSIZE, SizeOf(TBBUTTON), 0)
     
     ;// retrouve le style avant de le modifier
     style = SendMessage_(h_Main_ToolBar, #TB_GETEXTENDEDSTYLE, 0, 0)
     ; ajout des styles #TBSTYLE_EX_MIXEDBUTTONS,#TBSTYLE_EX_DRAWDDARROWS et #TBSTYLE_EX_HIDECLIPPEDBUTTONS
     SendMessage_(h_Main_ToolBar, #TB_SETEXTENDEDSTYLE, 0, style | #TBSTYLE_EX_MIXEDBUTTONS | #TBSTYLE_EX_DRAWDDARROWS | #TBSTYLE_EX_HIDECLIPPEDBUTTONS)
     
     ;- ImageList Toolbar
     ;// création de l'ImageList associée à la barre d'outils
     ImageList_Toolbar = ImageList_Create_(#Hauteur_Icone_Toolbar, #Largeur_Icone_Toolbar, #ILC_MASK | #ILC_COLOR32, 8, 12)
     If ImageList_Toolbar = #Null
          ;// L'API a échouée, on libère les ressource avnt de quitter
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la ToolBar", 16)
          End
     EndIf
     
     ;// associe l'ImageList à la barre d'outils
     SendMessage_(h_Main_ToolBar, #TB_SETIMAGELIST, 0, ImageList_Toolbar)
     
     ;// Réglage de la taille des boutons, du style et de la position de la barre
     SendMessage_(h_Main_ToolBar, #TB_SETBUTTONSIZE, 0, #Largeur_Icone_Toolbar + (#Hauteur_Icone_Toolbar<<16))
     
     SendMessage_(h_Main_ToolBar, #TB_SETSTYLE, 0, #IE_style|#CCS_NOMOVEY); | #CCS_NORESIZE)
     
     
     SendMessage_(h_Main_ToolBar, #TB_AUTOSIZE, 0, 0)
     
     ;// retrouve le style avant de le changer, permet afficher les barres de séparation
     style = GetWindowLong_(h_Main_ToolBar, #GWL_STYLE)
     SetWindowLongPtr_(h_Main_ToolBar, #GWL_STYLE, style | #CCS_NODIVIDER)
     
     ;// fige la taille de l'indentation
     SendMessage_(h_Main_ToolBar, #TB_SETINDENT, 2, 0)
     
     ;// subclass la toolbar (fenêtre principale pour les événements comme WM_COMMAND etc)
     Old_Window_Proc = SetWindowLongPtr_(hMainWindow, #GWL_WNDPROC, @MainToolBarCallBack())
     
     If Old_Window_Proc = #Null
          ;// L'API a échouée, on libère les ressource avnt de quitter
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la Rebar", 16)
          End
     EndIf
     
     ; création des boutons de la Toolbar
     CreateMainToolBarButtons()
     
     ;// ajout de la Rebar qu recevra la ToolBar
     ;// initialise les controls
     icex\dwSize = SizeOf(INITCOMMONCONTROLSEX)
     icex\dwICC  = #ICC_COOL_CLASSES | #ICC_BAR_CLASSES
     InitCommonControlsEx_(@icex)
     
     ;// création de la ReBar
     h_horizontal_Rebar = CreateWindowEx_(#WS_EX_TOOLWINDOW, "ReBarWindow32", #Null, #WS_CHILD | #RBS_BANDBORDERS | #WS_VISIBLE | #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN | #RBS_VARHEIGHT | #CCS_NODIVIDER, 0, 0, 0, 0, hMainWindow, #Null, hInstance, #Null)
     ; h_horizontal_Rebar = CreateWindowEx_(#WS_EX_TOOLWINDOW, "ReBarWindow32", #Null, #WS_CHILD | #RBS_BANDBORDERS | #WS_VISIBLE | #WS_CLIPSIBLINGS | #RBS_VARHEIGHT | #CCS_NODIVIDER, 0, 0, 0, 0, hwndOwner, #Null, hInstance, #Null)
     If h_horizontal_Rebar = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la Rebar", 16)
          End
     EndIf
     
     ;// défini les infos de la ReBar
     rbi\cbSize = SizeOf(REBARINFO)
     rbi\fMask  = 0
     rbi\himl = #Null
     SendMessage_(h_horizontal_Rebar, #RB_SETBARINFO, 0, @rbi)
     
     ;/ Retrouve la hauteur des boutons de la ToolBar
     dwBtnSize = SendMessage_(h_Main_ToolBar, #TB_GETBUTTONSIZE, 0,0)
     
     ;/ Initialises les valeurs de la band avec la ToolBar
     rbBand\cbSize = SizeOf(REBARBANDINFO)
     rbBand\fMask  =  #RBBIM_TEXT | #RBBIM_STYLE | #RBBIM_CHILD  | #RBBIM_CHILDSIZE | #RBBIM_SIZE
     rbBand\lpText = 0                        ; texte à afficherpour la Toolbar
     rbBand\hwndChild = h_Main_ToolBar        ; handle de la ToolBar
     rbBand\cxMinChild = 100                  ; largeur mini de la bande Rebar
     rbBand\cyMinChild = dwBtnSize >> 16      ; hauteur mini de la bande Rebar pour les boutons
     rbBand\cx = WindowWidth(#MainWindow)
     rbBand\fStyle = #RBBS_CHILDEDGE | #RBBS_NOVERT | #RBBS_NOGRIPPER | #RBBS_USECHEVRON
     ;/ Ajoute la band qui a la toolbar
     If SendMessage_(h_horizontal_Rebar, #RB_INSERTBAND, -1, @rbBand) = 0
          CleanUp()
          MessageRequester("Erreur", "Impossible de créer la Rebar", 16)
     EndIf
     
EndProcedure


;- Fenêtre principale
hMainWindow = OpenWindow(#MainWindow, 0, 0, 980, 650, "Essai TolBar32", #Option_Fenetre) ;|#PB_Window_SizeGadget)
If hMainWindow = 0
     MessageRequester("Erreur", "Impossible de créer la fenêtre principale", 16)
     End
EndIf

;// limite de la fenêtre
WindowBounds(#MainWindow, 980, 650, #PB_Ignore , #PB_Ignore)


;//création d'un popupmenu
    If CreatePopupMenu(#PopupImageMenu_ToolBar_Bouton_Enregistrer)        ; La création du menu contextuel commence...
      MenuTitle("Projet")        ; Vous pouvez utiliser toutes les commandes relatives au menu,
        MenuItem(1, "Ouvrir")    ; comme si c'était un menu normal...
        MenuItem(2, "Enregistrer")
        MenuItem(3, "Enregistrer sous")
        MenuItem(4, "Quitter")
        MenuBar()
        OpenSubMenu("Fic&hiers récents")
          MenuItem(5, "PureBasic.exe")
          MenuItem(6, "Test.txt")
        CloseSubMenu()
      MenuTitle("Editer")
      MenuTitle("Options")
    EndIf


;// création de la ToolBar
CreateMainToolBar()

If ListIconGadget(#Listicon, 10, 100, WindowWidth(#mainwindow)-20, 150, "ListIcon", WindowWidth(#mainwindow)-20)
     
EndIf

;// affiche la fenêtre
HideWindow(#MainWindow, 0)


;- Boucle
Repeat
     
     Select WaitWindowEvent()
               
          Case #PB_Event_CloseWindow
               CleanUp()
               Break
     EndSelect
     
ForEver
End


DataSection
     IncludePath "E:\PureBasic\Projets\Editeur d icones\PureIconManager\PIM_1_0\Icone_barre_outils"
     
     ;// les image PNG
     folder_ouvrir :
     IncludeBinary "Folder ouvrir.png"
     
     Enregistrer :
     IncludeBinary "Enregistrer_sous.png"
     
     Convertir :
     IncludeBinary "Convertir.png"
     
     supprimer :
     IncludeBinary "supprimer_32_32.png"
     
     Favoris :
     IncludeBinary "Favoris.png"
     
     Tools :
     IncludeBinary "Tools.png"
     
     Aide :
     IncludeBinary "Aide.png"
     
     Apropos :
     IncludeBinary "logo_PB.png"
     
     Quit :
     IncludeBinary "exit_32x32.png"
EndDataSection

Re: Une ToolBar "améliorée"

Publié : dim. 20/déc./2009 11:12
par Anonyme2
Les messages sur la toolbar de MS

(lien corrigé le 30/04/2011)
http://msdn.microsoft.com/en-us/library ... 85%29.aspx