|
|
| Посл.отвђт | Сообщен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
Данные записаны но не воспринимаются. |