Что нового

Как поместить все иконки файла в ListView?

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Вопрос: как получить все индексы иконок в файлах (типа exe,dll,res...)
и поместить их (иконки) в ListView?

 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А что ты пытался уже сделать в этом направлении?
 
Автор
SECTOR

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Yashied сказал(а):
А что ты пытался уже сделать в этом направлении?
Пытался, но незнаю как извлечь все иконки...

Ну может я просто туплю?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUIListView.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Global Const $File = @SystemDir & '\shell32.dll'
Global Const $Width = 32
Global Const $Height = 32

$hForm = GUICreate('MyGUI', 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $WS_EX_COMPOSITED)

$hListView = _GUICtrlListView_Create($hForm, 'Item', 0, 0, 800, 600, BitOR($LVS_AUTOARRANGE, $LVS_ICON))
_GUICtrlListView_SetTextBkColor($hListView, $CLR_NONE)
_GUICtrlListView_SetBkColor($hListView, 0xD9FFEB)
$hImageList = _GUIImageList_Create($Width, $Height, 5, 1)
_GUICtrlListView_SetImageList($hListView, $hImageList)

$Index = 0
While 1
	$hIcon = _WinAPI_ShellExtractIcons($File, $Index, $Width, $Height)
	If @error Then
		ExitLoop
	EndIf
	_GUICtrlListView_InsertItem($hListView, $Index, $Index, $Index)
	_GUIImageList_ReplaceIcon($hImageList, -1, $hIcon)
	_WinAPI_FreeIcon($hIcon)
	$Index += 1
WEnd

GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)

	Local $Pos

	Switch $hWnd
		Case $hForm
			$Pos = WinGetClientSize($hForm)
			WinMove($hListView, '', 0, 0, $Pos[0], $Pos[1])
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE


Здесь $WS_EX_COMPOSITED и $WM_SIZE нужно только для того, чтобы избежать мерцаний при изменении размеров окна.
 
Автор
SECTOR

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Класс!!! Как я и хотел!!! Низкий поклон :smile:
:IL_AutoIt_1: :IL_AutoIt_1: :IL_AutoIt_1:

Здесь $WS_EX_COMPOSITED и $WM_SIZE нужно только для того, чтобы избежать мерцаний при изменении размеров окна.
То есть если размер окна не меняется, можно не регистрировать это?
 
Автор
SECTOR

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Тут появилась проблема: в списке отображаются порядковые номера, ведь если посмотреть в просмотрщике ресурсов, индексы у иконок совсем другие. Как это можно решить?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
SECTOR сказал(а):
Тут появилась проблема: в списке отображаются порядковые номера, ведь если посмотреть в просмотрщике ресурсов, индексы у иконок совсем другие. Как это можно решить?

Индексы у иконок всегда одинаковые - 0,1, 2,... (или отрицательные значения). А то, о чем ты говоришь, это не индексы, а названия ресурсов, и практической пользы (в большинстве случаев) от них никакой нет. Ну, если ты только не задумал написать редактор ресурсов...

Список всех названий ресурсов можно получить так:

Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>

$Data = _WinAPI_EnumResourceNames(@SystemDir & '\shell32.dll', $RT_GROUP_ICON)
_ArrayDisplay($Data)


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

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUIListView.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Global Const $File = @SystemDir & '\shell32.dll'
Global Const $Width = 32
Global Const $Height = 32

$hForm = GUICreate('MyGUI', 800, 600)

$hListView = _GUICtrlListView_Create($hForm, 'Item', 0, 0, 800, 600, BitOR($LVS_AUTOARRANGE, $LVS_ICON))
_GUICtrlListView_SetTextBkColor($hListView, $CLR_NONE)
_GUICtrlListView_SetBkColor($hListView, 0xD9FFEB)
$hImageList = _GUIImageList_Create($Width, $Height, 5, 1)
_GUICtrlListView_SetImageList($hListView, $hImageList)

$Name = _WinAPI_EnumResourceNames($File, $RT_GROUP_ICON)
For $i = 1 To $Name[0]
    $hIcon = _WinAPI_ShellExtractIcons($File, $i - 1, $Width, $Height)
    _GUICtrlListView_InsertItem($hListView, ($i - 1) & ' (' & $Name[$i] & ')', $i - 1, $i - 1)
    _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon)
    _WinAPI_FreeIcon($hIcon)
Next

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd



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

SECTOR сказал(а):
То есть если размер окна не меняется, можно не регистрировать это?

Да.
 
Верх