Что нового

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

SergVrn

Новичок
Сообщения
87
Репутация
2
Здравствуйте.
Нашел на форуме скрипт, на котором можно размещать ярлыки файлов.
Единственное что неудобно, эти ярлыки не закреплены на интерфейсе, а висят как бы в куче.
Если удалить самый верхний левый ярлык, то все остальные ярлыки тоже сдвинутся.

Как ярлыки закреплять "на сетке", то есть чтобы при перетаскивании - ярлык был закреплен на конкретной ячейке сетки - как на рабочем столе Windows ?

Код:
;~ AutoIt Version: 3.3.14.5
#pragma compile(Icon, 1.ico)

#include <file.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>

Global Const $INI_FILE = @ScriptDir & "\" & StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -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_aLVs[] = ["Первая", "Вторая", "..."], $g_idTab = GUICtrlCreateTab(5, 20, 390, 575)
For $iTab = 0 To UBound($g_aLVs) - 1
    GUICtrlCreateTabItem($g_aLVs[$iTab])
    $g_aLVs[$iTab] = GUICtrlCreateListView("Имя|Файл", 10, 45, 380, 545, -1, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_INFOTIP))
    GUICtrlSetStyle(-1, $LVS_ICON)
    _GUICtrlListView_SetImageList($g_aLVs[$iTab], _
            _GUIImageList_Create(_WinAPI_GetSystemMetrics($SM_CXICON), _WinAPI_GetSystemMetrics($SM_CYICON)))
    _LoadFiles($iTab)
Next
GUICtrlCreateTabItem("")
OnAutoItExitRegister("_SaveFiles")

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
        _AddFiles(GUICtrlRead($g_idTab), $aFiles)
        _WinAPI_DragFinish($wParam)
    EndIf
EndFunc   ;==>WM_DROPFILES

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $hLV, $hWndFrom, $iCode, $tNMHDR, $tInfo, $iIndex
    $hLV = GUICtrlGetHandle($g_aLVs[GUICtrlRead($g_idTab)])
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hLV
            Switch $iCode
                Case $NM_DBLCLK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then ShellExecute(_GUICtrlListView_GetItemText($hWndFrom, $iIndex, 1))
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then
                        _GUICtrlListView_DeleteItem($hWndFrom, $iIndex)
                        _GUICtrlListView_Arrange($hWndFrom, $LVA_ALIGNLEFT)
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _AddFiles($iTab, Const ByRef $aFiles)
    _GUICtrlListView_BeginUpdate($g_aLVs[$iTab])
    Local $hIcon, $iIndex, $hImageList = _GUICtrlListView_GetImageList($g_aLVs[$iTab], 0)
    For $i = 1 To $aFiles[0]
        $hIcon = _WinAPI_ShellExtractAssociatedIcon($aFiles[$i], False)
        $iIndex = _GUICtrlListView_AddItem($g_aLVs[$iTab], _WinAPI_PathRemoveExtension(_WinAPI_PathFindFileName($aFiles[$i])), _
                _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon))
        _GUICtrlListView_AddSubItem($g_aLVs[$iTab], $iIndex, $aFiles[$i], 1)
        _WinAPI_DestroyIcon($hIcon)
    Next
    _GUICtrlListView_EndUpdate($g_aLVs[$iTab])
EndFunc   ;==>_AddFiles

Func _LoadFiles($iTab)
    Local $sFiles = IniRead($INI_FILE, "Files", $iTab, "")
    If $sFiles Then _AddFiles($iTab, StringSplit($sFiles, "|"))
EndFunc   ;==>_LoadFiles

Func _SaveFiles()
    GUISetState(@SW_HIDE)
    Local $sFiles
    For $iTab = 0 To UBound($g_aLVs) - 1
        $sFiles = ""
        For $i = 0 To _GUICtrlListView_GetItemCount($g_aLVs[$iTab]) - 1
            $sFiles &= _GUICtrlListView_GetItemText($g_aLVs[$iTab], $i, 1) & "|"
        Next
        IniWrite($INI_FILE, "Files", $iTab, StringTrimRight($sFiles, 1))
    Next
EndFunc   ;==>_SaveFiles
 

Вложения

  • Скрипт.rar
    2 КБ · Просмотры: 2
Последнее редактирование:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Вот так не будут сдвигаться при удалении:
Код:
;~ AutoIt Version: 3.3.14.5
#pragma compile(Icon, 1.ico)

#include <file.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>

