1

执行水平滚动时,我在使用OnAfterItemPaint事件进行绘图时遇到问题。

基本上我想要实现的是合并选定的单元格效果,例如第 1 列和第 2 列的 1 个文本,第 3 列和第 4 列的另一个文本等......到目前为止,VT 不支持列合并,所以我必须手动绘制它。

我应该使用解决方法或其他事件吗?

使用:Delphi 7 + VirtualTreeview 4.8.5

事件来源:

begin
  TargetCanvas.TextOut(ItemRect.Left+ VT1.OffsetX, ItemRect.Top,
    '1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF');
end;

滚动前:

替代文字 http://a.imagehost.org/0869/screen1.gif

滚动后(向右滚动,然后向左滚动):

替代文字 http://a.imagehost.org/0645/screen2.gif

4

2 回答 2

1

很难说出您想要实现的目标,但是看到您有一个跨越多列的长文本,我不确定您是否使用了正确的事件 - 通常如果文本对于它的列来说太长,您希望将其截断。

无论如何,最好的办法是阅读VirtualTreeView.pdf文档文件中的第 5.2 节“绘制周期和阶段”,并找到要用于绘制的适当事件。因为OnAfterItemPaint它说:

后项绘制阶段用于添加节点特定的内容,例如框架等,这些内容涉及该节点的所有列,并且每个节点调用一次。

所以我想它可能不是你想要使用的那个。

编辑:

好的,如果您要合并单元格,您只需要删除添加VT1.OffsetX(并VT1.TextMargin改为添加)即可获得正确的行为。这当然假设您希望在第一列(索引 0)中开始文本输出,否则您必须根据列宽计算水平文本位置。

但从绘画阶段的描述来看,我仍然宁愿使用BeforeItemPaint事件并将CustomDrawvar 参数设置True为跳过任何默认绘画。

于 2009-10-04T13:44:25.827 回答
0

你有没有试过这个:

TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];

它几乎可以满足您的需求。他们唯一的问题可能是您无法指定启用它的列。您可以通过将单元格文本设置为您不想跨越的列的空白来解决此问题。

于 2009-10-05T10:58:42.363 回答