2014-10-18 3 views
0
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

  1. , когда первый вызов этой функции, listview.width = 100;

  2. после перерисовки первой строки вызовите AutoResizeColumn для установки listview.width = 227;

  3. затем второй раз в эту функцию, чтобы перерисовать вторую строку, теперь изменен прямоугольный параметр, rect.width = 227;

  4. Функция FillRect должна заполнить прямоугольник шириной = 227, но только заполнить ширину = 100, это означает, что не очистить всю строку?

КСТАТИ: Для почему я задаю этот вопрос, причина каждый раз, когда я рисую второй столбец справа, предыдущие данные второго столбца остается, так что кажется, как 3-х строк (средняя строка предыдущей место истинной 2-й строки, которую нужно очистить, но не).

ответ

2

Вы не должны ничего делать в обработчике события DrawItem, кроме рисования элемента на основе текущего состояния всего, включая ширину столбца. Затем, когда что-либо об изменениях в представлении списка, которое требует рисования элемента, DrawItem будет срабатывать. Не изменяйте ширину столбцов внутри DrawItem. Измените их в другом месте, затем, если для изменения требуется, чтобы элемент был нарисован, будет вызываться DrawItem.

+0

Обратите внимание, что изменение размеров столбцов не всегда вызывает перерисовку, иногда вы должны 'Invalidate()' ListView принудительно перерисовывать. –

Смежные вопросы