Как работать с ListView?

Тема в разделе "WASM.BEGINNERS", создана пользователем ATX, 5 июн 2007.

  1. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Всем добрый день!

    Начал осваивать ListView но остановился на 3-х моментах:
    1. Как установить курсор в ListView на нужной строке?
    2. Как порасить строки в одном ListView разных цветов?
    3. Как производить сортировку строк (например по алфавиту)?

    Если кто поскажет, или даст ссылочку на сэмплы - буду благодарен!
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Установить выделение на определенном итеме можно так:

    Код (Text):
    1. LOCAL lvi               :LVITEM
    2.  
    3. invoke  SetFocus, hList
    4. mov     lvi.state,0FFFFFFFFh
    5. mov     lvi.stateMask, LVIS_FOCUSED or LVIS_SELECTED
    6. ;выделить пятый итем
    7. invoke  SendMessage, hList, LVM_SETITEMSTATE, 5, addr lvi
    8. invoke  SendMessage, hList, LVM_ENSUREVISIBLE, iItem, 0
    Как сортировать зависит от того, установлен у листвью стиль LVS_OWNERDATA или нет.
    Если стиль установлен (virtual listview), то данные храняться не в листвью, а в обычном массиве, и при необходимости листвью запрашивает эти данные (когда нужно отобразить содержимое листвью). При этом передаешь из массива запрошенные строки в листвью. Virtual listview не имеет встроенного механизма сортировки. В этом случае сортировка сводится к обычной сортировке массива и после сортировки массива нужно принудительно заставить листвью обновиться, чтобы он отобразил заново отсортированный массив.

    Если LVS_OWNERDATA не установлен (листвью постоянно хранит данные), то при клике на заголовке колонки можно послать сообщение для листвью LVM_SORTITEMS, и при этом будет вызываться написаный тобой callback, в котором будешь сравнивать передаваемые в callback строки и возвращать -1, 0 или 1 в зависимости от результата сравнения строк. Соответственно возвращаемому результату будут мемяться (или не меняться) местами итемы листвью. Пример сортировки с callback есть в пакете masm32 в папке examples.

    Если итемов (строк) мало, то можно использовать листвью без LVS_OWNERDATA, если много ( порядка нескольких десятков тысяч и более), то нужен virtual listview. Соответственно определяешься с возможным количеством итемов и выбираешь нужный стиль и соответственно способ сортировки.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Чтобы сделать листвью полосатым, надо обрабатывать WM_NOTIFY, присылаемый родителю листа таким образом:

    Код (Text):
    1.     .elseif eax==WM_NOTIFY
    2.         mov ebx,lParam
    3.         mov eax,[ebx.NMHDR].hwndFrom
    4.         .if eax==hList
    5.             mov eax,[ebx.NMHDR].code
    6.             .if eax==NM_CUSTOMDRAW
    7.                 mov     ebx,lParam
    8.                 assume  ebx: ptr NMLVCUSTOMDRAW
    9.                 .if     ([ebx].nmcd.dwDrawStage==CDDS_PREPAINT)
    10.                     mov     eax,CDRF_NOTIFYITEMDRAW
    11.                     jmp     _ret
    12.                 .elseif ([ebx].nmcd.dwDrawStage==CDDS_ITEMPREPAINT)
    13.                     mov     eax,[ebx].nmcd.dwItemSpec
    14.                     and     eax,1
    15.                     .if     (eax)
    16.                         mov     [ebx].clrTextBk, 00FFFDE6h
    17.                         mov     esi, hVerdana
    18.                     .else
    19.                         mov     [ebx].clrTextBk, 00DBFFF7h
    20.                         mov     esi, hArial
    21.                     .endif
    22.                     invoke  SelectObject, [ebx].nmcd.hdc, esi
    23.                     mov     [ebx].clrText, 0A00000h
    24.                     mov     eax,CDRF_NEWFONT
    25.                     jmp     _ret
    26.                 .endif
    27.                 assume  ebx:nothing
    28.             .endif
    29.         .endif
    заодно и шрифт и цвет текста можно установить для каждого итема отдельно
     
  4. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Большее спасибо, все прекрасно работает!
    :)
     
  5. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    А какое свойство надо сделать у ListView, чтобы NM_CUSTOMDRAW заработал?
     
  6. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    уже понял. вроде как ничего и не надо.
     
  7. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    hVerdana
    hArial

    что тут должно быть?
     
  8. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    если используется SelectObject, то похоже надо делать CreateFont либо GetStockObject (DEFAULT_GUI_FONT). Но вообще, если шрифт не нужен, то достаточно только цвета указать