Доброе время суток, многоуважаемый Олл.
Проблема: приложение содержит ListCtrl. Поскольку требуется показывать число записей от нескольких штук до нескольких десятков тысяч, я создаю его, как virtual ListCtrl. Данные в определенных колонках должны показываться в графической форме, и я использую для этих колонок Custom Draw.
Все работает превосходно (и даже более чем), пока список показывает действительно большое число записей. Как только число записей оказывается меньше, чем 21 (такое странное магическое число

, я начинаю получать событие _OnCustomDraw с неверными индексами item и subitem, подлежащими отрисовке. То есть:
void CMyView::OnCustomDrawList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pLVCustomDraw = (NMLVCUSTOMDRAW*) pNMHDR;
TRACE("pLVCustomDraw->nmcd.dwItemSpec = %d; pLVCustomDraw->iSubItem = %d\n", pLVCustomDraw->nmcd.dwItemSpec, pLVCustomDraw->iSubItem);
TRACE("Total number of items = %d\n", m_List.GetItemCount());
... здесь код, выполняющий перерисовку ...
}
В окне Outputs печатаются следующие строки:
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1342888; pLVCustomDraw->iSubItem = 1243748; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1342888; pLVCustomDraw->iSubItem = 1243748; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 20; pLVCustomDraw->iSubItem = 1243644; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 20; pLVCustomDraw->iSubItem = 1243644; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
pLVCustomDraw->nmcd.dwItemSpec = 1243632; pLVCustomDraw->iSubItem = 1; Total number of items = 20
Иногда вместо индекса item или subitem приходит вообще отрицательное число. Я пробовал для интереса представить все эти числа в шестнадцатеричном формате, но скрытого смысла в них не нашел

. Как только число записей превышает 20, я начинаю получать правильные индексы.
Я думаю, что проблема в виртуальной природе этого ListCtrl, поскольку в другом месте того же приложения я использую ListCtrl только с CustomDraw. В этом ListCtrl все индексы нормальные, даже если список содержит всего 1 или 2 элемента.
Я работаю с Visual Studio 6.0 + SP5 в Windows 2000 Pro + SP4.
Любые разумные идеи по устранению грабель будут восприняты с благодарностью.