首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于listview OnDrawItem

关于listview OnDrawItem
EN

Stack Overflow用户
提问于 2014-10-18 13:00:50
回答 1查看 426关注 0票数 0
代码语言:javascript
复制
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,这意味着不清除所有行?

顺便说一句:为什么我要问这个问题,因为每次我把第二列画在右边,第二列的前一次数据就会保持不变,所以它看起来是3行(中间行是真正的第2行的前一个位置,应该清理,但不是)。

EN

回答 1

Stack Overflow用户

发布于 2014-10-18 14:47:37

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26439990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档