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.width = 100;
重绘第一行后,调用AutoResizeColumn设置listview.width = 227;
然后第二次进入这个函数,重绘第二行,现在rect参数改变了,rect.width = 227;
所以FillRect函数应填充宽度= 227的矩形,但它只填充宽度= 100,这意味着不能清除所有行?
答案 0 :(得分:2)
除了根据所有内容的当前状态(包括列宽)绘制项目之外,您不应该在DrawItem事件处理程序中执行任何操作。然后,当关于列表视图的任何更改需要绘制项目时,DrawItem将触发。不要改变DrawItem中的列宽。在其他地方更改它们,然后如果更改需要绘制项目,则将调用DrawItem。