|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 30, 2004 06:03:28 Доброго времени всем. Хотел узнать, есть ли какая-нибудь альтернатива SHGetFileInfo ? Нужно получить системный индекс иконки файла, но SHGetFileInfo работает уж очень медленно (порядка 0.7 - 0.8 мс на одно обращение). В итоге более 90% времени заполнения листвью уходит на ожидание от SHGetFileInfo индекса иконки. ExtractAssociatedIcon в данном случае не помощник, т.к. она возвращает хэндл, а не индекс. А другого ничего не могу найти. Может кто знает, как заполучить эти индексы? |
|
|
Дата: Июл 30, 2004 18:10:44 Может это поможет: http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=5663 |
|
|
Дата: Июл 30, 2004 21:36:04 Four-F Я видел это, но не помогает, увы... |
|
|
Дата: Июл 30, 2004 21:57:02 А что такое "системный индекс"? |
|
|
Дата: Июл 30, 2004 22:30:30 Может ещё это поможет :) http://wasm.ru/forum/index.php?action=vthread&forum=17&topic=4564 |
|
|
Дата: Июл 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 |