Global Const $INI_FILE = @ScriptDir & "\" & StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -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_aLVs[] = ["Первая", "Вторая", "..."], $g_idTab = GUICtrlCreateTab(5, 20, 390, 575)
For $iTab = 0 To UBound($g_aLVs) - 1
    GUICtrlCreateTabItem($g_aLVs[$iTab])
    $g_aLVs[$iTab] = GUICtrlCreateListView("Имя|Файл", 10, 45, 380, 545, -1, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_INFOTIP))
    GUICtrlSetStyle(-1, $LVS_ICON)
    _GUICtrlListView_SetImageList($g_aLVs[$iTab], _
            _GUIImageList_Create(_WinAPI_GetSystemMetrics($SM_CXICON), _WinAPI_GetSystemMetrics($SM_CYICON)))
    _LoadFiles($iTab)
Next
GUICtrlCreateTabItem("")
OnAutoItExitRegister("_SaveFiles")

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
        _AddFiles(GUICtrlRead($g_idTab), $aFiles)
        _WinAPI_DragFinish($wParam)
    EndIf
EndFunc   ;==>WM_DROPFILES

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $hLV, $hWndFrom, $iCode, $tNMHDR, $tInfo, $iIndex
    $hLV = GUICtrlGetHandle($g_aLVs[GUICtrlRead($g_idTab)])
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hLV
            Switch $iCode
                Case $NM_DBLCLK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then ShellExecute(_GUICtrlListView_GetItemText($hWndFrom, $iIndex, 1))
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then
                        _GUICtrlListView_DeleteItem($hWndFrom, $iIndex)
                        ;_GUICtrlListView_Arrange($hWndFrom, $LVA_ALIGNLEFT)
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _AddFiles($iTab, Const ByRef $aFiles)
    _GUICtrlListView_BeginUpdate($g_aLVs[$iTab])
    Local $hIcon, $iIndex, $hImageList = _GUICtrlListView_GetImageList($g_aLVs[$iTab], 0)
    For $i = 1 To $aFiles[0]
        $hIcon = _WinAPI_ShellExtractAssociatedIcon($aFiles[$i], False)
        $iIndex = _GUICtrlListView_AddItem($g_aLVs[$iTab], _WinAPI_PathRemoveExtension(_WinAPI_PathFindFileName($aFiles[$i])), _
                _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon))
        _GUICtrlListView_AddSubItem($g_aLVs[$iTab], $iIndex, $aFiles[$i], 1)
        _WinAPI_DestroyIcon($hIcon)
    Next
    _GUICtrlListView_EndUpdate($g_aLVs[$iTab])
EndFunc   ;==>_AddFiles

Func _LoadFiles($iTab)
    Local $sFiles = IniRead($INI_FILE, "Files", $iTab, "")
    If $sFiles Then _AddFiles($iTab, StringSplit($sFiles, "|"))
EndFunc   ;==>_LoadFiles

Func _SaveFiles()
    GUISetState(@SW_HIDE)
    Local $sFiles
    For $iTab = 0 To UBound($g_aLVs) - 1
        $sFiles = ""
        For $i = 0 To _GUICtrlListView_GetItemCount($g_aLVs[$iTab]) - 1
            $sFiles &= _GUICtrlListView_GetItemText($g_aLVs[$iTab], $i, 1) & "|"
        Next
        IniWrite($INI_FILE, "Files", $iTab, StringTrimRight($sFiles, 1))
    Next
EndFunc   ;==>_SaveFiles
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
ra4o
но так ярлыки все равно оказываются не закреплены как нужно - то есть по сетке.
Если удалить один из ярлыков, то возникнет пустое место. Но при заполнении другими ярлыками - они будут размещены не там где я их размещу, а в том самом пустом месте, откуда недавно был удален ярлык.

То есть ярлыки все равно не закрепляются, но уже при заполнении.
Под закреплением я имею ввиду - закрепление "по сетке".
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
ra4o
Ясно.
Но ярлыки по-прежнему смещаются - не при удалении, так при размещении.
Его размещаешь в одном место, а он улетает в самое начало.

Сетка нужна, чтобы ярлык размещался там - куда его положили. Иначе просто сложно следить за ним, особенно если таких ярлыков много.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Может как-то так.
Код:
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>

