Что нового

[Элементы GUI] Как сделать drag'n'drop файла на форму

belotooth

Новичок
Сообщения
7
Репутация
0
Подскажите, как сделать, чтобы можно было кинуть файл прямо на форму и обработать это.

Установка $GUI_DROPACCEPTED для формы естественно не работает.

Сделал тут небольшой костыль, но теперь невозможно добраться до контролов.

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("Form", 300, 200,  -1, -1, $WS_OVERLAPPEDWINDOW, $WS_EX_ACCEPTFILES + $WS_EX_CONTROLPARENT)
GUICtrlCreateLabel("", 0, 0, 300, 200, -1, $GUI_WS_EX_PARENTDRAG) 
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$input1 = GUICtrlCreateInput("", 20, 30, 260, 30) 
$input2 = GUICtrlCreateInput("", 20, 90, 260, 30)
$button1 = GUICtrlCreateButton("Button", 110, 150, 80, 30) 
GUISetState()

Do
	$msg = GUIGetMsg()
	Select
	Case $msg = $GUI_EVENT_DROPPED
		GUICtrlSetData($input1, @GUI_DRAGFILE) 
	EndSelect
    Until $msg = $GUI_EVENT_CLOSE
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
belotooth,
Введите в поиск @GUI_DRAGFILE, на форуме есть примеры.
 
Автор
B

belotooth

Новичок
Сообщения
7
Репутация
0
Введите в поиск @GUI_DRAGFILE, на форуме есть примеры.
Я находил несколько вариантов, типа: drag на кнопку, на image и замудренные варианты с WinAPI.

А стандартными средствами решить проблему можно?
 
Автор
B

belotooth

Новичок
Сообщения
7
Репутация
0
AZJIO
Там замудренный вариант с WinAPI :smile:

Допилил свой код. Теперь вроде работает Работает, но при кидании нескольких файлов отображается только последний. Неужели без WinAPI не обойтись?

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("Form", 300, 200,  -1, -1, $WS_OVERLAPPEDWINDOW, $WS_EX_ACCEPTFILES + $WS_EX_CONTROLPARENT)
GUICtrlCreateLabel("", 0, 0, 300, 200, -1, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetState(-1, $GUI_DISABLE + $GUI_DROPACCEPTED)
$input1 = GUICtrlCreateInput("", 20, 30, 260, 30)
$input2 = GUICtrlCreateInput("", 20, 90, 260, 30)
$button1 = GUICtrlCreateButton("Button", 110, 150, 80, 30)
GUISetState()

Do
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_DROPPED
        GUICtrlSetData($input1, @GUI_DRAGFILE)
    EndSelect
    Until $msg = $GUI_EVENT_CLOSE
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
belotooth
А где именно там WinAPI? Не считая что сам автоит построен на вызовах WinAPI...


belotooth [?]
Работает, но при кидании нескольких файлов отображается только последний
Несколько файлов может принимать Input (GUICtrlCreateInput) и Edit (GUICtrlCreateEdit)

Я конечно могу предложить поковырять Search_duplicates, но не хочется в ответ опять услышать что код сложный...
Делай тогда сам, идея была такова: фэйс содержит подложку в виде Input, когда кидаешь файлы GUI получает сообщение о действии и Input скрывается за пределами окна, дабы в фэйсе не появился список файлов, за пределами GUI с него считываются пути и Input очищается и возвращается на своё место, а с путями делаешь что требуется.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
belotooth,
Посмотрите еще в справке WinAPIEx.au3 пример к функции _WinAPI_DragAcceptFiles().
 
Автор
B

belotooth

Новичок
Сообщения
7
Репутация
0
Честно говоря, я немного удивился когда не нашел в автоит то что мне нужно. И просто хотел узнать, может я не понял как это включить и не использовать костыли. :smile:

Речь видимо не про твой пример, а тот что выше, во втором сообщений темы.
Да я имел в виду этот пример и мне интересно его можно использовать прямо так или нужны изменения?

madmasles
Спасибо, будет время обязательно посмотрю.
 
Верх