Что нового

Перетащить файл в GUI

Alexander

Новичок
Сообщения
105
Репутация
2
Как перетащить файл в определенное место GUI и программа прочитала полный путь на этот файл и сделала определенное действие с ним.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот пример:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global Const $WM_DROPFILES = 0x233
Global $gaDropFiles[1]

$hGUI = GUICreate("", 137, 131, -1, -1, BitOR($WS_DLGFRAME,$WS_POPUP,$WS_CLIPSIBLINGS), BitOR($WS_EX_ACCEPTFILES,$WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
GUISetBkColor(0xFFFFFF)
$hList = GUICtrlCreateLabel("Drop files here", 0, 0, 135, 121, BitOR($SS_CENTER,$SS_CENTERIMAGE), $GUI_WS_EX_PARENTDRAG)
GUICtrlSetState ($hList, $GUI_DROPACCEPTED)
$hContext = GUICtrlCreateContextMenu($hList)
$hExit = GUICtrlCreateMenuItem("Exit", $hContext)

GUIRegisterMsg ($WM_DROPFILES, "WM_DROPFILES_FUNC")
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $hExit
            Exit
        Case $GUI_EVENT_DROPPED
            For $i = 0 To UBound($gaDropFiles) - 1
                MsgBox(0, '', $gaDropFiles[$i], 0, $hGUI)
            Next
    EndSwitch
WEnd

Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        ReDim $gaDropFiles[$i+1]
        $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
        $pFileName = 0
    Next
EndFunc
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Zaramot
Спасибо большое! То, что нужно! :beer:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3> 

$Gui = GUICreate("Проверка drag-and-drop",  420, 200, -1, -1, -1, $WS_EX_ACCEPTFILES) ; стиль drag-and-drop, (0x00000010)

$CatchDrop = GUICtrlCreateLabel("", 0, 0, 420, 40) ; создаём область Label, первым элементом, чтоб не перекрывать остальные, размер можно указать на всё окно
GUICtrlSetState(-1, $GUI_DISABLE + $GUI_DROPACCEPTED) ; устанавливаем параметры области - скрытая и drag-and-drop (128+8)

GUICtrlCreateLabel ("используйте drag-and-drop", 120,3,200,18)

$Label1 = GUICtrlCreateLabel("Путь 1", 24, 40, 186, 17)
$Input1 = GUICtrlCreateInput("", 24, 57, 305, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; Input наделённый свойством drag-and-drop (8)
$folder1 = GUICtrlCreateButton("Обзор...", 344, 56, 57, 23)

$Label2 = GUICtrlCreateLabel("Путь 2", 24, 90, 186, 17)
$Input2 = GUICtrlCreateInput("", 24, 107, 305, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; Input наделённый свойством drag-and-drop (8)
$folder2 = GUICtrlCreateButton("Обзор...", 344, 106, 57, 23)

$Label3 = GUICtrlCreateLabel("Путь 3", 24, 140, 186, 17)
$Input3 = GUICtrlCreateInput("", 24, 157, 305, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; Input наделённый свойством drag-and-drop (8)
$folder3 = GUICtrlCreateButton("Обзор...", 344, 156, 57, 23)

GUISetState ()

	While 1
		$msg = GUIGetMsg()
		Select
			Case $msg =  $GUI_EVENT_DROPPED  ;событие приходящееся на drag-and-drop (-13)
				If @GUI_DropID=$Input1 Then GUICtrlSetData($Input1, @GUI_DRAGFILE)
				If @GUI_DropID=$Input2 Then GUICtrlSetData($Input2, @GUI_DRAGFILE)
				If @GUI_DropID=$Input3 Then GUICtrlSetData($Input3, @GUI_DRAGFILE)
				If @GUI_DropID=$CatchDrop Then MsgBox(0,"В область drag-and-drop попал файл", @GUI_DRAGFILE)
				; кнопки обзор
			Case $msg = $folder1
				$folder01 = FileOpenDialog("Указать файл", @WorkingDir & "", "Любой (*.*)", 1 + 4 )
				If @error Then ContinueLoop
				GUICtrlSetData($Input1, $folder01)
			Case $msg = $folder2
				$folder02 = FileOpenDialog("Указать файл", @WorkingDir & "", "Любой (*.*)", 1 + 4 )
				If @error Then ContinueLoop
				GUICtrlSetData($Input2, $folder02)
			Case $msg = $folder3
				$folder03 = FileOpenDialog("Указать файл", @WorkingDir & "", "Любой (*.*)", 1 + 4 )
				If @error Then ContinueLoop
				GUICtrlSetData($Input3, $folder03)
			Case $msg = $GUI_EVENT_CLOSE ; закрыть (-3)
				Exit
		EndSelect
	WEnd

#cs
Событие $GUI_EVENT_DROPPED можно удалить, но теряется универсальность. Если открыть путь кнопкой "Обзор..." и далее кинуть файл в Input, то пути складываются в одну строку последовательно. Именно $GUI_EVENT_DROPPED устраняет эту проблему установкой пути с помощью GUICtrlSetData.
#ce
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
AZJIO
А почему при #RequireAdmin оно не работает на Windows 7, Vista (работает только на ХР)?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Alexander
Кстати, помню этот глюк, и в некоторых программах приходилось добавлять кнопку "Открыть", так как кинуть в окно не удавалось. Тогда вопрос, точно ли из-за #RequireAdmin? У меня Icon_of_folder без #RequireAdmin, но на Win7 не работает drag-and-drop. И второй вопрос - работает ли пример Zaramot на Win7.
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
AZJIO
Проверил код Zaramot-а на Висте. Не работает, если добавить #RequireAdmin. То же самое и с этим кодом. Без #RequireAdmin все работает, только добавляю это и все...
Кое-что нашел по этой теме: http://www.autoitscript.com/forum/topic/124406-drag-and-drop-with-uac/
 
Верх