Что нового

Как в окне программы отобразить иконку которая в данный момент весит на папке

assch

Новичок
Сообщения
166
Репутация
4
Когда открываешь проводник файлы там отображаются со своими иконками
Отображение иконок под конкретный файл проводник берёт наверное из реестра
где прописано что под это расширение ставится определённая иконка
Там же отображаются папки как правило со стандартными иконками (например в виде жёлтых папочек)
Но есть возможность изменить вид этой папки (подставив например для какой нибудь папки свою иконку)
И проводник будет отображать эту папку уже с изменённой (не стандартной) иконкой

Вопрос: Откуда именно проводник берёт информацию для отображения папок
(В данном случае именно той папки у которой изменили стандартный вид)
В реестре?
В кеше иконок?

Это нужно для того чтобы при перетаскивании папки в окно программы
Помимо названия этой папки отобразилась (в окне программы) и её иконка
Ну с названием это понятно а вот как сделать чтобы отобразилась именно та иконка
которая забита на эту папку?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Файл desktop.ini в корне соответсвующего каталога.
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Большое спасибо SyDr
Эта информация у изменённой папки
А не подскажешь откуда проводник берёт информацию о иконке простой не изменённой папке (Ведь там файла desktop.ini нет)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
assch сказал(а):
А не подскажешь откуда проводник берёт информацию о иконке простой не изменённой папке...
"HKEY_CLASSES_ROOT\Folder\DefaultIcon"

:-\

Но лучше сделать так (универсальный способ):

Код:
#Include <WinAPIEx.au3>

$Path = @FavoritesDir

$tSHFILEINFO = DllStructCreate($tagSHFILEINFO)
_WinAPI_ShellGetFileInfo($Path, $SHGFI_ICONLOCATION, 0, $tSHFILEINFO)
$Icon = DllStructGetData($tSHFILEINFO, 'DisplayName')
$Index = DllStructGetData($tSHFILEINFO, 'iIcon')

GUICreate('MyGUI', 256, 256)
GUICtrlCreateIcon($Icon, -($Index + ($Index > -1)), 64, 64, 128, 128)
GUISetState()

Do
Until GUIGetMsg() = -3
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Yashied
Большое спасибо за идеальный совет
:IL_AutoIt_1:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied
Изящно!!! :thumbs_up: :IL_AutoIt_1:
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Просто ради интереса выдернул функцию из библиотеки.
Так сказать для облегчения кода.
Чтобы компилятор не зачитывался лишней информацией.

Код:
Global Const $SHGFI_ICONLOCATION = 0x00001000
Global Const $tagSHFILEINFO = 'ptr hIcon;int iIcon;dword Attributes;wchar DisplayName[260];wchar TypeName[80];'

$Path = @FavoritesDir

$tSHFILEINFO = DllStructCreate($tagSHFILEINFO)
_WinAPI_ShellGetFileInfo($Path, $SHGFI_ICONLOCATION, 0, $tSHFILEINFO)
$Icon = DllStructGetData($tSHFILEINFO, 'DisplayName')
$Index = DllStructGetData($tSHFILEINFO, 'iIcon')

GUICreate('MyGUI', 200, 200)
GUICtrlCreateIcon($Icon, -($Index + ($Index > -1)), 10, 10, 128, 128)
GUISetState()

Do
Until GUIGetMsg() = -3


Func _WinAPI_ShellGetFileInfo($sPath, $iFlags, $iAttributes, ByRef $tSHFILEINFO)

	Local $Ret = DllCall('shell32.dll', 'dword_ptr', 'SHGetFileInfoW', 'wstr', $sPath, 'dword', $iAttributes, 'ptr', DllStructGetPtr($tSHFILEINFO), 'uint', DllStructGetSize($tSHFILEINFO), 'uint', $iFlags)

	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[0]
EndFunc
 
Верх