Что нового

Создание вкладок и сетки на GUI

Ragn

Новичок
Сообщения
48
Репутация
0
Доброго времени суток.
У меня есть вот такой код, который создает GUI - на которое можно перетаскивать ярлыки программ (а потом можно двойным щелчком их с этого окна запускать.

Как сделать заполнение этого GUI - не по столбцу - а по сетке ?
Иными словами, чтобы все окно разделено сеткой.
И как создать на этом окне - три вкладки (как в браузере), каждая из которых представляет собой область разделенной сеткой.


Сейчас код - вот такой:
Код:
;~ 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
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Автор
R

Ragn

Новичок
Сообщения
48
Репутация
0
Не получается.
Пытаюсь создать три вкладки в соответствии с примером.
Ошибки не выдается никакой, но и вкладки не создаются.

Видимо GUICtrlCreateTab как-то конфликтует с другими командами, которые встречаются в скрипте.
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>

Local $tab, $iCombo, $msg, $Gui

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)


GUISetBkColor(0xB4E1D3)
GUISetFont(9, 300)
$tab = GUICtrlCreateTab(10, 10, 380, 200)


GUICtrlCreateTabItem("Путь")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки
GUICtrlCreateTabItem("Выбор стиля")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки
GUICtrlCreateTabItem("?")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки
GUICtrlCreateTabItem("") ; определяет конец вкладок

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

 While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $tab
            ; отображает кликнутую вкладку
            WinSetTitle($Gui, "", "Вкладки (Tab) в GUI, текущая " & GUICtrlRead($tab))
        Case $iCombo
            GUICtrlSetStyle($tab, BitOR($GUI_SS_DEFAULT_TAB, Execute(GUICtrlRead($iCombo))))
    EndSwitch
 WEnd


А насчет размещения иконок - по сетке - из примера вообще непонятно как это сделать.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Видимо GUICtrlCreateTab как-то конфликтует с другими командами, которые встречаются в скрипте.
Исправьте координаты и размеры GUICtrlCreateTab, и еще GUICtrlCreateListView у вас создается вне вкладок

А насчет размещения иконок - по сетке - из примера вообще непонятно как это сделать.
В примечаниях к GUICtrlCreateListView написано как использовать стиль $LVS_ICON

Ваш цикл опроса GUI не работает, так как стоит уже после существующего цикла
 
Автор
R

Ragn

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

Насчет GUICtrlSetStyle - в примере справки - даже такой команды не приведено.
Поэтому непонятно, как должна в коде выглядеть фраза - "используйте после создания: GUICtrlSetStyle со стилями $LVS_ICON, $LVS_LIST или $LVS_SMALLICON. "

Я пытаюсь поставить так, как написано в инструкции:
Код:
GUICtrlSetStyle($tab, BitOR($GUI_SS_DEFAULT_TAB,$LVS_ICON, Execute(GUICtrlRead($iCombo))))

По-прежнему появляется список, а не Иконки расставленные по сетке.

Скрипт теперь такой:
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>

Local $tab, $iCombo, $msg, $Gui

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)


GUISetBkColor(0xB4E1D3)
GUISetFont(9, 300)
$tab = GUICtrlCreateTab(10, 22, 380, 570)


GUICtrlCreateTabItem("Путь")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки

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()


GUICtrlCreateTabItem("Выбор стиля")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки

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()

GUICtrlCreateTabItem("?")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки

GUICtrlCreateTabItem("") ; определяет конец вкладок
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

 While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $tab
            ; отображает кликнутую вкладку
            WinSetTitle($Gui, "", "Вкладки (Tab) в GUI, текущая " & GUICtrlRead($tab))
        Case $iCombo
            GUICtrlSetStyle($tab, BitOR($GUI_SS_DEFAULT_TAB,$LVS_ICON, Execute(GUICtrlRead($iCombo))))
    EndSwitch
 WEnd
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Но после того, как перейти на вкладку - на которой расположен GUICtrlCreateListView - все вкладки внезапно исчезают и остается один только GUICtrlCreateListView на все окно.
Может стоит и изменить координаты и размер GUICtrlCreateListView?

