[R] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 301
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

[R] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#1

Message par Anthony »

Bonjour à tous,

Ci-joint un code propre et fonctionnel jusqu'au moment ou je trouve un conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY
Je souhaite caresser l'espoir d'une ame charitable afin de m'aider à comprendre comment résoudre ce soucis.
J'ai déjà éssayé pas mal de choses mais je bloque toujours sur les GUIRegisterMsg.
Le but est de pouvoir organiser l'ordre de plusieurs fichiers GCODE afin de les combiner dans un GCODE unique très simplement.

Merci d'avance.

EDIT: Résolu voir viewtopic.php?f=3&t=16040&p=108501#p108501
► Afficher le texte
Modifié en dernier par Anthony le mer. 17 juil. 2024 02:12, modifié 3 fois.
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1023
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#2

Message par walkson »

Bonjour,
Je n'ai pas trouvé de problème en testant votre code à part que j'ai du rajouter Global $mContextMenu1, $mContextMenu2
Vous devriez être plus précis sur votre problème...
J'oublie ! les fichiers se chevauchent dans le fichier final du genre
GUICtrlSetData($Combo2, $comboText, "")#include <GUIConstants.au3>
L'astuce que j'ai trouvé est de faire un texte de 3 lignes vides
Global $blanc = @ScriptDir & "\blanc.txt"
FileWrite($blanc,@CRLF & @CRLF & @CRLF)
et de modifier $AddFiles &= '"' & $RetPath & $RetFile & '"+' & $blanc & "+"
Chaque fichier a 3 lignes vides à la fin avant d'écrire le suivant
et de supprimer le fichier "blanc" à la sortie du code
C'est pas très propre mais ça marche :mrgreen:
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 301
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#3

Message par Anthony »

walkson a écrit : jeu. 11 juil. 2024 16:53 Bonjour,
Je n'ai pas trouvé de problème en testant votre code à part que j'ai du rajouter Global $mContextMenu1, $mContextMenu2
Vous devriez être plus précis sur votre problème...
J'oublie ! les fichiers se chevauchent dans le fichier final du genre
GUICtrlSetData($Combo2, $comboText, "")#include <GUIConstants.au3>
L'astuce que j'ai trouvé est de faire un texte de 3 lignes vides
Global $blanc = @ScriptDir & "\blanc.txt"
FileWrite($blanc,@CRLF & @CRLF & @CRLF)
et de modifier $AddFiles &= '"' & $RetPath & $RetFile & '"+' & $blanc & "+"
Chaque fichier a 3 lignes vides à la fin avant d'écrire le suivant
et de supprimer le fichier "blanc" à la sortie du code
C'est pas très propre mais ça marche :mrgreen:

Bonjour walkson,
J'ai fait une petite mise à jour en éssayant de faire propre :mrgreen: Func _Fusion()
Pour expliquer ce qui ne fonctionne pas c'est quand on clique sur le header de la colonne
çà doit réorganiser par ordre aphabétique et on doit aussi pouvoir réorganiser dans l'ordre que l'on souhaite
en déplaçant vers le haut ou le bas avec la souris n'importe quel fichier, ce que permet "GUIListViewEx.au3".
En désactivant GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") çà fonctionne mais je perd cette fonction.
Je me suis compris mais si ne n'est pas le cas je mettrai à jour.
Merci.
► Afficher le texte
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
Nine
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 106
Enregistré le : ven. 17 avr. 2020 01:23
Localisation : Montréal, Québec
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#4

Message par Nine »

Tel que décrit dans le rtf de Melba :
The UDF registers these 4 messages automatically – if you already have handlers for these messages in your script, do not register them again using the UDF function (set the relevant parameter to False) but call the relevant UDF handler function from within your existing handler. Note that the UDF handler should be called as the final action of the existing handler and the return value should be that returned from the UDF handler
En d'autres mots, tu dois appeler le handler de l'UDF pour WM_NOTIFY à la dernière ligne de ton propre handler. Ne pas oublier de mettre le paramètre à False lors de l'appel...
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 301
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#5

Message par Anthony »

