Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > virtual Listview


Автор: mikado3333 11.03.16, 21:51
Приветствую! Помогите пожалуйста с двумя вопросами касающихся Listview:

1)Пытаюсь вывести virtual Listview, при этом subItems выодяться, а Item нет

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    .wmnotify:
        mov     esi,[lparam]
        cmp     [esi + NMHDR.code],LVN_GETDISPINFO
        jnz     .defwndproc
        mov     eax,[TableZap]
        cmp     [esi + NMHDR.hwndFrom],eax
        jnz     .defwndproc
        ;!Если мы здесь то это значит  виртуальный listview и esi = LV_DISPINFO
        lea     esi,[esi + LV_DISPINFO.item]
        cmp     [esi + LV_ITEM.mask],LVIF_TEXT
        jnz     .defwndproc
        mov             edx,[esi + LV_ITEM.iSubItem]
        
        cmp     edx,0
        jnz     @f
        mov     [esi + LV_ITEM.pszText],_error
      @@:          
        mov     [esi + LV_ITEM.pszText],_class
        jmp     .finish[attach=49026]

Полный файлnew_1.txt (, : 126)

2) Как задать разную высоту строк? При отлавливании сообщения WM_MEASUREITEM высота меняется у всех строк. А хотелось бы чтобы высота регулировалась от содержимого. Куда копать?

Автор: mikado3333 11.03.16, 23:50
С первым вопросом разобрался cmp на test
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    .wmnotify: ;{
        mov     esi,[lparam]
        cmp     [esi + NMHDR.code],LVN_GETDISPINFO
        jnz     .defwndproc
        mov     eax,[TableZap]
        cmp     [esi + NMHDR.hwndFrom],eax
        jnz     .defwndproc
        ;!Если мы здесь то это значит  виртуальный listview и esi = LV_DISPINFO
        lea     esi,[esi + LV_DISPINFO.item]
        test            [esi + LV_ITEM.mask],LVIF_TEXT
        jz      .defwndproc
        mov              edx,[esi + LV_ITEM.iSubItem]
        
        cmp     [esi + LV_ITEM.iSubItem],0
        jnz     @f
        mov     [esi + LV_ITEM.pszText],_error
        jmp     .finish
      @@:  
        lea     eax,[esi + LV_ITEM.pszText]
        invoke wsprintf, [esi + LV_ITEM.pszText],fmt_val,[esi + LV_ITEM.iSubItem]
        jmp     .finish
    ;}


Появился новый вопрос по поводу логики. Я добавил при создании стиль LVS_OWNERDRAWFIXED и при этом использую для получение текста LVM_GETITEMTEXT, хотя при виртуальном списке это не должно работать. И собственно почему работает LVM_GETITEMTEXT при LVS_OWNERDATA при обработке сообщения WM_DRAWITEM?

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    .wmdrawitem: ;{
        mov     ebx,[lparam]
        cmp     [ebx + DRAWITEMSTRUCT.CtlType],ODT_LISTVIEW                                 ;! Проверяем что сообщение от listview
        jnz     .defwndproc
        cmp     [ebx + DRAWITEMSTRUCT.itemAction],ODA_FOCUS                                 ;! Узнаем трубуемую операцию рисования
        jz      .defwndproc
        mov     edi,[Brush6]                                                    ;! Устанавливаем цвет выбранной строки
        cmp     [ebx + DRAWITEMSTRUCT.itemState],ODS_FOCUS + ODS_SELECTED                           ;! Если строка выбрана щелчком ЛКМ то
        jz      @f                                                      ;! переходим к следующим  шагам
        mov     edi,[Brush3]                                                    ;! Если не строка не выбрана, то цвет выбранной строки = цвету фона
     
      @@:
        mov     esi,1
        mov     [rcItem.left],       LVIR_BOUNDS
        invoke          GetClientRect,       [ebx + DRAWITEMSTRUCT.hwndItem],rcTable                         ;! Получение rect таблицами
        invoke          SendMessage,         [ebx + DRAWITEMSTRUCT.hwndItem],LVM_GETITEMRECT,\                  ;! Получение rect итема
                             [ebx + DRAWITEMSTRUCT.itemID],rcItem
        mov     [lvi.iSubItem],0
        mov     [lvi.pszText],ListViewbuf
        mov     [lvi.cchTextMax],1000
        invoke          SendMessage,         [ebx + DRAWITEMSTRUCT.hwndItem],LVM_GETITEMTEXT,[ebx + DRAWITEMSTRUCT.itemID],lvi  ;! Получаем текст итема
        
        invoke           SelectObject,       [ebx + DRAWITEMSTRUCT.hDC],edi                             ;! Рисуем итем
        mov      edi,eax                                        
        inc     [rcItem.bottom]
        invoke           Rectangle,      [ebx + DRAWITEMSTRUCT.hDC],[rcItem.left],[rcItem.top],[rcItem.right],[rcItem.bottom]
        add     [rcItem.left],5
        invoke           DrawText,       [ebx + DRAWITEMSTRUCT.hDC],ListViewbuf,-1,rcItem,DT_SINGLELINE+DT_VCENTER+DT_END_ELLIPSIS
        
    .loop:                          
        mov     [rcSubItem.left],LVIR_BOUNDS
        mov     [rcSubItem.top],esi
        invoke          SendMessage,         [ebx + DRAWITEMSTRUCT.hwndItem],LVM_GETSUBITEMRECT,\                    ;! Получение rect сабитема
                                     [ebx + DRAWITEMSTRUCT.itemID],rcSubItem        
                                
        mov     [lvi.iSubItem],esi
        mov     [lvi.pszText],ListViewbuf
        mov     [lvi.cchTextMax],1000
        invoke          SendMessage,         [ebx + DRAWITEMSTRUCT.hwndItem],LVM_GETITEMTEXT,[ebx + DRAWITEMSTRUCT.itemID],lvi   ;! Получаем текст сабитема
        
        inc     [rcSubItem.bottom]                   ;! Рисуем сабитем
        dec     [rcSubItem.left]
        invoke          Rectangle,           [ebx + DRAWITEMSTRUCT.hDC],[rcSubItem.left],[rcSubItem.top],[rcSubItem.right],[rcSubItem.bottom]
        invoke          DrawText,            [ebx + DRAWITEMSTRUCT.hDC],ListViewbuf,-1,rcSubItem,DT_SINGLELINE+DT_CENTER+DT_VCENTER+DT_END_ELLIPSIS
        inc     esi
        cmp     esi,12
        jnz     .loop
        invoke          SelectObject,        [ebx + DRAWITEMSTRUCT.hDC],edi                                                      ;! Возвращаем кисть
        jmp     .finish
    ;}

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)