Что нового

Как на графический интерфейс - перетаскивать ярлыки программ

Ragn

Новичок
Сообщения
48
Репутация
0
Здравствуйте.

У меня возник вопрос к специалистам, насчет возможностей графического интерфейса, созданного при помощи autoit.
Можно ли создать такой GUI, в котором на форму можно перетаскивать ярлыки программ (как на панель задач) ?
 

Glass4217

Знающий
Сообщения
55
Репутация
6
планируете потом запускать их из "гуя" или данные какие-то из этих ярлыков получать может просто иконки таким образом копировать?
 
Автор
R

Ragn

Новичок
Сообщения
48
Репутация
0
Glass4217
Именно, чтобы запускать программы - щелчками по этим размещенным ярлыкам.

(Просто такие программы как RocketDock или LimQuickPanel - для этого совершенно не годятся.)
 

Glass4217

Знающий
Сообщения
55
Репутация
6
Если у вас будет постоянный список программ, то куда проще реализовать просто кнопки с вызовом этих программ, обсуждались подобные задачи тут:
http://autoit-script.ru/index.php?topic=623.0
http://autoit-script.ru/index.php?topic=19787.0
http://autoit-script.ru/index.php?topic=15784.0
пример из первой темы
Код:
#include <GUIConstantsEx.au3>

$hParent = GUICreate('Test', 300, 300)
$button = GUICtrlCreateButton('Push me', 50, 50, 100, 30)
GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $button
            Run('notepad')
    EndSwitch
WEnd
 
Автор
R

Ragn

Новичок
Сообщения
48
Репутация
0
Glass4217
Нет - это вы создали обычную кнопку с формой.

Я спрашивал - как на эту форму - мышкой перетащить ярлык программы (как на панель задач).
Именно мышкой перетащить.
 

Tempo

Скриптер
Сообщения
568
Репутация
181
WM_DROPFILES

Пример
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>

Global Const $INI_FILE = StringLeft(@ScriptName, StringInStr(@ScriptName, ".") - 1) & ".ini"
GUICreate("Пример", 400, 600, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUICtrlCreateLabel("Drag && Drop / Двойной ЛКМ > Запустить / ПКМ > Удалить", 0, 0, 400, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetState(-1, $GUI_DISABLE)

Global $g_idLV = GUICtrlCreateListView("Файл", 10, 20, 380, 570, BitOR($LVS_DEFAULT, $LVS_NOSORTHEADER), $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($g_idLV, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_INFOTIP, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
_GUICtrlListView_SetColumnWidth($g_idLV, 0, $LVSCW_AUTOSIZE_USEHEADER)
Global $g_hImages = _GUIImageList_Create()
_GUICtrlListView_SetImageList($g_idLV, $g_hImages, 1)
_LoadFiles()

GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam)
	Local $aFiles = _WinAPI_DragQueryFileEx($wParam)
	If Not @error Then
		For $i = 1 To $aFiles[0]
			_AddFile($aFiles[$i])
		Next
		_WinAPI_DragFinish($wParam)
	EndIf
EndFunc   ;==>WM_DROPFILES

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $iIndex

	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $iIDFrom
		Case $g_idLV
			Switch $iCode
				Case $NM_DBLCLK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$iIndex = DllStructGetData($tInfo, "Index")
					If $iIndex <> -1 Then ShellExecute(_GUICtrlListView_GetItemText($hWndFrom, $iIndex))
				Case $NM_RCLICK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$iIndex = DllStructGetData($tInfo, "Index")
					If $iIndex <> -1 Then _GUICtrlListView_DeleteItem($hWndFrom, $iIndex)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _AddFile($sFile)
	Local $hIcon = _WinAPI_ShellExtractAssociatedIcon($sFile, 1)
	_GUICtrlListView_AddItem($g_idLV, $sFile, _GUIImageList_ReplaceIcon($g_hImages, -1, $hIcon))
	_WinAPI_DestroyIcon($hIcon)
EndFunc   ;==>_AddFile

Func _LoadFiles()
	Local $iCount = Int(IniRead($INI_FILE, "Files", "Count", "0"))
	For $i = 0 To $iCount - 1
		_AddFile(IniRead($INI_FILE, "Files", $i, ""))
	Next
	OnAutoItExitRegister("_SaveFiles")
EndFunc   ;==>_LoadFiles

Func _SaveFiles()
	Local $iCount = _GUICtrlListView_GetItemCount($g_idLV)
	IniWrite($INI_FILE, "Files", "Count", $iCount)
	For $i = 0 To $iCount - 1
		IniWrite($INI_FILE, "Files", $i, _GUICtrlListView_GetItemText($g_idLV, $i))
	Next
EndFunc   ;==>_SaveFiles


Добавлено:
Сообщение автоматически объединено:

WM_NOTIFY
 
  • Like
Реакции: Ragn
Верх