· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› системный индекс иконки

Посл.отвђт Сообщенiе


Дата: Июл 30, 2004 06:03:28

Доброго времени всем. Хотел узнать, есть ли какая-нибудь альтернатива SHGetFileInfo ? Нужно получить системный индекс иконки файла, но SHGetFileInfo работает уж очень медленно (порядка 0.7 - 0.8 мс на одно обращение). В итоге более 90% времени заполнения листвью уходит на ожидание от SHGetFileInfo индекса иконки. ExtractAssociatedIcon в данном случае не помощник, т.к. она возвращает хэндл, а не индекс. А другого ничего не могу найти. Может кто знает, как заполучить эти индексы?


Дата: Июл 30, 2004 18:10:44


Дата: Июл 30, 2004 21:36:04

Four-F
Я видел это, но не помогает, увы...


Дата: Июл 30, 2004 21:57:02

А что такое "системный индекс"?


Дата: Июл 30, 2004 22:30:30


Дата: Июл 30, 2004 22:49:04

The Svin

Как бы это объяснить, ну вот кусок кода:
invoke SHGetFileInfo, addr szBuff1, 0, addr sfi, sizeof SHFILEINFO,SHGFI_SYSICONINDEX
mov eax, sfi.iIcon
mov lvi.iImage, eax

SHGFI_SYSICONINDEX
Retrieve the index of a system image list icon. If successful, the index is copied to the iIcon member of psfi. The return value is a handle to the system image list. Only those images whose indices are successfully copied to iIcon are valid. Attempting to access other images in the system image list will result in undefined behavior.
С хэндлом получаемым через ExtractIcon e.t.c. он ничего общего не имеет. Т.е. индекс, под которым иконка значится в системном имейдж листе. К примеру индекс иконки с изображением папки равен 9, индекс иконки с изображением текстового файла - 20. У каждого зарегистрированного в системе типа файла есть своя иконка для отображения в listview, treeview, и они (иконки) имеют свои индексы. Я так понял это дело.

bogrus

Счас буду смотреть, спасибо


Дата: Июл 30, 2004 23:01:18

bogrus

Да примерно та же проблема как и у Android
Долго получать индекс иконки.
Если не получать информацию сразу для всех итемов, а только для видимой части listview, то нужно обрабатывать сообщение LVN_GETDISPINFO и выдавать кусочками, при этом тормозов нет, т.к максимум нужно 10 вызовов SHGetFileInfo (по количеству видимых итемов). Да только вот не получилось у меня обработать LVN_GETDISPINFO. Запрос от listview приходит(номер итема, суб-итема) а указать запрашиваемые данные не получается.


Дата: Авг 2, 2004 03:41:51

cresta
Да только вот не получилось у меня обработать LVN_GETDISPINFO.
А зачем закрыл свою тему LVN_GETDISPINFO?
В коде из твоего последнего поста ошибка при проверке LVITEM.imask. Разве можно так делать
mov eax,[edi.LVITEM].imask
push eax
and eax,LVIF_PARAM
.if eax==1
...
pop eax
push eax
and eax,LVIF_IMAGE
.if eax==1
...
pop eax
and eax,LVIF_TEXT
.if eax==1
...
получается, что LVIF_PARAM == LVIF_IMAGE == LVIF_TEXT == 1. Можно так
.if dword ptr [edi.LVITEM].imask & LVIF_PARAM
...
.if dword ptr [edi.LVITEM].imask & LVIF_IMAGE
...
.if dword ptr [edi.LVITEM].imask & LVIF_TEXT
...
плюс перед заполнением LVITEM.pszText можно проверять для какого LVITEM.iSubItem запрошена строка и не заполнять его нулем.


Дата: Авг 2, 2004 11:25:57

q_q

Да потому и закрыл, что ни черта не получилось.
То, что ты предлагаешь : .if dword ptr [edi.LVITEM].imask & LVIF_TEXT тоже не работает. в Этом варианте я вообще не могу определить когда и о чем проходит запрос.
Если сделать так: LOCAL lvd :LV_DISPINFO и invoke MemCopy,lparam,addr lvd,sizeof lvd, то я уже могу видеть что и когда запрашивается, например lvd.item.iItem содержит номера строк. PrintDec lvd.item.iItem при перемещении мыши над листвью выводит номер строки, над которой мышь(т.е. номер итема для которого запрашивается инфа, возможно для хиттест или ещё для чего)
Тут же заполняю соответствующие lvd.item.pszText, для субитемов, которые означены в lvd.item.iSubItem, но ничего не отображается. Примера, чтобы разобраться, как действовать по LVN_GETDISPINFO нет, знаю только как непосредственно заполнять в процессе рекурсии, вот и пытаюсь улучшить не самый лучший вариант :(((


Дата: Авг 2, 2004 12:44:00

cresta
Да потому и закрыл, что ни черта не получилось ... Примера, чтобы разобраться, как действовать по LVN_GETDISPINFO нет.
Будет тебе пример. Куда прикажешь его постить?


Дата: Авг 2, 2004 20:14:36

q_q
Если можно, то на ua6xhy@mail.ru. Буду весьма признателен.


Дата: Авг 3, 2004 04:57:25

cresta
Ушло.


Дата: Авг 3, 2004 06:13:53

q_q
Спасибо, получил.


Дата: Авг 3, 2004 23:01:54

q_q

Разобрался, заполняются структуры по разному: для обычного листвью в поле .pszText указывается адрес строки, а для виртуал листвью (LVS_OWNERDATA) .pszText - это буфер, куда надо скопировать строку. Мда...
Ещё раз спасибо.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.067