Вновь про раскраску listview ...

Тема в разделе "WASM.WIN32", создана пользователем leeloo, 31 мар 2008.

  1. leeloo

    leeloo New Member

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

    Мне необходимо разным итемам в списке присваивать свои цвета. Делаю так :

    Код (Text):
    1. DlgProc proc uses   ebx hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    2. .
    3. .
    4.     .elseif eax==WM_NOTIFY
    5.         mov ebx,lParam
    6.         assume ebx:ptr NMHDR
    7.         mov eax,[ebx].hwndFrom
    8.         .if eax==hlist
    9.             mov eax,[ebx.NMHDR].code
    10.             .if eax==NM_CUSTOMDRAW
    11.                 mov ebx,lParam
    12.                 assume  ebx: ptr NMLVCUSTOMDRAW
    13.                 .if ([ebx].nmcd.dwDrawStage==CDDS_PREPAINT)
    14.                     invoke SetWindowLong,hWin, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW
    15.                     mov eax,CDRF_NOTIFYITEMDRAW
    16.                     ret
    17.                 .elseif ([ebx].nmcd.dwDrawStage==CDDS_ITEMPREPAINT)
    18.                     mov eax,    color_message_bg
    19.                     mov     [ebx].clrTextBk, eax
    20.                     mov eax,    color_message
    21.                                                         mov     [ebx].clrText, eax
    22.                     invoke SetWindowLong,hWin, DWL_MSGRESULT, CDRF_NEWFONT
    23.                                                     mov     eax,CDRF_NEWFONT
    24.                     ret
    25.                 .else
    26.                  .endif
    27.                 assume  ebx:nothing
    28.             .endif     
    29.         .endif;         .if [edi].code==LVN_COLUMNCLICK
    30.         assume  ebx:nothing
    31. .
    32. .
    Красим :

    Код (Text):
    1.             mov color_message, красный
    2.             mov color_message_bg, зеленый
    3.  
    4.     invoke SendMessage,hlist, LVM_INSERTITEM,0, addr lvi
    5.             inc lvi.iItem
    6.             mov color_message, желтый
    7.             mov color_message_bg, серый
    8.  
    9.     invoke SendMessage,hlist, LVM_INSERTITEM,0, addr lvi
    10. .
    11. .
    Покрасили, но вот засада ...
    1. кликаем на итеме и он окрашивается в последние цвета...
    2. обновляем окно - все итемы окрашиваются в последние цвета ...

    неужто параметры каждого итема нужно запоминать , чтоб потом возвращать?
    Или как можно запретить контролу перерисовывать итемы ... юзать LVS_OWNERDRAWFIXED ?
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Естественно. На языках высокого уровня можно было создать свой класс на основе listview
    и переписать функцию рисования. Но как это сделать на ассемблере - думаю что непросто.
     
  3. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Вроде понял - надо при мессаге рисования обрабатывать данный итем и его окрашивать в нужный цвет, не будет ли тормозить прога ...

    С уважением ...
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    leeloo
    Я думаю не будет. Рисование все равно делается, а изменение цвета по идее - это запись нескольких байт.
     
  5. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Сделал. Тема закрыта.
    Краску каждой строки заношу в память.
    Код (Text):
    1.     mov eax,    lvi.iItem
    2.     shl eax,    3
    3.     add eax,    pMemory
    4.     add eax,    20*1024*1024
    5.    
    6.     mov dword       ptr [eax],  00000000h  
    7.     add eax,    4  
    8.     mov dword       ptr [eax],  00808080h  
    9.  
    10.     invoke SendMessage,hlist, LVM_INSERTITEM,0, addr lvi
    Все на автомате
    Код (Text):
    1.                         mov edx,    [ebx].nmcd.dwItemSpec
    2.                         shl edx,    3
    3.                         add edx,    pMemory
    4.                         add edx,    20*1024*1024
    5.                        
    6.                         mov eax,    dword   ptr[edx]
    7.                         mov [ebx].clrText,  eax
    8.                         add edx,    4
    9.                         mov eax,    dword   ptr[edx]
    10.                         mov [ebx].clrTextBk,    eax
    11.  
    12.                         invoke SetWindowLong,hWin, DWL_MSGRESULT, CDRF_NEWFONT
    13.                         mov     eax,CDRF_NEWFONT