我需要绘制由两个子部分组成的甘特图--一个用具有自定义位图的画笔绘制,另一个简单地用某种指定的颜色着色。这些子部分具有可变的长度,这使得不可能具有用于绘制的预设位图。
我目前使用的解决方案是有两个TGanttSeries实例,第一个用来显示第一种子节,第二种用来显示另一种子节。这是一种相当麻烦的方法,它提供了额外的挑战,其中一些操作需要在一个甘特图上执行,该甘特图在视觉上看起来是一个单一实体,但实际上由来自两个不同TGanttSeries实例的两个不同甘特图组成。
有没有可能在TGanttSeries中提供甘特图的自定义绘制,其中单个表示为矩形的甘特图可以有几个不同绘制的子节?
发布于 2013-05-29 15:56:33
从TGanttSeries继承的覆盖方法DrawValue似乎提供了最灵活的方法,通过直接在ParentChart.Canvas对象上绘制来控制单个点(甘特图)的绘制。
然而,根据我的经验,如果需要模拟这样一种情况,即单个甘特图由几个部分组成,这些部分应该对鼠标事件做出反应,并具有单独的标记,那么潜在的更好的方法是提供一个TGanttSeries后代,它为每个这样的部分聚合单独的TGanttSeries实例。然后,这种TGanttSeries后代将被添加到TChart的实例中,以控制所有聚合系列组件的行为。
下面是使用这种方法的一个示例--相邻的甘特图就像一个单独的甘特图,同时提供了一种简单的方法来在编程上区分两个部分(例如,用于事件处理):
发布于 2013-05-22 21:01:21
您可以尝试按照Yeray建议的here使用OnGetPointerStyle事件。
以下是链接中的示例:
private
{ Private declarations }
Function SeriesGetPointerStyle(Sender:TChartSeries; ValueIndex:Integer):TSeriesPointerStyle;
//...
procedure TForm1.FormCreate(Sender: TObject);
begin
with Chart1.AddSeries(TGanttSeries) as TGanttSeries do
begin
Pointer.VertSize:=10;
FillSampleValues(10);
OnGetPointerStyle:=SeriesGetPointerStyle;
end;
end;
Function TForm1.SeriesGetPointerStyle(Sender:TChartSeries; ValueIndex:Integer):TSeriesPointerStyle;
begin
Chart1.Canvas.Brush.Style:=TBrushStyle(2+(ValueIndex mod 6));
result:=psRectangle;
end;
https://stackoverflow.com/questions/16667359
复制相似问题