Что нового

[Файловая система] Как корректно найти иконку файла ?

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
gregaz, у тебя в реестре, скорее всего, прописан ActiveX (IPreviewHandler или что-то подобное) для .html файлов, отсюда и "%1". Естественно, никаких иконок в .html нет, да и не используется параметр "DefaultIcon". Поэтому, вообщем-то, по барабану, что там написано: "%1" или что-то другое.

А зачем тебе вообще понадобилось столь скурпулезное извлечение иконок? Советую просто забить на это.

:smile:
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
Иконка не отображается на кнопке в моём примере?
Не отображается.
Попробуй заменить $sFile на -1.
Теперь выдала нормально.
Yashied [?]
А зачем тебе вообще понадобилось столь скурпулезное извлечение иконок? Советую просто забить на это.

В скрипте присутствет дерево файлов.
Поскольку скрипт будет использоваться на разных компьютерах, хотелось бы иметь корректное отображение их иконок.

Хотя чуствую-это неблагодарное дело.
Почему-то иконки от "shell32.dll" в TreeView и на кнопке отображаются некорректнопо разному.
Для сравнения :
Код:
#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <GuiTreeView.au3>

$GUI=GUICreate("Get File/Folder Type & Icon", 300, 350)

$hTreeView = GUICtrlCreateTreeView(10, 10, 100, 50)
$hItem= GUICtrlCreateTreeViewItem(1, $hTreeView)

$but=GUICtrlCreateButton("", 10, 60, 36, 36, $BS_ICON)
$sIcon="shell32.dll"

 GUISetState()

_GUICtrlTreeView_SetIcon($hTreeView, $hItem, $sIcon,152) ;Надо  установить  -152
GUICtrlSetImage($but, $sIcon, 152)
MsgBox(0,152,'Текстовый документ')

For $i=0 To 20
   _GUICtrlTreeView_SetIcon($hTreeView, $hItem, $sIcon,$i)
   GUICtrlSetImage($but, $sIcon, $i)
   MsgBox(0,$i,'')
Next 

While GUIGetMsg() <> -3
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я рекомендую использовать хендлы, но в любом случае, индексы иконок задаются следующим образом (в зависимости от знака):

API

"+" - индекс (порядковый номер) иконки в файле, начиная с нуля (0 - первая иконка).
"-" - название ресурса иконки, например "-152" указывает на иконку с идентификатором ресурса 152.

Например, если в ресурсах имеет место быть такая картина (скомпилированный AutoIt скрипт):

99
162
164
169

то, следующие записи индексов для вызова соответствующих API функций будут эквивалентны:

"-99" ~ "0"
"-162" ~ "1"
"-164" ~ "2"
"-169" ~ "3"

Т.е. можно записать или "-99", или "0", разницы не будет. Заметьте, что в большинстве случаев, иконки для "shell32.dll" в реестре задаются не по порядковому номеру, а именно по названию ресурса (знак "-"), т.к. индекс в следующих версиях системных DLL может измениться, а название ресурса, видимо, должно остаться неизменным.

AutoIt

Здесь полная жо**. Положительные числа ("+") означают не индекс, как в API, а названия ресурса иконки. А вот отрицательные ("-") указывают на индекс, причем первая иконка в файле имеет индекс 1, а не 0, как в API. Более того, если указать "-1" (по логике, это должно указывать именно на первую иконку), то ничего хорошего из этого не выйдет. Т.е. первая иконка задается как "0", а все последующие уже "-2", "-3" и т.д.

:Censored:

Предыдущий пример для AutoIt будет выглядеть так:

"99" ~ "0"
"162" ~ "-2"
"164" ~ "-3"
"169" ~ "-4"

Исходя из вышенаписанного, твой пример должен выглядеть так:

Код:
#include <GUIConstants.au3>
#include <ButtonConstants.au3>
#include <GuiTreeView.au3>

$GUI=GUICreate("Get File/Folder Type & Icon", 300, 350)

$hTreeView = GUICtrlCreateTreeView(10, 10, 100, 50)
$hItem= GUICtrlCreateTreeViewItem(1, $hTreeView)

$but=GUICtrlCreateButton("", 10, 60, 36, 36, $BS_ICON)
$sIcon="shell32.dll"

 GUISetState()

_GUICtrlTreeView_SetIcon($hTreeView, $hItem, $sIcon, -152) ; "-" - ID ресурса иконки "152"
GUICtrlSetImage($but, $sIcon, 152) ; "+" - ID ресурса иконки "152"
MsgBox(0, 152, "Текстовый документ")

For $i = 0 To 20
   _GUICtrlTreeView_SetIcon($hTreeView, $hItem, $sIcon, $i) ; "+" - Индекс иконки в файле (0, 1, 2, ... 20)
   GUICtrlSetImage($but, $sIcon, -($i + ($i > 0))) ; "-" - Индекс иконки в файле (0, -2, -3, ... -21)
   MsgBox(0, $i, "")
Next

While GUIGetMsg() <> -3
WEnd
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Yashied,спасибо.
Вроде становится понятна причина разницы отображения иконок.
Похоже надо пока отложить эту тему и пойти почитать FAQ по использованию ресурсов.
:( :beer:
 
Верх