Обработка Drag'n'Drop в разные поля ввода
В статье об обработке перетаскивания файлов я упомянул про раздельную обработку перетаскивания файлов в разные поля. В частности про вариант с субклассированием. Теперь расскажу, как это делается. Предположим, что у нас на форме есть три поля для выбора файла, причем каждое должно работать независимо.Code (Assembler) : Убрать нумерацию
- ; Разрешить каждому полю принимать файлы
- invoke GetDlgItem,[hwnddlg],ID_FILE1
- mov ebx,eax
- invoke DragAcceptFiles,ebx,TRUE
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
- invoke GetDlgItem,[hwnddlg],ID_FILE2
- mov ebx,eax
- invoke DragAcceptFiles,ebx,TRUE
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
- invoke GetDlgItem,[hwnddlg],ID_FILE3
- mov ebx,eax
- invoke DragAcceptFiles,ebx,TRUE
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
Теперь обработчик. Про субклассирование во всех вариантах на этом сайте уже есть не меньше десятка статей, эта технология должна быть вам хорошо известна. При получении сообщения WM_DROPFILES вызываем DragQueryFile и узнаем имя переданного файла, а затем освобождаем задействованные ресурсы.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------------------
- ; Субклассированный обработчик полей ввода
- ;------------------------------------------------------------------------
- proc EditWindowProc hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
- ; Перетаскивание файла?
- cmp [uMsg],WM_DROPFILES
- je .wm_drop
- ; Получить адрес предыдущего обработчика
- invoke GetWindowLong,[hEdit],GWL_USERDATA
- ; Передать управление предыдущему обработчику
- invoke CallWindowProc,eax,[hEdit],[uMsg],[wParam],[lParam]
- ret
- .wm_drop:
- ; Принять файл
- invoke DragQueryFile,[wParam],0,fname,100h
- invoke SetWindowText,[hEdit],fname
- ; Освободить дескриптор операции
- invoke DragFinish,[wParam]
- xor eax,eax
- ret
- endp
Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- pt POINT
- pos RECT
- ...
- ...
- section '.code' code readable executable
- ...
- ; Принять файл
- invoke DragQueryFile,[wparam],0,fname,MAX_PATH
- ; Получить координаты операции
- invoke DragQueryPoint,[wparam],pt
- ; Проверить по координатам элемента окна
- invoke GetDlgItem,[hwnddlg],ID_FILE1
- invoke GetWindowRect,eax,pos
- invoke MapWindowPoints,HWND_DESKTOP,[hwnddlg],pos,2
- invoke PtInRect,pos,[pt.x],[pt.y]
- or eax,eax
- jz @f
- invoke SetDlgItemText,[hwnddlg],ID_FILE1,fname
- jmp loc_done
- @@:
- invoke GetDlgItem,[hwnddlg],ID_FILE2
- invoke GetWindowRect,eax,pos
- invoke MapWindowPoints,HWND_DESKTOP,[hwnddlg],pos,2
- invoke PtInRect,pos,[pt.x],[pt.y]
- or eax,eax
- jz @f
- invoke SetDlgItemText,[hwnddlg],ID_FILE2,fname
- jmp loc_done
- @@:
- invoke GetDlgItem,[hwnddlg],ID_FILE3
- invoke GetWindowRect,eax,pos
- invoke MapWindowPoints,HWND_DESKTOP,[hwnddlg],pos,2
- invoke PtInRect,pos,[pt.x],[pt.y]
- or eax,eax
- jz @f
- invoke SetDlgItemText,[hwnddlg],ID_FILE3,fname
- @@:
- loc_done:
- ; Освободить дескриптор операции
- invoke DragFinish,[wparam]
- ...
В приложении примеры программ с исходными текстами, которые могут принимать файлы через Drag'n'Drop описанными в статье способами в три независимых поля ввода.
Просмотров: 648 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Сергей Озеров
(16.05.2022 в 11:59):
Только увидел Ваш ответ, огромное спасибо!
ManHunter
(02.04.2022 в 16:58):
Да можно, конечно. Добавил способ с координатами, архив обновлен.
Сергей Озеров
(02.04.2022 в 16:26):
Как всегда спасибо за полезный код. А можно пример с координатами?Извините я еще учусь ))
Добавить комментарий
Заполните форму для добавления комментария