Bonjour Nine,
L'UDF enregistre automatiquement ces 4 messages
Je suppose Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Si vous avez déjà des gestionnaires pour ces messages dans votre script, ne les enregistrez pas à nouveau à l'aide de la fonction UDF (définissez le paramètre correspondant sur False) mais appelez la fonction de gestionnaire UDF appropriée depuis votre gestionnaire existant. Notez que le gestionnaire UDF doit être appelé comme action finale du gestionnaire existant et que la valeur de retour doit être celle renvoyée par le gestionnaire UDF.
Je ne pense pas que je sois sur la bonne route Global $iList = _GUIListViewEx_Init( $cList, "", 0, 0, False, 1)
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1023
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#6

Message par walkson »

Bonjour,
J'ai modifié Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

Code : Tout sélectionner

#include <GUIConstants.au3>
#include <FontConstants.au3>
#include <GUIListView.au3>

#include "D:\Mes Documents D\bureau autoit\LISTVIEW\_ListView\GUIListViewEx_melba\GUIListViewEx.au3"

Global $gaDropFiles[1], $mContextMenu1, $mContextMenu2, $g_bSortSense = False

;GUICreate('', 320, 220, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUICreate("CNC fusion (de fichiers GCode)", 520, 420, -1, -1, $WS_OVERLAPPEDWINDOW, $WS_EX_ACCEPTFILES)

Global $BtnName1 = "Glissez-Déposez vos fichiers dans la fenêtre", $BtnName2 = "Fusionner",$OutFile, $OutName = "Prg_Uni", $OutExt
Global $idBtnFusion = GUICtrlCreateButton( $BtnName1, 10, 380, 500, 30)
GUICtrlSetResizing( -1, BitOr( $GUI_DOCKBOTTOM, $GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKSIZE))
GUICtrlSetFont( -1, 10, $FW_NORMAL, $GUI_FONTUNDER, "Comic Sans Ms")
;GUICtrlSetState( -1,$GUI_DISABLE)

$cList = GUICtrlCreateListView('Nom du fichier|Dossier', 10, 10, 500, 360)
GUICtrlSendMsg( $cList, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, -1)
_GUICtrlListView_SetColumnWidth( $cList, 0, $LVSCW_AUTOSIZE_USEHEADER)
GUICtrlSetState( $cList, $GUI_DROPACCEPTED)
GUICtrlSetResizing(-1, BitOr( $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKSIZE))

_Context_Menu()

_Init_GUIListViewEx_Init()

_Count_Items()

GUIRegisterMsg($WM_DROPFILES, '_WM_DROPFILES_FUNC')

GUISetState()

_GUIListViewEx_MsgRegister()

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
	  Case $GUI_EVENT_CLOSE
		 _Quit()
	  Case $GUI_EVENT_DROPPED
		 _Event_Dropped()
	  Case $idBtnFusion
		 _Fusion()
	  Case $mContextMenu1
		 _Remove()
	  Case $mContextMenu2
		 _Remove_All()
   EndSwitch
WEnd

Func _Context_Menu()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Context_Menu()" & @CRLF)
   Global $mContextMenu, $mContextMenu1, $mContextMenu2
   ; Create context menu for native ListView
   $mContextMenu = GUICtrlCreateContextMenu( $cList)
   $mContextMenu1 = GUICtrlCreateMenuItem("Retirer de la liste", $mContextmenu)
   GUICtrlCreateMenuItem("", $mContextmenu)
   $mContextMenu2 = GUICtrlCreateMenuItem("Retirer tout", $mContextmenu)
EndFunc

Func _Init_GUIListViewEx_Init()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Init_GUIListViewEx_Init()" & @CRLF)
   Global $iList = _GUIListViewEx_Init( $cList, "", 0, 0, True, 1) ; External drag & drop - items deleted on drag
EndFunc

Func _Remove()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Remove()" & @CRLF)
   _GUIListViewEx_SetActive( $iList)
   _GUIListViewEx_Delete()
   _Count_Items()
EndFunc

Func _Remove_All()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Remove_All()" & @CRLF)
   _GUIListViewEx_Close( $iList)                		; Should be the index returned from _GUIListViewEx_Init
   _GUICtrlListView_DeleteAllItems( $cList)     		; Should be the handle/ControlID returned by GUICtrlCreateListView/_GUICrtlListView_Create
   _Init_GUIListViewEx_Init()							; Here you need to store the new index retuned by the function...
   _GUIListViewEx_SetActive( $iList)             		; ...which you then use here
   _Count_Items()
   ;$aRet = _GUIListViewEx_ReadToArray( $cList, 0)
   ;_ArrayDisplay( $aRet)
   ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "_GUICtrlListView_GetItemCount( $cList) " & _GUICtrlListView_GetItemCount( $cList) & @CRLF)
