voici le code que j'utilise pour le drag and drop.
Je n'ai pas trouvé comment récupérer les infos du webgadget pour pouvoir mettre celui survolé en surbrillance et enfin le déposer au bon emplacement en sachant que pour mettre à jour la page, c'est le système qui rafraichi lorsque le fichier/dossier aura été ajouté sur le site
j'ai modifié le code de Chris pour afficher le dossier C:\ de mon disque en mettant ceci
directement dans la 1ere stringadget de la fenetre qui apparaît en cliquant sur le bouton réglage puis en validant.
J'ai ajouté quelques variables globales, ajouté quelques lignes à la procedure Open_Win_Main() et j'ai ajouté une callback gérée par le système et par par PB car on ne récupère pas les infos de notification car l'explorerTreegadget a sa propre fenêtre Parent qui inercepte ces événements (Pb gère ça) et Pb sait qu'il a déjà répondu à ces message ce qui fait que l'on ne passe pas dans la callback définie par Setwindowcallback()
Code : Tout sélectionner
;- Constantes Fenêtres
Enumeration
#Win_Main
#Win_Options
EndEnumeration
;- Constantes Gadgets
Enumeration
#Ex_Tree
#Web
#Txt_Mask
#Str_Mask
#Btn_Mask
#Str_FtpFolder
#Btn_PrevFolder
#Btn_Options
#Txt_Serveur
#Str_Adresse
#Text_Source
#Str_Source
#Btn_Valider
#Btn_Annuler
#Btn_Folder
EndEnumeration
;- Variables
Global Serveur.s, Source.s
;* -----------------------------------------------
; ajouté cette ligne
Global Drag_en_Cours.l, DragImageList.l, SourceGadget.l
Global SourceItem.l, GadgetCible.l, CibleItem.l, WindowProc_Org_ExplorerTree.l
;* -----------------------------------------------
;- Procedure
;- Callback
Procedure WindowCallback(Window.l, Message.l, wParam.l, lParam.l)
Resultat = CallWindowProc_(WindowProc_Org_ExplorerTree, Window, Message, wParam, lParam)
If Message = #WM_NOTIFY
*pnmh.NMTREEVIEW = lParam
If *pnmh\hdr\hwndFrom = GadgetID(#Ex_Tree)
If *pnmh\hdr\code = #TVN_BEGINDRAG
SourceGadget = #Ex_Tree ; le gadget d'ou provient l'opération
SourceItem = *pnmh\itemNew\hItem ; l'élément du gadget concerné
DragImageList = SendMessage_(GadgetID(SourceGadget), #TVM_CREATEDRAGIMAGE, 0, SourceItem)
SendMessage_(GadgetID(SourceGadget), #TVM_SELECTITEM, #TVGN_CARET, #Null)
If DragImageList And ImageList_BeginDrag_(DragImageList, 0, 0, 0)
ImageList_DragEnter_(GadgetID(SourceGadget), 0, 0)
ImageList_DragShowNolock_(#True)
ImageList_DragLeave_(GadgetID(SourceGadget))
ShowCursor_(#False)
SetCapture_(GetParent_(GadgetID(SourceGadget)))
SendMessage_(GadgetID(SourceGadget), #TVM_SELECTITEM, #TVGN_CARET, SourceItem)
Drag_en_Cours = #True
EndIf
EndIf
EndIf
ElseIf Message = #WM_MOUSEMOVE And Drag_en_Cours
; ici on est en train de déplacer l'élément si on a Drag_en_Cours qui vaut #True
; Drag_en_Cours est à #True dans la callback après interception de #WM_NOTIFY
; puis de #TVN_BEGINDRAG
; Drag_en_Cours est à #False lorsque l'on relache le bouton de la souris
; en interceptant le message #WM_LBUTTONUP And Drag_en_Cours
If DragImageList
UpperLeft.POINT\x = PeekW(@lParam)
UpperLeft.POINT\y = PeekW(@lParam+2)
ClientToScreen_(GadgetID(SourceGadget), @UpperLeft.POINT)
ImageList_DragShowNolock_(#False)
ImageList_DragShowNolock_(#True)
ImageList_DragMove_(UpperLeft\x, UpperLeft\y)
EndIf
ElseIf Message = #WM_LBUTTONUP And Drag_en_Cours
ImageList_EndDrag_()
ReleaseCapture_()
ShowCursor_(#True)
ImageList_Destroy_(DragImageList)
DragImageList = 0
Drag_en_Cours = #False
; on regarde si on est sur le webgadget
GadgetCibleID = ChildWindowFromPoint_(GetParent_(Window), PeekW(@lParam), PeekW(@lParam+2))
If GadgetCibleID = GadgetID(#web)
GadgetCible = #web
Else
GadgetCible = -1
EndIf
EndIf
ProcedureReturn Resultat
EndProcedure
Procedure Open_Win_Main()
If OpenWindow(#Win_Main, 216, 0, 600, 290, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar, "FTP-Send My File")
hwnd = WindowID(#Win_Main) : Result = hwnd
If CreateGadgetList(hwnd)
ExplorerTreeGadget(#Ex_Tree, 5, 30, 175, 230, Source, #PB_Explorer_AlwaysShowSelection | #PB_Explorer_NoDriveRequester)
WebGadget(#Web, 185, 30, 410, 255, Serveur)
TextGadget(#Txt_Mask, 5, 270, 50, 15, "Masque")
StringGadget(#Str_Mask, 60, 265, 95, 20, "")
ButtonGadget(#Btn_Mask, 155, 265, 25, 20, "Go")
StringGadget(#Str_FtpFolder, 210, 5, 385, 20, "")
ButtonGadget(#Btn_PrevFolder, 185, 5, 25, 20, "<<")
ButtonGadget(#Btn_Options, 5, 5, 175, 20, "Règlages")
;* -----------------------------------------------
; ajouté ces lignes
; DragAcceptFiles_(GadgetID(#Web), #True)
SetWindowLong_(GadgetID(#Ex_Tree), #GWL_STYLE, (GetWindowLong_(GadgetID(#Ex_Tree), #GWL_STYLE)& ( ~#TVS_DISABLEDRAGDROP)))
WindowProc_Org_ExplorerTree = SetWindowLong_(GetParent_(GadgetID(#Ex_Tree)), #GWL_WNDPROC, @WindowCallback())
;* -----------------------------------------------
EndIf
EndIf
ProcedureReturn Result
EndProcedure
Procedure Open_Win_Options()
If OpenWindow(#Win_Options, 278, 139, 355, 135, 0, "FTP-Send My File : Règlages")
If CreateGadgetList(WindowID())
; TextGadget(#Txt_Serveur, 5, 10, 345, 15, "Adresse du serveur : (ftp://ftp.mon-serveur.fr/dossier-web/dossier-cible/)")
; TextGadget(#Txt_Serveur, 5, 10, 345, 15, "Adresse du serveur : (ftp://ftp.mon-serveur.fr/dossier-web/dossier-cible/)")
StringGadget(#Str_Adresse, 5, 25, 345, 20, "")
TextGadget(#Text_Source, 5, 60, 345, 15, "Dossier source par défaut")
StringGadget(#Str_Source, 5, 75, 325, 20, "")
ButtonGadget(#Btn_Valider, 250, 110, 100, 20, "Valider")
ButtonGadget(#Btn_Annuler, 150, 110, 100, 20, "Annuler")
ButtonGadget(#Btn_Folder, 330, 75, 20, 20, "...")
EndIf
EndIf
SetGadgetText(#Str_Adresse, Serveur)
SetGadgetText(#Str_Source, Source)
EndProcedure
Procedure.s BSTR_To_STR(BSTR.l)
Protected tmp.s
If BSTR = 0 : ProcedureReturn "" : EndIf
lenb = SysStringLen_(BSTR) + 1
tmp = Space(lenb)
If WideCharToMultiByte_(#CP_ACP, 0, BSTR, lenb, @tmp, lenb, #Null, #False) = 0
ProcedureReturn ""
EndIf
SysFreeString_(BSTR)
ProcedureReturn tmp
EndProcedure
Procedure SavePref()
CreatePreferences("SendMyFile.ini")
PreferenceGroup("Global")
WritePreferenceString("FTP-Path", Serveur)
WritePreferenceString("Source", Source)
ClosePreferences()
EndProcedure
Procedure LoadPref()
OpenPreferences("SendMyFile.ini")
PreferenceGroup("Global")
Serveur = ReadPreferenceString("FTP-Path", "about:blank")
Source = ReadPreferenceString("Source", "")
ClosePreferences()
EndProcedure
LoadPref()
h_Main = Open_Win_Main()
Goto fin
If h_Main
Browser.IWebBrowser2 = GetWindowLong_(GadgetID(#Web), #GWL_USERDATA)
EndIf
If Browser = 0
MessageRequester("Erreur", "Impossible d'initialiser le navigateur", #MB_OK | #MB_ICONERROR)
End
Else
Repeat
While WindowEvent() : Wend : Delay(1)
Browser\get_Busy( @IsBusy.l)
Until IsBusy = 0
EndIf
*Adress.b = AllocateMemory(#MAX_PATH)
If Browser\get_LocationURL( @ * Adress) = #ERROR_SUCCESS
Adresse.s = BSTR_To_STR(*Adress)
SetGadgetText(#Str_FtpFolder, Adresse)
EndIf
fin:
Repeat
Select WaitWindowEvent()
Case #PB_EventGadget
Select EventGadgetID()
Case #Btn_Mask ;{ / Modifie le type de fichiers affichables dans l'explorateur
If GetGadgetText(#Str_Mask) <> ""
Mask$ = GetGadgetText(#Str_Mask)
If Left(Mask$, 2) <> "*." : Mask$ = "*." + Mask$ : EndIf
SetGadgetText(#Str_Mask, Mask$)
Chemin$ = GetPathPart(GetGadgetText(#Ex_Tree))
SetGadgetText(#Ex_Tree, Chemin$ + Mask$)
EndIf
;}
Case #Btn_PrevFolder ;{ / Redescend dans l'arbre des fichiers du site
If Left(Adresse, 6) = "ftp://"
Chemin$ = Right(Adresse, Len(Adresse) - 6)
Cnt = CountString(Chemin$, "/")
If Cnt > 1
Chemin$ = "ftp://" + StringField(Chemin$, Cnt - 1, "/") + "/"
EndIf
SetGadgetText(#Web, Chemin$)
Repeat
While WindowEvent() : Wend : Delay(1)
Browser\get_Busy( @IsBusy.l)
Until IsBusy = 0
*Adress.b = AllocateMemory(#MAX_PATH)
If Browser\get_LocationURL( @ * Adress) = #ERROR_SUCCESS
Adresse.s = BSTR_To_STR(*Adress)
SetGadgetText(#Str_FtpFolder, Adresse)
EndIf
EndIf
;}
Case #Btn_Options ;{ / Ouvre la fenêtre des options
Open_Win_Options()
;}
Case #Btn_Folder ;{ / Change le dossier par défaut pour les fichiers à envoyer
Tmp$ = PathRequester("Dossier par défaut", "")
If Tmp$ <> "" : Source = "file://"+Tmp$ : Tmp$ = "" : EndIf
MessageRequester("Source",Source,16)
SetGadgetText(#Str_Source, Source)
;}
Case #Btn_Valider ;{ / Valide les options, et ferme la boite
Serveur = GetGadgetText(#Str_Adresse)
If Serveur <> "about:blank"
; If Left(Serveur, 6) <> "ftp://" : Serveur = "ftp://" + Serveur : EndIf
; If Right(Serveur, 1) <> "/" : Serveur + "/" : EndIf
EndIf
Source = GetGadgetText(#Str_Source)
SavePref() : LoadPref()
SetGadgetText(#Web, Serveur)
SetGadgetText(#Ex_Tree, Source)
SetGadgetText(#Str_FtpFolder, Serveur)
CloseWindow(#Win_Options)
UseWindow(#Win_Main)
;}
Case #Btn_Annuler ;{ / Ferme la boite des options sans rien changer
CloseWindow(#Win_Options)
UseWindow(#Win_Main)
;}
EndSelect
Case #PB_EventCloseWindow
If EventWindowID() = #Win_Options
CloseWindow(#Win_Options)
UseWindow(#Win_Main)
Else
Quit = #True
EndIf
EndSelect
Until Quit
End