листвью и рисунки

Тема в разделе "WASM.WIN32", создана пользователем cresta, 30 дек 2004.

  1. cresta

    cresta Active Member

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



    Тут вопрос такой созрел, или проблема, не знаю..

    В листвью у итема рисуночек (битмап). Рисует. Красиво. Но у выделенного итема рисуночек закрашивается сеточкой :dntknw: Как можно это побороть?

    ImageList для листвью создавался так:

    invoke ImageList_Create, 16, 16, ILC_COLOR32 or ILC_MASK, 3, 0

    invoke ImageList_Add,hImageListS,hBmpList,hBmpMask

    в качестве hBmpMask битмап розового цвета (255,0,255)



    Или может у кого пример есть, как самому отрисовать итемы и субитемы в листвью, что даже было бы предпочтительней, а то в msdn все примеры на Си, а я в нем никак не разберусь :dntknw:
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Да, это мне тоже не понравилось.

    Ещё надо бы, чтобы можно было выделять все колонки, а не только первую.

    Пришлось делать полностью свой Custom Control.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Все колонки выделяются, если lvs_ex_fullrowselect установлен.



    А Custom control... Листбокс делал, листвью не пробовал.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    LVS_EX_BORDERSELECT решает проблему. Выделяется синим только текст. Картинка не выделяется. Почему - непонятно. Но работает.
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Спасибо, воспользуюсь где-нибудь.

    Мне мой list-view больше нравится - красивее просто...
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А можно скриншот глянуть, а ?
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Кстати, как присобачить картинку в форум?

    Никогда не пробовал.
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    AsmGuru62 Сначала прицепить аттач (картинку), отправить пост, скопировать ссылку на аттач, потом вызвать правку сообщения, на том месте где нужна картинка кликнуть на тег (3-й с конца, с елочкой) и между img вставить ссылку
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Screenshot...

    [​IMG]
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    AsmGuru62



    А как реализовано хранение информации об итемах\субитемах\рисунках и как ресайз организован горизонтальный (ширина колонок)\вертикальный (кол-во итемов)? Если это не секрет:)



    А тут мой листбокс:)

    [​IMG]
     
  12. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Вот такая структура хранит одну строку:
    Код (Text):
    1. typedef struct {
    2.     PTCHAR m_pstrText;
    3.     int m_iIconIndex;
    4. } MYLVITEM;


    Текст каждой колонки разделён символами табуляции:
    Код (Text):
    1. item->m_pstrText = Allocator.StrDup ("Text1\nText2\nText3");


    Когда рисуется полностью строка - происходит парсинг до символа табуляции. Только я не использую strtok() - просто подсчитываю символы, так что получаю назад адрес начала текста и сколько там символов. Иконки хранятся в простом массиве:
    Код (Text):
    1. HICON arrIcons [16];


    А какие проблемы с resizing-ом? Ты имеешь в виду изменение ширины колонок? Или scrolling?
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    О ресайзе: скорее интересно, как рисуется текст, допустим при изменении ширины колонки. Можно сделать этот листвью как набор статиков-субитемов (я свои лист делал так), и при этом сдвигать колонки, находящиеся справа от курсора, или можно сделать один большой элемент на всю ширину\высоту видимой части листа и калькулировать rect'ы и вписывать в них тексты субитемов либо рисовать иконки. Какой метод применен?



    Со скроллингом понятно, что это чисто математический перерасчет.
     
  14. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Всё рисуется моим кодом. Отдельных static-ов нет - это будет медленнее и больше проблем... Весь control - это единственный HWND. Текст рисуется через DrawText() - там есть такая фича: если текст не помещается - он пририсовывает "..." в конце.



    Сначала берём и считаем RECT для одной (первой) строки:
    Код (Text):
    1.  
    2. RECT itemRect = clientRect;
    3.  
    4. itemRect.top = COLUMN_HEADER_HEIGHT;
    5. itemRect.bottom = COLUMN_HEADER_HEIGHT + ITEM_HEIGHT;


    А потом циклим, отрисовывая каждую строку, при этом просто сдвигая itemRect на величину высоты строки (циклим пока не кончатся строки или itemRect.top не превысит clientRect.bottom):
    Код (Text):
    1. while (itemRect.top < clientRect.bottom) {
    2.   if ( no more items ) {
    3.     break;
    4.   }
    5.  
    6.   // draw single item (all sub-items)...
    7.  
    8.   OffsetRect (&itemRect, 0, ITEM_HEIGHT);
    9. }
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вполне понятно. Спасибо.