EndFunc

Func _Fusion()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Fusion()" & @CRLF)
   Local $TMPdir = "C:\~CNC~TMP\", $aRet = '', $aRetOld = '', $AddFiles = ''
   $aRet = _GUIListViewEx_ReadToArray( $cList, 0)
   ;$CNT = _GUICtrlListView_GetItemCount( $cList)-1
   ;_ArrayDisplay( $aRet)

   DirCreate( $TMPdir)

   For $i = 0 To _GUICtrlListView_GetItemCount( $cList)-1
	  $RetPath = $aRet[$i][1]
	  $RetFile = $aRet[$i][0]

	  $sStr = StringRight( FileRead( $RetPath & $RetFile, -1), 2)
	  If $sStr = @CR Or $sStr = @LF Or $sStr = @CRLF Then
		 $sStr = "( >>> Fin du progamme n°" & $i+1 & " <<< )" & @CRLF
	  Else
		 $sStr = @CRLF & "( >>> Fin du progamme n°" & $i+1 & " <<< )" & @CRLF
	  EndIf
	  RunWait(@ComSpec & ' /c ' & 'Copy /b "' & $RetPath & $RetFile & '" "' & $TMPdir & $i+1 & ".CNCtmp" & '"', "", @SW_SHOW)
	  Local $hFileOpen = FileOpen( $TMPdir & $i+1 & ".CNCtmp", $FO_APPEND)
	  FileWrite( $hFileOpen, $sStr)
	  FileClose( $hFileOpen)
	  ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & $i & @TAB & "$RetPath = " & $RetPath & @CRLF)
	  If Not $aRetOld Then $aRetOld = $RetPath
		 ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & $i & @TAB & "$aRetOld = " & $aRetOld & @CRLF)
	  If $aRetOld = $RetPath Then
		 If $i = _GUICtrlListView_GetItemCount( $cList)-1 Then
			$AddFiles &= '"' & $TMPdir & $i+1 & ".CNCtmp" & '"'
		 Else
			$AddFiles &= '"' & $TMPdir & $i+1 & ".CNCtmp" & '"+'
		 EndIf
	  Else
		 ;ConsoleWrite( $RetPath & @CRLF)
	  EndIf
   Next
   ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "$AddFiles = " & $AddFiles & @CRLF)
   If $AddFiles Then
	  RunWait(@ComSpec & ' /c ' & 'Copy /b ' & $AddFiles & ' "' & $OutFile & '"', "", @SW_SHOW)
	  DirRemove( $TMPdir, $DIR_REMOVE)
   Else

   EndIf

EndFunc

Func _Event_Dropped()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Event_Dropped()" & @CRLF)
   For $i = 0 To UBound( $gaDropFiles) - 1
	  $RetPath = StringRegExpReplace( $gaDropFiles[$i], "(^.*\\)(.*)", "\1")
	  $RetFile = StringRegExpReplace( $gaDropFiles[$i], "^.*\\", "")
	  GUICtrlCreateListViewItem( $RetFile & '|' & $RetPath, $cList)
	  _GUIListViewEx_Insert( $RetFile & '|' & $RetPath)
   Next
   For $i = 0 To _GUICtrlListView_GetColumnCount( $cList)-1
	  _GUICtrlListView_SetColumnWidth( $cList, $i, $LVSCW_AUTOSIZE_USEHEADER)
   Next
   _Count_Items()