По-прежнему появляется список, а не Иконки расставленные по сетке.
Вам стоит построчно разобрать работу скрипта, и внимательно прочитать описание параметров к функции GUICtrlSetStyle и ко всем другим тоже
 
Автор
R

Ragn

Новичок
Сообщения
48
Репутация
0
Спасибо за ответ.
Изменил координаты и теперь вкладки отображаются как нужно.
Правда непонятно как подключать ini.
Получается, что тут будет три разных ini.
Как их включить в схему скрипта ?
Я попробовал использовать три разных _SaveFiles и _LoadFiles. Не помогает.

Насчет изучения функции GUICtrlSetStyle и GUICtrlCreateListView .
В инструкции написано:
Чтобы создать ListView с иконками или маленькими иконками или список-стиль просто используйте после создания:
GUICtrlSetStyle со стилями $LVS_ICON
Чтобы объединить стили со стилем по умолчанию используйте BitOR($GUI_SS_DEFAULT_LISTVIEW, новый стиль,...).
Чтобы использовать параметры, указанные выше, вы должны включить в ваш скрипт #include <ListViewConstants.au3>.

Я добавляю
<ListViewConstants.au3>
и изменяю строку на новую:
GUICtrlSetStyle($tab, BitOR($GUI_SS_DEFAULT_TAB,$LVS_ICON, Execute(GUICtrlRead($iCombo))))

Почему LVS_ICON не изменяет вид в GUICtrlCreateListView ?
Ведь в справке же написано, что должен измениться стиль отображения ?
Сообщение автоматически объединено:

Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <ListViewConstants.au3>

Local $tab, $iCombo, $msg, $Gui

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)


GUISetBkColor(0xB4E1D3)
GUISetFont(9, 300)
$tab = GUICtrlCreateTab(10, 22, 380, 570)


GUICtrlCreateTabItem("Путь")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки

Global $g_idLV = GUICtrlCreateListView("Файл", 10, 40, 360, 550, 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)
_LoadFiles1()

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


GUICtrlCreateTabItem("Выбор стиля")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки


Global $g_idLV = GUICtrlCreateListView("Файл", 10, 40, 360, 550, 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)
_LoadFiles2()

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

GUICtrlCreateTabItem("?")
GUICtrlSetImage(-1, "shell32.dll", -222, 0) ; иконка вкладки


Global $g_idLV = GUICtrlCreateListView("Файл", 10, 40, 360, 550, 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)
_LoadFiles3()

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

GUICtrlCreateTabItem("") ; определяет конец вкладок
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 _LoadFiles1()
    Local $iCount = Int(IniRead($INI_FILE, "Files", "Count", "0"))
    For $i = 0 To $iCount - 1
        _AddFile(IniRead($INI_FILE, "Files", $i, ""))
    Next
    OnAutoItExitRegister("_SaveFiles1")
 EndFunc   ;==>_LoadFiles

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

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


Func _SaveFiles1()
    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

 Func _SaveFiles2()
    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

 Func _SaveFiles3()
    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

 While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $tab
            ; отображает кликнутую вкладку
            WinSetTitle($Gui, "", "Вкладки (Tab) в GUI, текущая " & GUICtrlRead($tab))
        Case $iCombo
            GUICtrlSetStyle($tab, BitOR($GUI_SS_DEFAULT_TAB,$LVS_ICON, Execute(GUICtrlRead($iCombo))))
    EndSwitch
 WEnd
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Ведь в справке же написано, что должен измениться стиль отображения ?
Потому что вы применяете его к вкладке, а не списку. И вы неверно комбинируете стили

Я попробовал использовать три разных _SaveFiles и _LoadFiles. Не помогает.
Может стоит посмотреть как работают эти функции?
 
  • Like
Реакции: Norm

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Какой помощи вы хотите? Сделать все за вас? Хорошо, только не создавайте следующую тему для очередной правки этого кода в разделах где задают вопросы, без понимания того как он работает и попыток самостоятельно решить свой вопрос
Код:
;~ AutoIt Version: 3.3.14.5
#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
 
Автор
R

Ragn

Новичок
Сообщения
48
Репутация
0
Tempo, спасибо Вам огромное.
Сообщение автоматически объединено:

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