J'ai completer la signature

sur le (Les) Forum(s) tu trouvera, des codes pour les 3 plateformes (Linux,OsX,Windows)doudouvs a écrit :Oui c'est ballot d'afficher des API limiter à Windows alors que le programme doit être multi plateforme
Code : Tout sélectionner
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
;; ici le code pour Linux
CompilerElse
; ici pour Windows ( j'ai pas prévu Mac :lol: )
Structure MySHFILEINFO
hIcon.l
iIcon.l
dwAttributes.l
szDisplayName.b[#MAX_PATH]
szTypeName.b[80]
EndStructure
CompilerEndIf
Code : Tout sélectionner
Define .i
EnableExplicit
Global NewList MultiPathPathRequesterAdvancedFolderList.s()
#Fenetre = 0
#ExplorerMultiPathRequester = 0
#SplitterGadget = 2
#Bouton_invisible = 3
Procedure.i GetDrive(List MultiDrivePathRequester.s())
;// http://www.purebasic.fr/french/viewtopic.php?f=4&t=12902&hilit=lecteurs
;// Auteur : Le Soldat Inconnu
;// Version de PB : 4.6
;// Explication du programme :
;// Récupérer la lettre et le type (disquette, disque dur, etc...) de tous les lecteurs présents sur l'ordinateur.
;// Modifié par Denis, retourne uniquement les lettres des lecteurs présents
;// PB 5.11 X86 et x64
;// retourne le nombre de lecteurs listés, sinon retourne -1 en cas d'erreur
;// la liste chainée contient la liste des lecteurs format 'C:\' par exemple
Protected DriveString_Length, DriveString.s, CharSize
Protected i, j
;// Vide la liste
ClearList(MultiDrivePathRequester())
;// Taille des caractères en byte
CharSize = StringByteLength(" ")
;// Récupère la liste des lecteurs
DriveString_Length = GetLogicalDriveStrings_(0, 0)
If DriveString_Length = 0
ProcedureReturn -1
EndIf
DriveString = Space(DriveString_Length)
DriveString_Length * CharSize
If GetLogicalDriveStrings_(DriveString_Length, @DriveString) = 0
ProcedureReturn -1
EndIf
DriveString_Length -1
j= -1
For i = 0 To DriveString_Length Step SizeOf(Character)
If PeekC(@DriveString + i) = 0
PokeC(@DriveString + i, ',')
j+1
EndIf
Next
For i = 1 To j
If AddElement(MultiDrivePathRequester()) = 0
ClearList(MultiDrivePathRequester())
ProcedureReturn -1
EndIf
MultiDrivePathRequester() = StringField(DriveString, i, Chr(','))
Next
ProcedureReturn ListSize(MultiDrivePathRequester())
EndProcedure
Procedure.i CustomTreeCallback(hwnd, Msg, WParam, LParam)
;// English forum: http://www.purebasic.fr/english/viewtopic.php?p=158360
;// Author: sverson
;// Date: 21. August 2006
;// OS: Windows
;// Demo: Yes
;// Use ExplorerListGadget Checkboxes to select directories
;// and display the result in a ListIconGadget
;// Thanks to srod, breeze4me AND freak!
;// See also remi_meier's "Simple Wrapper For TreeGadget-Macros by MSDN"
;// http://www.purebasic.fr/english/viewtopic.php?p=104420
;// Modifié par Denis
;// PB 5.11 X86 et x64
;// élément pour retrouver l'élément clicqué
Protected HitTest.TV_HITTESTINFO
;// adresse de la procedure callback d'origine
Protected oldproc
;// chaine identifiant Prop
Protected Prop.s= "PIM_ExplorerMultiPathRequester_" + Str(hwnd)
;// mémorise si le chemin est dans la liste
Protected AddPath2List
oldproc = GetProp_(hwnd, Prop)
Select Msg
Case #WM_NCDESTROY
RemoveProp_(hwnd, Prop)
Case #WM_LBUTTONDOWN, #WM_LBUTTONDBLCLK
HitTest\pt\x = LParam & $FFFF
HitTest\pt\y = (LParam >> 16) & $FFFF
If SendMessage_(hwnd, #TVM_HITTEST, 0, HitTest)
If HitTest\flags = #TVHT_ONITEMSTATEICON
;// Force la sélection de l'élément de l'explorertree
If SendMessage_(GadgetID(#ExplorerMultiPathRequester),#TVM_SELECTITEM, #TVGN_CARET, HitTest\hItem)
Select ((SendMessage_(GadgetID(#ExplorerMultiPathRequester), #TV_FIRST + 39, HitTest\hItem, #TVIS_STATEIMAGEMASK)>>12) - 1)
Case 0 ;// checkbox sélectionnée
AddPath2List = #True
ForEach(MultiPathPathRequesterAdvancedFolderList())
If GetGadgetText(#ExplorerMultiPathRequester) = MultiPathPathRequesterAdvancedFolderList()
AddPath2List = #False
Break
EndIf
Next
If AddPath2List = #True
;// le chemin n'existe pas dans la liste, on ajoute
If AddElement(MultiPathPathRequesterAdvancedFolderList())
MultiPathPathRequesterAdvancedFolderList() = GetGadgetText(#ExplorerMultiPathRequester)
EndIf
EndIf
Default ;// checkbox non sélectionnée
;// supprime l'élément de la liste s'il existe dans la liste
ForEach(MultiPathPathRequesterAdvancedFolderList())
If GetGadgetText(#ExplorerMultiPathRequester) = MultiPathPathRequesterAdvancedFolderList()
;// le chemin existe dans la liste, la liste est positionnée sur l'élément à supprimer
DeleteElement(MultiPathPathRequesterAdvancedFolderList())
Break
EndIf
Next
EndSelect
EndIf
EndIf
EndIf
EndSelect
ProcedureReturn CallWindowProc_(oldproc, hwnd, Msg, WParam, LParam)
EndProcedure
Procedure MultiPathRequester(Title.s, InitialPath.s)
Protected Text_FolderPath, Text_SelectedFiles, Bouton_OK, Bouton_Annuler, Option_DossierComplet, Option_DossierUniquement
Protected font, OriginProc, Position, i, Root$ = ""
;// mémorise si le chemin est dans la liste
Protected AddRoot2List
Protected NewList MultiRootPathPathRequester.s()
font = LoadFont(#PB_Any, "", 0)
If OpenWindow(#Fenetre, 0, 0, 636, 479,Title, #PB_Window_SystemMenu |#PB_Window_TitleBar|#PB_Window_ScreenCentered)
ExplorerTreeGadget(#ExplorerMultiPathRequester, 0, 0, WindowWidth(#Fenetre)-20, 386, InitialPath, #PB_Explorer_NoDriveRequester|#PB_Explorer_AutoSort|#PB_Explorer_NoFiles|#PB_Explorer_AlwaysShowSelection|#PB_Explorer_NoMyDocuments)
ButtonGadget(#Bouton_invisible,0,0,0,0,"")
#style = #TVS_HASBUTTONS |#TVS_HASLINES | #TVS_CHECKBOXES | #TVS_SHOWSELALWAYS |#WS_VISIBLE | #WS_CHILDWINDOW | #WS_CHILD| #WS_VSCROLL
SetWindowLongPtr_(GadgetID(#ExplorerMultiPathRequester),#GWL_STYLE, #style)
SplitterGadget(#SplitterGadget,10,35, WindowWidth(#Fenetre)-20,386, #ExplorerMultiPathRequester, #Bouton_invisible, #PB_Splitter_Vertical|#PB_Splitter_FirstFixed)
SetGadgetAttribute(#SplitterGadget, #PB_Splitter_FirstMinimumSize, GadgetWidth(#SplitterGadget))
SetGadgetState(#SplitterGadget, WindowWidth(#Fenetre)-20)
Text_FolderPath=TextGadget(#PB_Any, 12, 15, 162, 20, "Dossiers")
Text_SelectedFiles=TextGadget(#PB_Any, 223, 17, 177, 20, "")
Bouton_OK = ButtonGadget(#PB_Any, 470, 440, 70, 30, "OK")
Bouton_Annuler = ButtonGadget(#PB_Any, 555, 440, 70, 30, "Annuler")
Option_DossierComplet = OptionGadget(#PB_Any, 10, 440, 150, 30, "Dossier Complet")
Option_DossierUniquement = OptionGadget(#PB_Any, 200, 440, 250, 30, "Dossier sans sous-dossier")
If IsGadget(#ExplorerMultiPathRequester) And IsGadget(#Bouton_invisible) And Text_FolderPath And Text_SelectedFiles And
IsFont(font) And Bouton_OK And Bouton_Annuler And Option_DossierComplet And Option_DossierUniquement
HideGadget(#Bouton_invisible,1)
SetGadgetFont(#ExplorerMultiPathRequester, FontID(font))
OriginProc = SetWindowLongPtr_(GadgetID(#ExplorerMultiPathRequester), #GWL_WNDPROC, @CustomTreeCallback())
SetProp_(GadgetID(#ExplorerMultiPathRequester), "PIM_ExplorerMultiPathRequester_"+Str(GadgetID(#ExplorerMultiPathRequester)), OriginProc)
SetWindowTheme_(GadgetID(#ExplorerMultiPathRequester), @"explorer", #Null)
SetGadgetFont(Text_FolderPath, FontID(font))
SetGadgetFont(Text_SelectedFiles, FontID(font))
SetGadgetFont(Bouton_OK, FontID(font))
SetGadgetFont(Bouton_Annuler, FontID(font))
SetGadgetFont(Option_DossierComplet, FontID(font))
SetGadgetFont(Option_DossierUniquement, FontID(font))
SetGadgetState(Option_DossierComplet, 1)
SetActiveGadget(#ExplorerMultiPathRequester)
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case Bouton_OK
ClearDebugOutput()
ClearList(MultiRootPathPathRequester())
SortList(MultiPathPathRequesterAdvancedFolderList(), #PB_Sort_Ascending|#PB_Sort_NoCase)
;// affichage du résultat
Select GetGadgetState(Option_DossierUniquement)
Case 1 ;// dossier sans sous-dossier
;// affichage des dossiers sans sous-dossier à afficher
ForEach MultiPathPathRequesterAdvancedFolderList()
If Len(MultiPathPathRequesterAdvancedFolderList())
Debug MultiPathPathRequesterAdvancedFolderList()
Else
MessageRequester("Erreur", "Pas de sélection dans ce mode (dossier sans sous-dossier)", 16)
EndIf
Next
Default ;// dossier et sous-dossier
;// création d'une liste avec les dossiers racine pour énumération
i = 0
ForEach MultiPathPathRequesterAdvancedFolderList()
SelectElement(MultiPathPathRequesterAdvancedFolderList(), i)
Root$ = MultiPathPathRequesterAdvancedFolderList()
AddRoot2List = #True
If ListSize(MultiRootPathPathRequester())
ForEach MultiRootPathPathRequester()
If Len(MultiRootPathPathRequester()) > Len(Root$)
If Left(MultiRootPathPathRequester(), Len(Root$)) = Root$
AddRoot2List = #False
Break
EndIf
ElseIf Len(MultiRootPathPathRequester()) < Len(Root$)
If Left(Root$, Len(MultiRootPathPathRequester())) = MultiRootPathPathRequester()
AddRoot2List = #False
Break
EndIf
Else
If MultiRootPathPathRequester() = Root$
AddRoot2List = #False
Break
EndIf
EndIf
Next
EndIf
If AddRoot2List
If AddElement(MultiRootPathPathRequester())
MultiRootPathPathRequester() = Root$
EndIf
EndIf
i+1
Next
;// affichage des racines à utiliser
SortList(MultiRootPathPathRequester(), #PB_Sort_Ascending|#PB_Sort_NoCase)
If ListSize(MultiRootPathPathRequester()) = 1 And Len(MultiRootPathPathRequester()) = 0
If GetDrive(MultiRootPathPathRequester()) = -1
MessageRequester("Erreur", "Impossible de lister les lecteurs", 16)
Else
ForEach MultiRootPathPathRequester()
Debug MultiRootPathPathRequester()
Next
EndIf
Else
ForEach MultiRootPathPathRequester()
Debug MultiRootPathPathRequester()
Next
EndIf
EndSelect
Case Bouton_Annuler
PostEvent(#PB_Event_CloseWindow, #Fenetre, 0)
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(#Fenetre)
FreeFont(font)
Break
EndSelect
ForEver
EndIf
EndIf
EndProcedure
;// appel de la fonction
MultiPathRequester("MultiPath Requester", "")
End