Une ToolBar "améliorée"
Publié : sam. 19/déc./2009 14:55
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
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
et le second avec Rebar
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

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