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

 WASM Phorum —› WASM.WIN32 —› LVN_GETDISPINFO

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


Дата: Июл 27, 2004 01:44:26

Здравствуйте все.
Что-то заглючило меня неслабо :( Не разберусь с ListView. Есть массив строк приготовленных для занесения в ListView.
Если заносить все строки сразу при составлении, то требуется много времени. Поэтому хотел отгружать информацию по требованию.
При получении сообщения LVN_GETDISPINFO заполняю структуру LV_ITEM. Примерно так:
.elseif [edi.NMHDR].code == NM_DBLCLK
    invoke DisplayFileName,0

.elseif [edi.NMHDR].code == LVN_GETDISPINFO
    mov ecx,[edi.LVITEM].iItem
    mov [edi.LVITEM].imask, LVIF_TEXT  or LVIF_PARAM or LVIF_IMAGE
            	
    push ecx
    pop [edi.LVITEM].iItem
    push ecx
    pop [edi.LVITEM].lParam
    mov eax,318       ;sizeof WIN32_FIND_DATA
    mul ecx
    mov edx,[hFirstMem]
    add edx,eax
    lea eax, [edx.WIN32_FIND_DATA].cFileName
    mov FolderAddr,eax
    invoke NameFromPath,FolderAddr,addr szBuff 
    lea eax, [szBuff] 
    PrintStringByAddr eax                                                                      
    mov [edi.LVITEM].pszText,eax
    invoke SHGetFileInfo,FolderAddr, 0, addr sfi, sizeof SHFILEINFO,\
                    		SHGFI_SYSICONINDEX; or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_ATTRIBUTES
    mov eax, sfi.iIcon
    PrintDec eax
    mov [edi.LVITEM].iImage, eax
            	
    invoke SendMessage, hList,LVM_SETITEM, 0, addr[edi.LVITEM]                            ;addr lvi  
    return 0


Только на заполненную мной структуру LV_ITEM ListView гн обращает никакого внимания. Просто пустые строки. При прокрутке скролбара он продолжает постоянно запрашивать информацию для отображения, а как ему её передать - никак не дойдет.
Может кто знает, помогите. Или может у кого какой кусок с примером есть, только не на Си, я в его каракулях не разберусь.


Дата: Июл 27, 2004 04:02:46 · Поправил: q_q

cresta
Ты неправильно понимаешь назначение LVN_GETDISPINFO. Когда приходит эта нотификация надо анализировать LVITEM.imask на предмет запрошенной информации, и заполнять соответствующие поля. Результат возвращается в исходной структуре. LVM_SETITEM использовать не надо.


Дата: Июл 27, 2004 06:52:11

cresta
Если заносить все строки сразу при составлении, то требуется много времени
Вроде в листвью для этого даже сообщение есть специальное LVM_SETITEMCOUNT, хотя скорости может и не добавить.


Дата: Июл 27, 2004 14:33:42 · Поправил: cresta

jekyll
LVM_SETITEMCOUNT Я уже сделал, по окончании рекурсии, подсчитав кол-во объектов. Установил разом по количеству найденых объектов. И когда итем требует прорисовки на экране(например при скроллировании листбокса) я пытаюсь сообщить данные относящиеся к конкретному итему. А не все сразу, т.к. все сразу жутко морозит.

q_q
то есть mov eax,[edi.LVITEM].imask и затем в зависимости от флагов в eax заполнять то или иное ,[edi.LVITEM]... Ну заполню, а как листвью об этом догадается? Вот чего непонятно


Дата: Июл 27, 2004 20:28:38

„Ну заполню, а как листвью об этом догадается?“
:)))))))))) Да-а-а...


Дата: Июл 27, 2004 20:30:01

cresta
Ну заполню, а как листвью об этом догадается? Вот чего непонятно
Так q_q же написал, что все вернется в исходной структуре, т.е. когда ты обработаешь сообщение листвью будет работать с этой структурой. Или я что не так понял?


Дата: Июл 28, 2004 01:59:16 · Поправил: cresta

Toxic
Не надо смеяться, или может ты родился с готовым шаблоном callback'a в голове?
jekyll
q_q
Я пробовал слать разные сообщения и не слать вообще никаких - результат одинаковый: пустой листвью с количеством строк, равным кол-ву необходимых к занесению.
Немножко переделал код:
    .elseif [edi.NMHDR].code == LVN_GETDISPINFO
     mov eax, [edi.LVITEM].iItem				;number of string, also num. of item
     mov ecx,318								;each element's size(WIN_32_FIND_DATA)
     mul ecx									;offset from start addr of array
     mov edx,[hFirstMem]							;array's start addr
     add edx,eax								;addr of wanted element
     lea eax, [edx.WIN32_FIND_DATA].cFileName		;addr of FullPath of file
     mov FolderAddr,eax						;store it
     invoke NameFromPath,FolderAddr,addr szBuff		;extract file Name into szBuff
            	
     mov eax, [edi.LVITEM].imask
     push eax
     and eax, LVIF_PARAM
     .if eax==1								;if need .lParam
         mov eax,[edi.LVITEM].iItem
         mov [edi.LVITEM].lParam,eax
     .endif
     pop eax
     push eax
     and eax,LVIF_IMAGE
     .if eax==1								;if need .iImage
        invoke SHGetFileInfo,FolderAddr, 0, addr sfi, sizeof SHFILEINFO,\
                    				SHGFI_SYSICONINDEX; or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_ATTRIBUTES
    	mov eax, sfi.iIcon						;icon's system identifier
        mov [edi.LVITEM].iImage,eax
    .endif
    pop eax
    and eax,LVIF_TEXT
    .if eax==1									;if need some text
        mov [edi.LVITEM].iSubItem, 0
        lea eax, [szBuff]							;text for subitem 0
        mov [edi.LVITEM].pszText,eax
    .endif

    PrintStringByAddr FolderAddr				; D:\NM\Thumbs.db
    PrintStringByAddr [edi.LVITEM].pszText		; empty string
    PrintDec [edi.LVITEM].iImage				; 5682456 
    PrintDec [edi.LVITEM].iItem					; 0
    PrintDec [edi.LVITEM].iSubItem				; -150

    return 1

Данные записаны но не воспринимаются.