EndFunc

Func _Count_Items()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Count_Items()" & @CRLF)
   If _GUICtrlListView_GetItemCount( $cList) < '2' Then
	  GUICtrlSetState( $idBtnFusion, $GUI_DISABLE)
	  GUICtrlSetData( $idBtnFusion, $BtnName1)
   Else
	  If Not $OutExt Then
		 GUICtrlSetState( $idBtnFusion, $GUI_DISABLE)
	  Else
		 GUICtrlSetState( $idBtnFusion, $GUI_ENABLE)
	  EndIf
	  GUICtrlSetData( $idBtnFusion, "Cliquez sur un fichier pour choisir son extension")
   EndIf

   If _GUICtrlListView_GetItemCount( $cList) < '1' Then
	  GUICtrlSetState( $mContextMenu1, $GUI_DISABLE)
	  GUICtrlSetState( $mContextMenu2, $GUI_DISABLE)
   Else
	  GUICtrlSetState( $mContextMenu1, $GUI_ENABLE)
	  GUICtrlSetState( $mContextMenu2, $GUI_ENABLE)
   EndIf
   ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "_GUICtrlListView_GetItemCount( $cList) = " & _GUICtrlListView_GetItemCount( $cList) & @CRLF)
EndFunc

Func _WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)" & @CRLF)
    Local $nSize, $pFileName, $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i + 1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0
    Next
EndFunc

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
   #forceref $hWnd, $iMsg, $wParam
   $hWndListView = GUICtrlGetHandle($cList)
   $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
   $event = DllStructGetData($tNMHDR, 'Code')
   $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))

	If $hWndFrom = $hWndListView And $event = $LVN_COLUMNCLICK Then
		_GUICtrlListView_SimpleSort($hWndListView, $g_bSortSense, DllStructGetData($tNMHDR, "SubItem"))
	EndIf

   If $wParam = $cList And $event = $NM_CLICK Then
	  $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
	  $index = DllStructGetData($tInfo, "Index")
	  $SubItem = DllStructGetData($tInfo, "SubItem")

	  $OutPath = StringRegExpReplace( _GUICtrlListView_GetItemText( $cList, $index, 1), "(^.*\\)(.*)", "\1")
	  $OutExt = StringRegExpReplace( _GUICtrlListView_GetItemText( $cList, $index, 0), "^.*\.", ".$1")
	  $OutFile = $OutName & $OutExt

	  If Not $OutExt Or _GUICtrlListView_GetItemCount( $cList) < '2' Then
		 GUICtrlSetState( $idBtnFusion, $GUI_DISABLE)
		 GUICtrlSetData( $idBtnFusion, "Pas de fichier selctionné, minimum 2 fichiers pour fusionner")
	  Else
		 GUICtrlSetState( $idBtnFusion, $GUI_ENABLE)
		 GUICtrlSetData( $idBtnFusion, $BtnName2 & " (" & $OutFile & ")")
	  EndIf

	  ;ConsoleWrite(">>>>>>>>>>> " & _GUICtrlListView_GetItemText( $cList, $index, 0) & @CRLF)
   EndIf

   Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Func _Quit()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Quit()" & @CRLF)
   _GUIListViewEx_Close( $iList)
   Exit
EndFunc
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 301
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#7

Message par Anthony »

Bonjour walkson,
Super, j'ai bien regarder les modifs et j'ai même ajoutés une petite option pour toi que je pense que tu trouveras sans problème :mrgreen:
L'option (Vidéo ci-jointe) pour voir le problème du changement de l'ordre des programmes, tu aurais une piste ou idée ?
Merci..
Apperçu.mp4
(4.69 Mio) Téléchargé 6 fois
► Afficher le texte
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1023
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY  

#8

Message par walkson »

