2014-10-18 106 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. 

我調試應用程序,與處理如下:大約列表視圖的OnDrawItem

  1. 第一呼叫時該功能,listview.width = 100;

  2. 重繪第一行後,調用AutoResizeColumn設置listview.width = 227;

  3. 然後第二次進入這個函數,重畫第二行,現在rect參數改變了,rect.width = 227;

  4. 所以FillRect函數應該填充一個寬度爲227的矩形,但它只填充寬度= 100,這意味着不乾淨所有的行?

BTW:我爲什麼問這個問題,每次的原因我畫的第二列到右側,第二列的以前的數據仍然存在,因此它似乎爲3行(中間行是以前的真正的第二排的地方,應該清理,但不是)。

回答

2

除了根據當前所有狀態(包括列寬)繪製項目之外,您不應該在DrawItem事件處理函數內執行任何操作。然後,當有關列表視圖的任何變化需要繪製項目時,DrawItem將會觸發。不要更改DrawItem內的列寬。在其他地方更改它們,然後如果更改需要繪製項目,則會調用DrawItem。

+0

請注意,調整列大小並不總是觸發重繪,有時您必須'Invalidate()'ListView強制重繪。 – 2014-10-18 14:58:33