procedure TCnCustBuildForm.lstWizardsDrawItem(Sender: TCustomListView;
Item: TListItem; Rect: TRect; State: TOwnerDrawState);
begin
//When first come here, rect.left = 0, rect.right = 100, which means listview.width = 100.
FillRect(Sender.Canvas.Handle, Rect, GetStockObject(WHITE_BRUSH));
//....
AutoResizeColumn(TListView(Sender), 0);
//set column 0 width to 173
AutoResizeColumn(TListView(Sender), 0);
//set column 1 width to 54
//now row width should be 173 + 54 = 227.
отладить приложение, с процессом следующим образом:о ListView OnDrawItem
, когда первый вызов этой функции, listview.width = 100;
после перерисовки первой строки вызовите AutoResizeColumn для установки listview.width = 227;
затем второй раз в эту функцию, чтобы перерисовать вторую строку, теперь изменен прямоугольный параметр, rect.width = 227;
Функция FillRect должна заполнить прямоугольник шириной = 227, но только заполнить ширину = 100, это означает, что не очистить всю строку?
КСТАТИ: Для почему я задаю этот вопрос, причина каждый раз, когда я рисую второй столбец справа, предыдущие данные второго столбца остается, так что кажется, как 3-х строк (средняя строка предыдущей место истинной 2-й строки, которую нужно очистить, но не).
Обратите внимание, что изменение размеров столбцов не всегда вызывает перерисовку, иногда вы должны 'Invalidate()' ListView принудительно перерисовывать. –