Обработка перетаскивания файлов (Drag'n'Drop)
Если в вашем приложении используется обработка файлов, то кроме открытия через стандартные диалоги выбора файла и каталога, можно получать их из Проводника Windows перетаскиванием. Обработка перетаскивания файлов выполняется в два этапа. При инициализации диалогового окна приложения должна вызываться функция DragAcceptFiles. Параметр функции TRUE разрешает принятие файлов окном, а FALSE его запрещает, так что прием файлов можно регулировать динамически. Непосредственно прием файлов окном выполняется функцией DragQueryFile.Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ...
- ; Инициализация окна
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- ; Обработка перетаскивания файлов
- cmp [msg],WM_DROPFILES
- je wmdropfiles
- ...
- wminitdialog:
- ; Разрешить окну принимать файлы
- invoke DragAcceptFiles,[hwnddlg],TRUE
- jmp processed
- wmdropfiles:
- ; Обработка полученных файлов. Функция DragQueryFile возвращает имя
- ; файла с указанным индексом (нумерация индексов начинается с нуля).
- ; Для получения общего количества переданных файлов ее надо вызвать с
- ; индексом равным 0FFFFFFFFh
- invoke DragQueryFile,[wparam],0FFFFFFFFh,NULL,NULL
- ; В регистре EAX количество переданных файлов
- ; Перебрать по очереди все переданные окну файлы
- xor ecx,ecx
- process_file:
- push ecx eax
- ; Получить имя файла или каталога в буфер fname
- invoke DragQueryFile,[wparam],ecx,fname,100h
- ...
- ; Тут будет обработчик переданных файлов и каталогов
- ...
- pop eax ecx
- inc ecx
- cmp ecx,eax
- jne process_file
- ; Освободить дескриптор операции
- invoke DragFinish,[wparam]
- ...
После выполнения всех необходимых действий с файлом, надо освободить память, выделенную под файлы, при помощи функции DragFinish.
В приложении примеры программ с исходными текстами, которые принимают через перетаскивание один и несколько файлов.
Просмотров: 5617 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(08.05.2021 в 19:55):
Добавил информацию по DragQueryPoint и DragFinish. Архив обновлен.
brute
(27.06.2014 в 10:25):
в других исходниках встречал вызов функции "DragFinish" для освобождения памяти после перетаскивания. Не знаю, насколько она необходима..
Добавить комментарий
Заполните форму для добавления комментария