Доброго дня, господа! Прошу помочь со следующей ситуацией. Есть ListView (LVS_REPORT) (на WinAPI, без фреймворков), в нём нужно динамически менять иконки у строк. Вариант с ImageList работает, но создаётся много не совсем красивого кода для учёта соответствия номера иконки в ImageList конкретной строке в LV (строки в LV часто добавляются/удаляются в большом количестве). HICON для каждой иконки известен и легкодоступен. Посему обратил внимание на CustomDraw в следующем виде: Код (ASM): mov edi, lParam assume edi: ptr NMLVCUSTOMDRAW60 .if [edi].nmcd.dwDrawStage == CDDS_PREPAINT mov dwMsgResult, CDRF_NOTIFYITEMDRAW .elseif [edi].nmcd.dwDrawStage == CDDS_ITEMPREPAINT mov dwMsgResult, CDRF_NOTIFYPOSTPAINT .elseif [edi].nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT mov esi, [edi].nmcd.lItemlParam .if esi .if RL_LVINFOLIST_HEADER.hIcon[esi] && RL_LVINFOLIST_HEADER.hIcon[esi] != INVALID_HANDLE_VALUE mov rcIcon.left, LVIR_BOUNDS lea eax, rcIcon push eax push [edi].nmcd.dwItemSpec push LVM_GETITEMRECT invoke WindowFromDC, [edi].nmcd.hdc push eax call SendMessageW invoke DrawIconEx, [edi].nmcd.hdc, rcIcon.left, rcIcon.top, RL_LVINFOLIST_HEADER.hIcon[esi], 16, 16, 0, 0, DI_NORMAL .endif .endif mov dwMsgResult, CDRF_SKIPDEFAULT .else mov dwMsgResult, CDRF_DODEFAULT .endif .if dwMsgResult invoke SetWindowLongW, hWnd, DWL_MSGRESULT, dwMsgResult xor eax, eax inc eax .else xor eax, eax .endif assume edi:nothing В lItemlParam к каждой строке лежит указатель на структуру с данными для этой строки. dwMsgResult возвращается через SetWindowLong, т.к. это диалоговое окно. Иконки отрисовываются только при наведении курсора на строку и исчезают при следующем цикле обновления инфы в ListView (даже если обновляются только SubItem'ы). Понимаю, что скорее всего нужно обрабатывать и WM_PAINT с аналогичными действиями, но тогда получается ещё больше кода, чем с ImageList. Примеры с CustomDraw на codeproject и msdn делают всё тоже самое, что в куске кода выше, но проблем с отображением иконок (или иной графики, вроде самодельного прогрессбара в SubItem) не наблюдается. Что я упускаю из виду? Спасибо.