关于listview OnDrawItem

时间:2014-10-18 13:00:51

标签: delphi

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.

我调试应用程序,流程如下:

  1. 首次调用此函数时,listview.width = 100;

  2. 重绘第一行后,调用AutoResizeColumn设置listview.width = 227;

  3. 然后第二次进入这个函数,重绘第二行,现在rect参数改变了,rect.width = 227;

  4. 所以FillRect函数应填充宽度= 227的矩形,但它只填充宽度= 100,这意味着不能清除所有行?

  5. BTW:为什么我问这个问题,每次我把第二列画到右边的原因,第二列的先前数据仍然存在,所以看起来像是3行(中间行是真实的前一个地方)第二行,应该清理,但不是。)

1 个答案:

答案 0 :(得分:2)

除了根据所有内容的当前状态(包括列宽)绘制项目之外,您不应该在DrawItem事件处理程序中执行任何操作。然后,当关于列表视图的任何更改需要绘制项目时,DrawItem将触发。不要改变DrawItem中的列宽。在其他地方更改它们,然后如果更改需要绘制项目,则将调用DrawItem。