LVN_GETDISPINFO и I_IMAGECALLBACK
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 07.03.13 09:45
Оценка:
Привет.

Не могу понять почему много раз зовется колбэк для получения иконки в ListView
если мышкой изменять размер колонки (любой) — пока тянешь ее в обработчик попадает куча вызовов:
if(di->item.mask & LVIF_IMAGE)

Сделал видимым одну строчку и залогировал все параметры — они все одинаковые!

        LRESULT onGetDispInfo(int /* idCtrl */, LPNMHDR pnmh, BOOL& /* bHandled */)
        {
            NMLVDISPINFO* di = (NMLVDISPINFO*)pnmh;
            if (di && di->item.iSubItem >= 0)
            {
                if (di->item.mask & LVIF_TEXT && di->item.lParam)
                {
                    di->item.mask |= LVIF_DI_SETITEM;
                    setText(di->item, ((T*)di->item.lParam)->getText(m_columnIndexes[static_cast<size_t>(di->item.iSubItem)]));
                }
             if(di->item.mask & LVIF_IMAGE) // http://support.microsoft.com/KB/141834
              {
#ifdef _DEBUG
        static int g_count = 0;
        dcdebug("onGetDispInfo  count = %d di->item.iItem = %d di->item.iSubItem = %d, di->item.iIndent = %d, di->item.lParam = %d "
                "mask = %d "
                "state = %d "
                "stateMask = %d "
                "pszText = %d "
                "cchTextMax = %d "
                "iGroupId = %d "
                "cColumns = %d "
                "puColumns = %d "
                "hdr.code = %d "
                "hdr.hwndFrom = %d "
                "hdr.idFrom = %d\n"
                ,++g_count, di->item.iItem, di->item.iSubItem, di->item.iIndent, di->item.lParam,
    di->item.mask,
    di->item.state,
    di->item.stateMask,
    di->item.pszText,
    di->item.cchTextMax,
//    di->item.iImage,
    di->item.iGroupId,
    di->item.cColumns,
    di->item.puColumns,
    di->hdr.code,
    di->hdr.hwndFrom,
    di->hdr.idFrom
                );
#endif
                  di->item.iImage = 2;
              }
            }
            return 0;
        }



onGetDispInfo count = 150 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064
onGetDispInfo count = 151 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064
onGetDispInfo count = 152 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064
onGetDispInfo count = 153 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064
onGetDispInfo count = 154 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064
onGetDispInfo count = 155 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064
onGetDispInfo count = 156 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064
onGetDispInfo count = 157 di->item.iItem = 0 di->item.iSubItem = 0, di->item.iIndent = 0, di->item.lParam = 206937200 mask = 2 state = 0 stateMask = 0 pszText = 0 cchTextMax = 0 iGroupId = 0 cColumns = 0 puColumns = 0 hdr.code = -177 hdr.hwndFrom = 2496328 hdr.idFrom = 1064


Вместо константы di->item.iImage = 2
у меня будет функция и не хочется чтобы она звалась лишнее кол-во раз когда юзер меняет размер колонок.
Re: LVN_GETDISPINFO и I_IMAGECALLBACK
От: VladFein США  
Дата: 08.03.13 17:35
Оценка:
Здравствуйте, PPA, Вы писали:

PPA>Привет.


PPA>Не могу понять почему много раз зовется колбэк для получения иконки в ListView

PPA>если мышкой изменять размер колонки (любой) — пока тянешь ее в обработчик попадает куча вызовов:
PPA>if(di->item.mask & LVIF_IMAGE)

"If your message handler sets the LVIF_DI_SETITEM flag in the mask member of the LVITEM structure, the list-view control stores the requested information and will not ask for it again."

У Вас для LVIF_TEXT это есть, а для LVIF_IMAGE — нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.