Bonjours,
On ne lit pas suffisamment les UDF :lol:
; #FUNCTION# =========================================================================================================
; Name...........: _GUIListViewEx_WM_NOTIFY_Handler
; Description ...: Windows message handler for WM_NOTIFY
; Syntax.........: _GUIListViewEx_WM_NOTIFY_Handler()
; Requirement(s).: v3.3.10 +
; Return values .: None
; Author ........: Melba23
; Modified ......:
; Remarks .......: If a WM_NOTIFY handler already registered, then call this function from within that handler
; If user colours are enabled, the handler return value must be returned on handler exit
; Example........: Yes
Ce qui nous donne

Code : Tout sélectionner

#include <GUIConstants.au3>
#include <FontConstants.au3>
#include <GUIListView.au3>

#include "D:\Mes Documents D\bureau autoit\LISTVIEW\_ListView\GUIListViewEx_melba\GUIListViewEx.au3"

Global $gaDropFiles[1], $mContextMenu1, $mContextMenu2

;GUICreate('', 320, 220, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUICreate("CNC fusion (de fichiers GCode)", 520, 420, -1, -1, $WS_OVERLAPPEDWINDOW, $WS_EX_ACCEPTFILES)

Global $BtnName1 = "Glissez-Déposez vos fichiers dans la fenêtre", $BtnName2 = "Fusionner",$OutFile, $OutName = "Prg_Uni", $OutExt
Global $idBtnFusion = GUICtrlCreateButton( $BtnName1, 10, 380, 500, 30)
GUICtrlSetResizing( -1, BitOr( $GUI_DOCKBOTTOM, $GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKSIZE))
GUICtrlSetFont( -1, 10, $FW_NORMAL, $GUI_FONTUNDER, "Comic Sans Ms")
;GUICtrlSetState( -1,$GUI_DISABLE)

$cList = GUICtrlCreateListView('Nom du fichier|Dossier', 10, 10, 500, 360)
GUICtrlSendMsg( $cList, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, -1)
_GUICtrlListView_SetColumnWidth( $cList, 0, $LVSCW_AUTOSIZE_USEHEADER)
GUICtrlSetState( $cList, $GUI_DROPACCEPTED)
GUICtrlSetResizing(-1, BitOr( $GUI_DOCKTOP, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKSIZE))

_Context_Menu()

_Init_GUIListViewEx_Init()

_Count_Items()

GUIRegisterMsg($WM_DROPFILES, '_WM_DROPFILES_FUNC')
_GUIListViewEx_MsgRegister()
GUISetState()



GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
	  Case $GUI_EVENT_CLOSE
		 _Quit()
	  Case $GUI_EVENT_DROPPED
		 _Event_Dropped()
	  Case $idBtnFusion
		 _Fusion()
	  Case $mContextMenu1
		 _Remove()
	  Case $mContextMenu2
		 _Remove_All()
   EndSwitch
WEnd

Func _Context_Menu()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Context_Menu()" & @CRLF)
   Global $mContextMenu, $mContextMenu1, $mContextMenu2
   ; Create context menu for native ListView
   $mContextMenu = GUICtrlCreateContextMenu( $cList)
   $mContextMenu1 = GUICtrlCreateMenuItem("Retirer de la liste", $mContextmenu)
   GUICtrlCreateMenuItem("", $mContextmenu)
   $mContextMenu2 = GUICtrlCreateMenuItem("Retirer tout", $mContextmenu)
EndFunc

Func _Init_GUIListViewEx_Init()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Init_GUIListViewEx_Init()" & @CRLF)
   Global $iList = _GUIListViewEx_Init( $cList, "", 0, 0, True, 1) ; External drag & drop - items deleted on drag
EndFunc

Func _Remove()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Remove()" & @CRLF)
   _GUIListViewEx_SetActive( $iList)
   _GUIListViewEx_Delete()
   _Count_Items()
EndFunc

Func _Remove_All()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Remove_All()" & @CRLF)
   _GUIListViewEx_Close( $iList)                		; Should be the index returned from _GUIListViewEx_Init
   _GUICtrlListView_DeleteAllItems( $cList)     		; Should be the handle/ControlID returned by GUICtrlCreateListView/_GUICrtlListView_Create
   _Init_GUIListViewEx_Init()							; Here you need to store the new index retuned by the function...
   _GUIListViewEx_SetActive( $iList)             		; ...which you then use here
   _Count_Items()
   ;$aRet = _GUIListViewEx_ReadToArray( $cList, 0)
   ;_ArrayDisplay( $aRet)
   ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "_GUICtrlListView_GetItemCount( $cList) " & _GUICtrlListView_GetItemCount( $cList) & @CRLF)
