J'ai mélangé les 2 codes.
Ça marche mais il y a un petit bug : Il faut que les fichiers à copier soient assez gros, plusieurs 100taines de Mo, pour que la boîte de dialogue apparaisse. Je ne sais pas pourquoi.
Quand on annule la copie, ça n'annule que le fichier en cours. Une petite modif permettrai d'annuler toutes les copies en cours.
Code : Tout sélectionner
Procedure Ansi2Uni(st$)
blen = (Len(st$)*2)+2
wbuf = AllocateMemory(blen)
MultiByteToWideChar_(#CP_ACP, 0, st$, -1, wbuf, blen)
ProcedureReturn wbuf
EndProcedure
#CLSCTX_INPROC_SERVER = 1
#PROGDLG_NORMAL = 0
#PROGDLG_AUTOTIME = 2
#PDTIMER_RESET = 1
#IDA_COPY_ANIMATION = 160 ; AVI file resource ID (I use an arbitrary constant name)
; This one is from shell32.dll.
; You can use any AVI file resource as long as it's
; uncompressed or RLE8 compressed, silent and
; smaller or equal to 272 by 60 pixels in size.
;==================================================
#PROGRESS_CONTINUE = 0
#PROGRESS_CANCEL = 1
#PROGRESS_STOP = 2
#PROGRESS_QUIET = 3
#COPY_FILE_FAIL_IF_EXISTS = 1
#COPY_FILE_RESTARTABLE = 2
;- Window Constants
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
Enumeration
#Text_0
#String_0
#Text_1
#String_1
#Text_2
#ProgressBar_FileProgress
#Button_Copy
#Button_1
#Button_2
#Button_Cancel
EndEnumeration
Global ppv.IProgressDialog
Global Copy_FileSource.s ;
Global Copy_FileDestination.s ;
Global Copy_cancel
Procedure Open_Window_0()
If OpenWindow(#Window_0, 344, 256, 334, 200,"copie",#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
TextGadget(#Text_0, 5, 5, 320, 15,"Fichiers sources :")
StringGadget(#String_0, 5, 20, 290, 20,"",#PB_String_ReadOnly)
TextGadget(#Text_1, 5, 55, 320, 15,"Destination :")
StringGadget(#String_1, 5, 70, 290, 20,"",#PB_String_ReadOnly)
TextGadget(#Text_2, 5, 140, 200, 15,"Progression :")
ProgressBarGadget(#ProgressBar_FileProgress, 5, 155, 290, 15, 0, 100,#PB_ProgressBar_Smooth)
ButtonGadget(#Button_Copy, 80, 100, 190, 25,"copier")
ButtonGadget(#Button_1, 300, 20, 30, 20,"...")
;ButtonGadget(#Button_2, 300, 70, 30, 20,"...")
;ButtonGadget(#Button_Cancel, 260, 150, 70, 25,"annuler") : DisableGadget(#Button_Cancel,1)
EndIf
EndProcedure
; Interruption d'une copie si Copy_cancel= #PROGRESS_CANCEL
Procedure.l CopyProgressCallback(TotalFileSize.q, TotalBytesTransferred.q, StreamSize.q, StreamBytesTransferred.q, dwStreamNumber.l , dwCallbackReason.l, hSourceFile.l, hDestinationFile.l, lpData.l)
SetGadgetState(#ProgressBar_FileProgress, TotalBytesTransferred)
If ppv\HasUserCancelled()
MessageRequester("Message", "Copie annulée")
Copy_cancel=#PROGRESS_CANCEL
ProcedureReturn Copy_cancel
Else
If dwCompleted>=100
MessageRequester("Message", "Copie Complète")
ProcedureReturn Copy_cancel
Else
dwCompleted=TotalBytesTransferred
ppv\SetProgress(dwCompleted, FileSize(Copy_FileSource));ppv\SetProgress64() pour copier des fichiers de plus de 4 Go
*Line2 = Ansi2Uni("Pourcentage de progression : "+Str(100*dwCompleted/FileSize(Copy_FileSource)))
ppv\SetLine(2, *Line2, #True, 0)
FreeMemory(*Line2)
EndIf
EndIf
ProcedureReturn Copy_cancel
EndProcedure
; Procedure CopyFile_Thread(*v)
; DisableGadget(#Button_Copy, 1)
; DisableGadget(#Button_Cancel, 0)
; SetGadgetAttribute(#ProgressBar_FileProgress, #PB_ProgressBar_Maximum, FileSize(Copy_FileSource))
; SetGadgetState(#ProgressBar_FileProgress,0)
; If CopyFileEx_( @Copy_FileSource, @Copy_FileDestination, @CopyProgressCallback(), 0, cancel, 0)
; MessageRequester("", "Le fichier est copié", #MB_OK|#MB_ICONINFORMATION)
; Else
; MessageRequester("", " a été interrompu", #MB_OK|#MB_ICONWARNING)
; EndIf
; DisableGadget(#Button_Copy, 0)
; DisableGadget(#Button_Cancel, 1)
; EndProcedure
Procedure CopyFilew()
;CoInitialize_(0)
;CoInitializeEx_(0,0)
CoInitializeEx_(0,2)
hr = CoCreateInstance_(?CLSID_ProgressDialog, #Null, #CLSCTX_INPROC_SERVER, ?IID_IProgressDialog, @ppv.IProgressDialog)
If hr=#S_OK
*Title = Ansi2Uni("Copie de fichiers...")
ppv\SetTitle(*Title)
hShell = OpenLibrary(0, "shell32.dll")
If hShell
ppv\SetAnimation(hShell, #IDA_COPY_ANIMATION)
EndIf
*Cancel = Ansi2Uni("Cancel")
ppv\SetCancelMsg(*Cancel, 0)
*Line1 = Ansi2Uni(Copy_FileSource)
ppv\SetLine(1, *Line1, #True, 0)
ppv\StartProgressDialog(#Null, 0, #PROGDLG_AUTOTIME|#PROGDLG_NORMAL, 0)
; vista et + seulement #PROGDLG_AUTOTIME|#PROGDLG_NORMAL|#PROGDLG_MARQUEEPROGRESS
ppv\Timer(#PDTIMER_RESET, 0)
;======================
DisableGadget(#Button_Copy, 1)
;DisableGadget(#Button_Cancel, 0)
SetGadgetAttribute(#ProgressBar_FileProgress, #PB_ProgressBar_Maximum, FileSize(Copy_FileSource))
SetGadgetState(#ProgressBar_FileProgress,0)
CopyFileEx_( @Copy_FileSource, @Copy_FileDestination, @CopyProgressCallback(), 0, cancel, 0)
DisableGadget(#Button_Copy, 0)
ppv\StopProgressDialog()
ppv\Release()
FreeMemory(*Title)
FreeMemory(*Cancel)
FreeMemory(*Line1)
If hShell:CloseLibrary(0):EndIf
Else
Debug Hex(hr)
EndIf
CoUninitialize_()
EndProcedure
Open_Window_0()
Repeat ;
Event = WaitWindowEvent();
If Event =#PB_Event_Gadget
Select EventGadget();
Case #Button_1; Bouton pour sélectionner un fichier
Fileo.s=OpenFileRequester("","","tous les fichiers|*.*",0,#PB_Requester_MultiSelection )
If Fileo<>""
SetGadgetText(#String_0, Fileo)
EndIf
CheminInitial$ = "C:\" ; Répertoire par défaut qui sera affiché (une chaîne vide est aussi possible)
Chemin$ = PathRequester("Choisissez un répertoire", CheminInitial$)
Case #Button_Copy ; Bouton pour copier un fichier
While Fileo
Copy_FileSource=Fileo
Copy_FileDestination.s=chemin$+GetFilePart(Fileo)
SetGadgetText(#String_0, Copy_FileSource)
SetGadgetText(#String_1, Copy_FileDestination)
If FileSize(Copy_FileSource)>0 And Copy_FileDestination<>""
Copy_cancel = #PROGRESS_CONTINUE
;CreateThread(@CopyFile_Thread(), 0)
CopyFilew()
Else
MessageRequester("","Problème ?", 48)
EndIf
Fileo=NextSelectedFileName()
Wend
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
DataSection
CLSID_ProgressDialog:
Data.l $F8383852
Data.w $FCD3, $11D1
Data.b $A6, $B9, 0, $60, $97, $DF, $5B, $D4
IID_IProgressDialog:
Data.l $EBBC7C04
Data.w $315E, $11D2
Data.b $B6, $2F, 0, $60, $97, $DF, $5B, $D4
EndDataSection
Mesa.