Как создать List-view заполненый checkbox'ми?

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 1 май 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Как создать List-view заполненый checkbox'ми (как на картинке)?
     
  2. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Что бы создать достаточно, указать в сообщении LVM_SETEXTENDEDLISTVIEWSTYLE стиль LVS_EX_CHECKBOXES.
    А затем при создании итема если хочешь что бы checkbox был установлен, то используй поле state структуры LVITEM.
    Что бы узнать состояние checkbox, нужно использовать сообщение LVM_GETITEMSTATE с маской LVIS_STATEIMAGEMASK.

    Все это не будет работать на старых Windows.

    P.S. За подробностями обращаться в MSDN.
    P.P.S Вообще можно сделать 2 рисунка и показывать либо один либо второй. Так сделано, например в PETools, но там второй способ работает если система не поддерживает первый.
     
  3. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Не получается создать итем.

    Text db "Text",0
    ListViewClass db "SysListView32",0
    LOCAL lvs:LVITEM

    invoke CreateWindowEx,
    WS_EX_CLIENTEDGE,
    addr ListViewClass,
    NULL,
    WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHAREIMAGELISTS,
    50,40,
    400,250,
    hWnd,
    NULL,
    hInstance,
    NULL
    mov hList, eax
    invoke SendMessage,hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_CHECKBOXES
    mov lvs.pszText,OFFSET Text
    invoke SendMessage,hList,LVM_SETITEM, 0,ADDR lvs

    Как правильно?
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Код (Text):
    1. mov lvs.mask,LVIF_TEXT
    2. mov lvs.iItem,0
    3. mov lvs.iSubItem,0
    4. mov lvs.pszText,OFFSET Text
    5. mov lvs.cchTextMax,256
    6. invoke SendMessage,hList,LVM_INSERTITEM, 0,ADDR lvs
     
  5. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Text db "Text",0
    ListViewClass db "SysListView32",0
    LOCAL lvs:LVITEM

    invoke CreateWindowEx,
    WS_EX_CLIENTEDGE,
    addr ListViewClass,
    NULL,
    WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHAREIMAGELISTS,
    50,40,
    400,250,
    hWnd,
    NULL,
    hInstance,
    NULL
    mov hList, eax
    invoke SendMessage,hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_CHECKBOXES
    mov lvs.mask,LVIF_TEXT <---------------!!!
    mov lvs.iItem,0
    mov lvs.iSubItem,0
    mov lvs.pszText,OFFSET Text
    mov lvs.cchTextMax,256
    invoke SendMessage,hList,LVM_INSERTITEM, 0,ADDR lvs


    Masm32 пишет missing operand after unary operator и указывает на отмеченную строку.
    В чём ошибка?
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    lvs.imask
     
  7. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Вместе с LVS_EX_CHECKBOXES у меня обычно стоит LVS_EX_FULLROWSELECT, без этого я думаю все равно не получится.
    И насчет
    LOCAL lvs:LVITEM
    что это за LVITEM у меня LV_ITEM
    lvs -- это LV_COLUMN, добавление колонок в ListView
    Посмотри пример в папки примеров Masm там есть хороший пример и его легко модифицировать
     
  8. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Исправил как посоветовали.

    Text db "Text",0
    ListViewClass db "SysListView32",0
    LOCAL lvs:LV_ITEM

    invoke CreateWindowEx,
    WS_EX_CLIENTEDGE,
    addr ListViewClass,
    NULL,
    WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHAREIMAGELISTS,
    50,40,
    400,250,
    hWnd,
    NULL,
    hInstance,
    NULL
    mov hList, eax
    invoke SendMessage,hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_CHECKBOXES or LVS_EX_FULLROWSELECT
    mov lvs.imask,LVIF_TEXT
    mov lvs.iItem,0
    mov lvs.iSubItem,0
    mov lvs.pszText,OFFSET Text
    mov lvs.cchTextMax,256
    invoke SendMessage,hList,LVM_INSERTITEM, 0,ADDR lvs

    Ошибки больше нет, но итем не появляется.
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    теперь столбец добавляем, в котором итемы будут отображаться... :)
     
  10. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Еща нада InitCommonControls :)
     
  11. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Работает. Спасибо.
    И если можно, ещё один вопрос.
    Как указать ширину столбца?
     
  12. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    LVM_SETCOLUMNWIDTH
    wParam - номер столбца, ширина-в верхнем слове lParam
     
  13. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Спасибо. Тему можно закрывать.
     
  14. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Нет, ещё рано :)
    Не получается изменять состояния итема.
    Нужно при появлении установить итем, а при посылке LVM_SETITEMSTATE убрать.
    Где ошибка?

    mov lvs.imask,LVIF_TEXT
    mov lvs.state,LVIS_SELECTED
    mov lvs.stateMask,LVIS_STATEIMAGEMASK
    mov lvs.pszText,OFFSET Text
    mov lvs.iItem,0
    mov lvs.iSubItem,0
    invoke SendMessage,hList,LVM_INSERTITEM,0,ADDR lvs
    invoke SendMessage,hList,LVM_INSERTCOLUMN,0,ADDR lvs

    invoke SendMessage,hList,LVM_SETITEMSTATE,0,ADDR lvs ;

    Наверное дело в
    mov lvs.state,LVIS_STATEIMAGEMASK
    mov lvs.stateMask,LVIS_SELECTED

    Можно ли в этот список добавить итем без chexbox? Если можно, то как?
     
  15. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    во-первых, флаги, указанные в lvs.imask определяют, какие поля этой структуры будет использовать контрол (должны быть валидными). Так что, для изменения состояния итема надо добавить
    mov lvs.imask, LVIF_TEXT or LVIF_STATE.

    Во-вторых, поле lvs.iItem содержит индекс итема, для которого ты изменяешь состояние. Если используешь сортированные списки, этот индекс будет отличаться от того, что указан перед отправкой LVM_INSERTITEM - новый индекс итема вернет SendMessage:
    Код (Text):
    1. mov lvs.iItem,0
    2. mov lvs.iSubItem,0
    3. invoke SendMessage,hList,LVM_INSERTITEM,0,ADDR lvs
    4. mov lvs.iItem, eax
    5. ; дальше изменяем состояние итема
    В-третьих, в сообщении LVM_INSERTCOLUMN используется структура LVCOLUMN (или LV_COLUMN в масме?), а не LV_ITEM. И добавлять столбец надо (желательно :)) _перед_ вставкой итемов.
     
  16. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    При определении структуры
    LOCAL lvс:LVCOLUMN
    masm32 пишет
    error A2044: invalid character in file
    то же самое если писать LV_COLUMN
     
  17. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Чёрт! Это я набрал с с русской раскладкой.
    Ошибки больше нет.
    Но итемы всё равно не устанавливаются.
    Исправил

    mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
    mov lvc.pszText,offset Heading1
    mov lvc.lx,350
    invoke SendMessage,hList,LVM_INSERTCOLUMN,0,addr lvc

    mov lvs.imask,LVIF_TEXT or LVIF_STATE
    mov lvs.state,LVIS_SELECTED
    mov lvs.stateMask,LVIS_STATEIMAGEMASK
    mov lvs.pszText,OFFSET Text
    mov lvs.iItem,0
    mov lvs.iSubItem,0
    invoke SendMessage,hList,LVM_INSERTITEM,0,ADDR lvs


    Сортированные списки я не использую.
     
  18. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Посмотри в атаче.
    Вроде все работает
     
  19. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Всё равно не могу разобраться почему у меня итемы не устанавливаются.
    Может кто видит где ошибка?
    Код выше.
     
  20. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Стиль LVIS_SELECTED означает, что итем будет выделен.
    Используй в качестве стиля значение 8192, чтобы установить флажок итема и 4096, чтобы его сбросить... (я сам не пробовал, заодно и расскажешь, получилось или нет :))