EndFunc

Func _Fusion()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Fusion()" & @CRLF)
   Local $TMPdir = "C:\~CNC~TMP\", $aRet = '', $aRetOld = '', $AddFiles = ''
   $aRet = _GUIListViewEx_ReadToArray( $cList, 0)
   ;$CNT = _GUICtrlListView_GetItemCount( $cList)-1
   ;_ArrayDisplay( $aRet)

   DirCreate( $TMPdir)

   For $i = 0 To _GUICtrlListView_GetItemCount( $cList)-1
	  $RetPath = $aRet[$i][1]
	  $RetFile = $aRet[$i][0]

	  $sStr = StringRight( FileRead( $RetPath & $RetFile, -1), 2)
	  If $sStr = @CR Or $sStr = @LF Or $sStr = @CRLF Then
		 $sStr = "( >>> Fin du progamme n°" & $i+1 & " <<< )" & @CRLF
	  Else
		 $sStr = @CRLF & "( >>> Fin du progamme n°" & $i+1 & " <<< )" & @CRLF
	  EndIf
	  RunWait(@ComSpec & ' /c ' & 'Copy /b "' & $RetPath & $RetFile & '" "' & $TMPdir & $i+1 & ".CNCtmp" & '"', "", @SW_SHOW)
	  Local $hFileOpen = FileOpen( $TMPdir & $i+1 & ".CNCtmp", $FO_APPEND)
	  FileWrite( $hFileOpen, $sStr)
	  FileClose( $hFileOpen)
	  ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & $i & @TAB & "$RetPath = " & $RetPath & @CRLF)
	  If Not $aRetOld Then $aRetOld = $RetPath
		 ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & $i & @TAB & "$aRetOld = " & $aRetOld & @CRLF)
	  If $aRetOld = $RetPath Then
		 If $i = _GUICtrlListView_GetItemCount( $cList)-1 Then
			$AddFiles &= '"' & $TMPdir & $i+1 & ".CNCtmp" & '"'
		 Else
			$AddFiles &= '"' & $TMPdir & $i+1 & ".CNCtmp" & '"+'
		 EndIf
	  Else
		 ;ConsoleWrite( $RetPath & @CRLF)
	  EndIf
   Next
   ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "$AddFiles = " & $AddFiles & @CRLF)
   If $AddFiles Then
	  RunWait(@ComSpec & ' /c ' & 'Copy /b ' & $AddFiles & ' "' & $OutFile & '"', "", @SW_SHOW)
	  DirRemove( $TMPdir, $DIR_REMOVE)
   Else

   EndIf

EndFunc

Func _Event_Dropped()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Event_Dropped()" & @CRLF)
   For $i = 0 To UBound( $gaDropFiles) - 1
	  $RetPath = StringRegExpReplace( $gaDropFiles[$i], "(^.*\\)(.*)", "\1")
	  $RetFile = StringRegExpReplace( $gaDropFiles[$i], "^.*\\", "")
	  GUICtrlCreateListViewItem( $RetFile & '|' & $RetPath, $cList)
	  _GUIListViewEx_Insert( $RetFile & '|' & $RetPath)
   Next
   For $i = 0 To _GUICtrlListView_GetColumnCount( $cList)-1
	  _GUICtrlListView_SetColumnWidth( $cList, $i, $LVSCW_AUTOSIZE_USEHEADER)
   Next
   _Count_Items()
EndFunc

