ListView, а именно LVN_GETDISPINFO и NM_CUSTOMDRAW

Тема в разделе "WASM.WIN32", создана пользователем perez, 17 авг 2006.

  1. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Выручайте. Сам разобраться не могу :dntknw:

    Задача: сделать виртуальный список (использовать LVN_GETDISPINFO) и взять на себя
    отрисовку каждого итема (NM_CUSTOMDRAW).

    Ловлю WM_NOTIFY:

    NMHDR *pNMHDR= (NMHDR*)lParam;
    1) switch(pNMHDR->code){
    2) case LVN_GETDISPINFO:
    3) OnGetdispinfoListMain(pNMHDR, pResult);
    4) break;
    5) case NM_CUSTOMDRAW:
    6) OnCustomDraw(pNMHDR, pResult);
    7) break;
    8) }

    При таком раскладе работает LVN_GETDISPINFO.
    Но NM_CUSTOMDRAW не приходят сообщения для отрисовки итемов.
    Стоит закомментировать 3 строку, OnCustomDraw нормально все рисует.
    То есть нельзя почему то одновременно использовать LVN_GETDISPINFO и
    NM_CUSTOMDRAW.

    Как быть?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    perez
    не приходят сообщения для отрисовки итемов
    Приходят.
    Пример обработчиков LVN_GETDISPINFO и NM_CUSTOMDRAW
    Код (Text):
    1. ...
    2. // создание ListView
    3.   const DWORD style = WS_CHILD        |
    4.                       WS_BORDER       |
    5.                       WS_VISIBLE      |
    6.                       LVS_AUTOARRANGE |
    7.                       LVS_REPORT      |
    8.                       LVS_OWNERDATA;
    9.  
    10.   hwndLV = CreateWindowEx(0, WC_LISTVIEW, TEXT(""), style, ...
    11.  
    12. ...
    13.  
    14. // оконная процедура, обработчик WM_NOTIFY
    15.   case WM_NOTIFY:
    16.     if (((LPARAM) NULL != lParam) && (hwndLV == ((LPNMHDR) lParam)->hwndFrom))
    17.     {
    18.       TCHAR buf[128];
    19.  
    20.       switch (((LPNMHDR) lParam)->code)
    21.       {
    22.         case LVN_GETDISPINFO:
    23.         {
    24.           NMLVDISPINFO *plvdi = (NMLVDISPINFO *) lParam;
    25.           if (0 != plvdi->item.iSubItem)
    26.           {
    27.             if (plvdi->item.mask & LVIF_TEXT)
    28.             {
    29.               wsprintf(buf, TEXT("Row %d Col %d"),
    30.                 plvdi->item.iItem, plvdi->item.iSubItem);
    31.               lstrcpy(plvdi->item.pszText, buf);
    32.             }
    33.           }
    34.           else
    35.           {
    36.             if (plvdi->item.mask & LVIF_TEXT)
    37.             {
    38.               wsprintf(buf, TEXT("Item %d"), plvdi->item.iItem);
    39.               lstrcpy(plvdi->item.pszText, buf);
    40.             }
    41.             if (plvdi->item.mask & LVIF_IMAGE)
    42.               plvdi->item.iImage = 0;
    43.           }
    44.           return 0;
    45.         }
    46.  
    47.  
    48.         case NM_CUSTOMDRAW:
    49.         {
    50.           NMLVCUSTOMDRAW *plvcd = (NMLVCUSTOMDRAW *) lParam;
    51.           switch (plvcd->nmcd.dwDrawStage)
    52.           {
    53.             case CDDS_PREPAINT:
    54.               OutputDebugString(TEXT("CDDS_PREPAINT"));
    55.               return CDRF_NOTIFYITEMDRAW;
    56.  
    57.  
    58.             case CDDS_ITEMPREPAINT:
    59.               wsprintf(buf, TEXT("CDDS_ITEMPREPAINT Item %d"),
    60.                 plvcd->nmcd.dwItemSpec);
    61.               OutputDebugString(buf);
    62.               return CDRF_NOTIFYSUBITEMDRAW;
    63.  
    64.  
    65.             case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
    66.               wsprintf(buf, TEXT("CDDS_SUBITEM | CDDS_ITEMPREPAINT Row %d Col %d"),
    67.                 plvcd->nmcd.dwItemSpec, plvcd->iSubItem);
    68.               OutputDebugString(buf);
    69.               return CDRF_DODEFAULT;
    70.           }
    71.           return CDRF_DODEFAULT;
    72.         }
    73.       }
    74.  
    75. ...
    выхлоп можно увидеть при помощи Dbgview by Sysinternals.
     
  3. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city