Blog. Just Blog

Обработка перетаскивания файлов (Drag'n'Drop)

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Если в вашем приложении используется обработка файлов, то кроме открытия через стандартные диалоги выбора файла и каталога, можно получать их из Проводника Windows перетаскиванием. Обработка перетаскивания файлов выполняется в два этапа. При инициализации диалогового окна приложения должна вызываться функция DragAcceptFiles. Параметр функции TRUE разрешает принятие файлов окном, а FALSE его запрещает, так что прием файлов можно регулировать динамически. Непосредственно прием файлов окном выполняется функцией DragQueryFile.
  1. ; Сегмент кода
  2. section '.code' code readable executable
  3.         ... 
  4. ; Процедура обработчика окна
  5. proc DialogProc hwnddlg,msg,wparam,lparam 
  6.         ...
  7.         ; Инициализация окна
  8.         cmp     [msg],WM_INITDIALOG
  9.         je      wminitdialog
  10.         ; Обработка перетаскивания файлов
  11.         cmp     [msg],WM_DROPFILES
  12.         je      wmdropfiles
  13.         ...
  14. wminitdialog:
  15.         ; Разрешить окну принимать файлы
  16.         invoke  DragAcceptFiles,[hwnddlg],TRUE
  17.         jmp     processed
  18.  
  19. wmdropfiles:
  20.         ; Обработка полученных файлов. Функция DragQueryFile возвращает имя
  21.         ; файла с указанным индексом (нумерация индексов начинается с нуля).
  22.         ; Для получения общего количества переданных файлов ее надо вызвать с
  23.         ; индексом равным 0FFFFFFFFh
  24.         invoke  DragQueryFile,[wparam],0FFFFFFFFh,NULL,NULL
  25.         ; В регистре EAX количество переданных файлов
  26.  
  27.         ; Перебрать по очереди все переданные окну файлы
  28.         xor     ecx,ecx
  29. process_file:
  30.         push    ecx eax
  31.         ; Получить имя файла или каталога в буфер fname
  32.         invoke  DragQueryFile,[wparam],ecx,fname,100h
  33.         ...
  34.         ; Тут будет обработчик переданных файлов и каталогов
  35.         ...
  36.         pop     eax ecx
  37.         inc     ecx
  38.         cmp     ecx,eax
  39.         jne     process_file
  40.  
  41.         ; Освободить дескриптор операции
  42.         invoke  DragFinish,[wparam]
  43.         ...
Если требуется получить только один файл, то запрашивать общее количество файлов не обязательно, достаточно вызвать DragQueryFile с нулевым индексом файла. Если в интерфейсе предусмотрено несколько полей для приема файлов, то может возникнуть необходимость определять, в какое именно поле выполнятся сброс файла. Делать это можно, например, через субклассирование, но есть способ проще. При помощи функции DragQueryPoint можно определять координаты точки внутри окна, на которых был выполнен бросок файла. Сравнив их с координатами полей ввода, легко определить, какому из них предназначался файл.

После выполнения всех необходимых действий с файлом, надо освободить память, выделенную под файлы, при помощи функции DragFinish.

В приложении примеры программ с исходными текстами, которые принимают через перетаскивание один и несколько файлов.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Drag.n.Drop.Demo.zip (4,518 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 4633 | Комментариев: 2

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (08.05.2021 в 19:55):
Добавил информацию по DragQueryPoint и DragFinish. Архив обновлен.
brute (27.06.2014 в 10:25):
в других исходниках встречал вызов функции "DragFinish" для освобождения памяти после перетаскивания. Не знаю, насколько она необходима..

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0047 сек.) / Память: 4.75 Mb
Наверх