Func _Count_Items()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Count_Items()" & @CRLF)
   If _GUICtrlListView_GetItemCount( $cList) < '2' Then
	  GUICtrlSetState( $idBtnFusion, $GUI_DISABLE)
	  GUICtrlSetData( $idBtnFusion, $BtnName1)
   Else
	  If Not $OutExt Then
		 GUICtrlSetState( $idBtnFusion, $GUI_DISABLE)
	  Else
		 GUICtrlSetState( $idBtnFusion, $GUI_ENABLE)
	  EndIf
	  GUICtrlSetData( $idBtnFusion, "Cliquez sur un fichier pour choisir son extension")
   EndIf

   If _GUICtrlListView_GetItemCount( $cList) < '1' Then
	  GUICtrlSetState( $mContextMenu1, $GUI_DISABLE)
	  GUICtrlSetState( $mContextMenu2, $GUI_DISABLE)
   Else
	  GUICtrlSetState( $mContextMenu1, $GUI_ENABLE)
	  GUICtrlSetState( $mContextMenu2, $GUI_ENABLE)
   EndIf
   ;ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "_GUICtrlListView_GetItemCount( $cList) = " & _GUICtrlListView_GetItemCount( $cList) & @CRLF)
EndFunc

Func _WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)" & @CRLF)
    Local $nSize, $pFileName, $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i + 1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0
    Next
EndFunc

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
   #forceref $hWnd, $iMsg, $wParam
   _GUIListViewEx_WM_NOTIFY_Handler($hWnd, $iMsg, $wParam, $lParam)
   $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
   $event = DllStructGetData($tNMHDR, 'Code')

   If $wParam = $cList And $event = $NM_CLICK Then
	  $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
	  $index = DllStructGetData($tInfo, "Index")
	  $SubItem = DllStructGetData($tInfo, "SubItem")

	  $OutPath = StringRegExpReplace( _GUICtrlListView_GetItemText( $cList, $index, 1), "(^.*\\)(.*)", "\1")
	  $OutExt = StringRegExpReplace( _GUICtrlListView_GetItemText( $cList, $index, 0), "^.*\.", ".$1")
	  $OutFile = $OutName & $OutExt

	  If Not $OutExt Or _GUICtrlListView_GetItemCount( $cList) < '2' Then
		 GUICtrlSetState( $idBtnFusion, $GUI_DISABLE)
		 GUICtrlSetData( $idBtnFusion, "Pas de fichier selctionné, minimum 2 fichiers pour fusionner")
	  Else
		 GUICtrlSetState( $idBtnFusion, $GUI_ENABLE)
		 GUICtrlSetData( $idBtnFusion, $BtnName2 & " (" & $OutFile & ")")
	  EndIf

	  ;ConsoleWrite(">>>>>>>>>>> " & _GUICtrlListView_GetItemText( $cList, $index, 0) & @CRLF)
   EndIf

   Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Func _Quit()
   ConsoleWrite("Line=" & @ScriptLineNumber & @TAB & "Func _Quit()" & @CRLF)
   _GUIListViewEx_Close( $iList)
   Exit
EndFunc
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2090
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#9

Message par TommyDDR »

Pour info, j'avais fait un UDF _GUIRegisterMsg() qui permet de faire un GUIRegisterMsg plusieurs fois sur un même message :
viewtopic.php?f=21&t=6873&hilit=guiregistermsg
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
Anthony
Niveau 7
Niveau 7
Messages : 301
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

[R] Conflit GUIRegisterMsg $WM_DROPFILES et $WM_NOTIFY

#10

Message par Anthony »

Bonjour walkson, Nine, TommyDDR,

Merci à vous trois, tout fonctionne.
Je vais pouvoir travailler plus rapidement avec ma CNC 3018 Pro.
Je vais gagner un temps fou grâce aux étapes fusionnées sur un seul programme. :bisou:
Je rajoute dans ma signature le lien vers cette solution :wink:

PS: TommyDDR je regarde çà.....................
Code-Texte fusion.au3
(9.69 Kio) Téléchargé 3 fois
GUIListViewEx: Melba23 https://www.autoitscript.com/forum/topi ... -6-apr-24/
► Afficher le texte
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.
UDF: GuiStatusBarEx --- Une StatusBar complète, rapide et simple
Code: Code-Texte fusion --- Une GUI pour fusionner des GCodes pour CNC 3018
Répondre