执行水平滚动时,我遇到使用 OnAfterItemPaint 事件绘图的问题。
基本上我想要实现的是所选单元格效果的合并,例如第1列和第1列的1个文本。 2,第3栏和第3栏的另一个文字4,等等......到目前为止,VT对列合并没有任何支持,所以我必须手动绘制它。
是否应该使用变通方法或其他事件?
使用:Delphi 7 + VirtualTreeview 4.8.5
活动来源:
begin
TargetCanvas.TextOut(ItemRect.Left+ VT1.OffsetX, ItemRect.Top,
'1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF');
end;
滚动前:
alt text http://a.imagehost.org/0869/screen1.gif
滚动后(向右滚动,然后向左滚动):
答案 0 :(得分:1)
很难说你想要实现什么,但是看到你有一个跨越多列的长文本我不确定你是否使用了正确的事件 - 通常你想要文本被截断,如果它的列太长了
无论如何,最好的方法是阅读VirtualTreeView.pdf文档文件中的第5.2节“绘制循环和阶段”,并找到要用于绘制内容的正确事件。对于OnAfterItemPaint
,它声明:
后项目绘制阶段用于添加节点特定的东西,如帧等 它涉及该节点的所有列,每个节点调用一次。
所以我猜它可能不你想要使用的那个。
修改强>
好的,如果您要进行单元格的合并,则只需删除VT1.OffsetX
的添加(并添加VT1.TextMargin
)即可获得正确的行为。当然,您假设要在第一个(索引0)列中启动文本输出,否则必须从列宽度计算水平文本位置。
但是从绘画阶段的描述中我仍然宁愿使用BeforeItemPaint
事件并将CustomDraw
var参数设置为True
以跳过任何默认绘画。
答案 1 :(得分:0)
你试过这个:
TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];
它几乎可以满足您的需求。它们唯一的问题可能是您无法指定启用哪些列。您可以通过将celltext设置为您不想跨越的列的空白来限制此问题。