Le drag and drop

 

 

On va surtout s'intérésser ici à la réception de fichiers déposées par l'utilisateur sur une fenêtre donc la phase drop:

Pour qu'une fenêtre puisse recevoir le nom d'un fichier par drag and drop, il faut tout d'abord indiquer à Windows que celle-ci est autorisée à traiter cet évènement:

VOID DragAcceptFiles(
HWND hWnd,
BOOL fAccept
);

Les paramètres:

hWnd Handle sur une window qui va accepter les fichiers droppés.
fAccept à TRUE pour accepter les fichiers droppés, FALSE sinon.

Ceci va permettre de traiter un nouveau message dans la procédure de gestion des messages de la fenêtre:

WM_DROPFILES avec wParam contenant un handle de type HDROP qui pointe sur une structure contenant une liste de fichiers droppés

Il ne nous reste alors plus qu'à obtenir la liste des fichiers qui a été placé sur cette fenêtre:

UINT DragQueryFile(
HDROP hDrop,
UINT iFile,
LPTSTR lpszFile,
UINT cch
);

Les paramètres:

hDrop : Handle sur la structure contenant la liste des fichiers droppés.
iFile : Index dans la structure permettant de se positionner sur un élément de la structure contenant un nom de fichier droppé.

Si la valeur est 0xFFFFFFFF, la fonction DragQueryFile () va retourner le nombre de fichiers droppés. Sinon, cette valeur varie entre 0 et le nombre total de fichiers droppés - 1 (on démarre à 0 !!!) pour se positionner suivant cette valeur sur un élément de la structure.

lpszFile pointeur sur une adresse d'un buffer qui va recevoir le nom d'un fichier droppé, ce nom correspondant au nom trouvé sur l'élément n° iFile de la structure.

Si ce pointeur est NULL, la fonction retournera alors la taille qu'occupe en caractère le nom du fichier (Le caractère NULL n'est pas compris dans cette taille).

cch : On indique ici le nombre maximum de caractères que peut recevoir la chaîne.

En sortie: La valeur correspond au nombre de caractères effectivement copié dans la chaîne si iFile est différent de 0xFFFFFFFF et si lpszFile n'est pas NULL.

Sinon, ce sera une valeur correspondant aux paramètres passés ci-dessus.

 

Image non trouvée ! D'après Microsoft, pour Windows 95/98/Me, il faut ajouter certains fichiers pour pouvoir utiliser cette fonction. Jamais testé sur ces systèmes, je n'en sais pas plus.

 

Le transfert entre les deux applications des noms de fichiers consomme forcement de la place en mémoire. Il faut donc la libérer:

VOID DragFinish(
HDROP hDrop
);

Le paramètre est:

hDrop : Handle sur la structure contenant la liste des fichiers droppés.

 

Voici un exemple de lecture de ces informations:

Image non trouvée !

Le programme ouvre une fenêtre (il n'y a rien dedans...). Il suffit alors d'ouvrir un explorer et de choisir des fichiers et de les glisser sur la fenêtre du programme. Il affichera alors le nombre de fichiers choisis et la liste de ces fichiers.

 

Annexes

Lire, écrire et gérer les fichiers...