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.
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:
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...