Global $aIcinMetric[2], $aLVPos[2] = [10, 45]
Global Const $INI_FILE = @ScriptDir & "\" & StringLeft(@ScriptName, StringInStr(@ScriptName, ".", 0, -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_aLVs[] = ["Первая", "Вторая", "..."], $g_idTab = GUICtrlCreateTab(5, 20, 390, 575)
For $iTab = 0 To UBound($g_aLVs) - 1
    GUICtrlCreateTabItem($g_aLVs[$iTab])
    $g_aLVs[$iTab] = GUICtrlCreateListView("Имя|Файл", $aLVPos[0], $aLVPos[1], 380, 545, _
            BitOR($LVS_ICON, $LVS_SINGLESEL), _
            BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_INFOTIP, $LVS_EX_SNAPTOGRID))
    GUICtrlSetStyle(-1, $LVS_ICON)
    $aIcinMetric[0] = _WinAPI_GetSystemMetrics($SM_CXICON)
    $aIcinMetric[1] = _WinAPI_GetSystemMetrics($SM_CYICON)
    _GUICtrlListView_SetImageList($g_aLVs[$iTab], _GUIImageList_Create($aIcinMetric[0], $aIcinMetric[1]))
    _LoadFiles($iTab)
Next
GUICtrlCreateTabItem("")
OnAutoItExitRegister("_SaveFiles")

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 $iX, $iY, $tPoint, $aFiles = _WinAPI_DragQueryFileEx($wParam)
    If Not @error Then
        Local $tPoint = DllStructCreate('int X;int Y')
        DllCall('shell32.dll', 'int', 'DragQueryPoint', 'int', $wParam, 'ptr', DllStructGetPtr($tPoint))
        $iX = DllStructGetData($tPoint, 'X') - $aLVPos[0] - $aIcinMetric[0]
        $iY = DllStructGetData($tPoint, 'Y') - $aLVPos[1] - $aIcinMetric[1]
        _AddFiles(GUICtrlRead($g_idTab), $aFiles, $iX, $iY)
        _WinAPI_DragFinish($wParam)
    EndIf
EndFunc   ;==>WM_DROPFILES

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $hLV, $hWndFrom, $iCode, $tNMHDR, $tInfo, $iIndex
    $hLV = GUICtrlGetHandle($g_aLVs[GUICtrlRead($g_idTab)])
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hLV
            Switch $iCode
                Case $NM_DBLCLK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then ShellExecute(_GUICtrlListView_GetItemText($hWndFrom, $iIndex, 1))
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndex = DllStructGetData($tInfo, "Index")
                    If $iIndex <> -1 Then
                        _GUICtrlListView_DeleteItem($hWndFrom, $iIndex)
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _AddFiles($iTab, $aFiles, $iX = 0, $iY = 0, $iIni = 0)
    _GUICtrlListView_BeginUpdate($g_aLVs[$iTab])
    Local $hIcon, $iIndex, $hImageList = _GUICtrlListView_GetImageList($g_aLVs[$iTab], 0)

    For $i = 1 To $aFiles[0]
        If $iIni Then
            $aArray = StringSplit($aFiles[$i], '>', 2)
            If UBound($aArray) = 3 Then
                $aFiles[$i] = $aArray[0]
                $iX = $aArray[1]
                $iY = $aArray[2]
            EndIf
        EndIf

        $hIcon = _WinAPI_ShellExtractAssociatedIcon($aFiles[$i], False)
        $iIndex = _GUICtrlListView_AddItem($g_aLVs[$iTab], _WinAPI_PathRemoveExtension(_WinAPI_PathFindFileName($aFiles[$i])), _
                _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon))
        _GUICtrlListView_AddSubItem($g_aLVs[$iTab], $iIndex, $aFiles[$i], 1)
        _WinAPI_DestroyIcon($hIcon)

        If $iX Or $iIni Then _GUICtrlListView_SetItemPosition($g_aLVs[$iTab], $iIndex, $iX, $iY)
    Next
    _GUICtrlListView_EndUpdate($g_aLVs[$iTab])
EndFunc   ;==>_AddFiles

Func _LoadFiles($iTab)
    Local $sFiles = IniRead($INI_FILE, "Files", $iTab, "")
    If $sFiles Then _AddFiles($iTab, StringSplit($sFiles, "|"), 0, 0, 1)
EndFunc   ;==>_LoadFiles

Func _SaveFiles()
    GUISetState(@SW_HIDE)
    Local $sFiles, $aPos
    For $iTab = 0 To UBound($g_aLVs) - 1
        $sFiles = ""
        For $i = 0 To _GUICtrlListView_GetItemCount($g_aLVs[$iTab]) - 1
            $aPos = _GUICtrlListView_GetItemPosition($g_aLVs[$iTab], $i)
            $sFiles &= _GUICtrlListView_GetItemText($g_aLVs[$iTab], $i, 1) & '>' & $aPos[0] & '>' & $aPos[1] & '|'
        Next
        IniWrite($INI_FILE, "Files", $iTab, StringTrimRight($sFiles, 1))
    Next
EndFunc   ;==>_SaveFiles
 
Верх