DevExpress VCL拥有230+个VCL界面控件、40+个自定义设计的VCL应用主题,它能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。
在刚更新的DevExpress VCL v23.1组件库中,包含了以下新的一些特性/功能:
- 增强的高DPI分辨率支持
- "Light" 样式渲染
- Windows 11主题
- VCL图表控件
在本文中,我们将重点介绍v23.1版本的图标控件中实现的一个重要特性——自定义轴、系列和总标签显示文本的功能,这个新功能对多种使用场景都十分有用,包括需要对所有值标签应用格式化模式、强调某些轴/系列值、为不同数量级显示不同的测量单位等。
DevExpress VCL v23.1正式版下载(Q技术交流:523159565)
如何将格式化模式应用于值标签
DevExpress VCL Chart控件现在支持高级格式化模式,类似于我们的WinForms Chart控件,格式化模式可以由静态文本和一个或多个支持的占位符字段标记组成,这些占位符字段标记包含在大括号中。
所有显示数值的占位符标记也支持数值格式模式,例如,下面的格式化模式显示具有两位小数点的浮点序列值:{V:0.00},大括号外的文本定义了相同格式化模式的通用值标签。
您可以将相同/不同的格式化模式分配给图表、参数轴、值轴或简单序列的总标签中所有序列值的标签。
系列值标签自定义
没有格式化模式的序列值标签按原样显示值,简单系列也向标签添加相应的参数。
要在设计时将格式化模式应用于所有值标签(对于一个系列),您必须:
- 双击Chart控件来调用Chart Designer对话框。
- 选择目标系列。
- 在Object Inspector(对象检查器)中展开View 和 ValueLabels 节点。
- 为TextFormat属性指定一个格式模式(例如{V:0.00}M km²)。
在这个特殊的实例中,值标签显示带有两个小数点后跟着一个度量单位的序列值。
总标签自定义
要自定义显示在Doughnut系列中心的Total标签,您必须:
- 确保选择了目标系列。
- 在Object Inspector(对象检查器)中展开View 和TotalLabel 节点。
- 将相同的格式化模式分配给 TextFormat 属性。
完成后,Total标签将使用与value标签相同的格式:
如何自定义个性化值标签
除了格式化模式(用于自定义值标签中的显示文本)之外,还可以根据特定条件自定义单个标签——例如,可以隐藏中间点的值标签,或者为不同的数量级显示不同的测量单位。DevExpress VCL的图表类包括以下值标签自定义事件,这些事件在Chart控件决定如何绘制单个标签时发生:
- OnGetValueLabelDrawParameters 和 OnGetAxisValueLabelDrawParameters 事件在XY图中可用,并允许您分别自定义系列和轴值标签。
- OnGetValueLabelDrawParameters 和 OnGetTotalLabelDrawParameters事件在一个简单的图表中可用,并允许您分别自定义系列值和总标签。
用户可以处理这些事件来标识当前处理的标签,并定义Chart控件在屏幕上绘制标签的方式。例如,您可以通过以下方式在标记不同数量级的轴和序列值的标签中显示不同的测量单位:
- 如果一个序列值超过100万,对应的值标签会显示百万数字后面的M字符。
- 如果序列值超过1000但小于100万,则相应的值标签显示后面跟着k字符的千位数字。
要实现这一点,需要处理 OnGetValueLabelDrawParameters 事件:
procedure TMyForm.cdAreaGetValueLabelDrawParameters(Sender: TdxChartCustomDiagram;
AArgs: TdxChartGetValueLabelDrawParametersEventArgs);
begin
if AArgs.SeriesPoint.Value >= 1000 * 1000 then // Millions
AArgs.Text := Format('%.1fM', [AArgs.SeriesPoint.Value / (1000 * 1000)])
else if AArgs.SeriesPoint.Value >= 1000 then // Thousands
AArgs.Text := Format('%.0fk', [AArgs.SeriesPoint.Value / 1000])
else
AArgs.Text := Format('%0f', [AArgs.SeriesPoint.Value]);
end;
然后,处理OnGetAxisValueLabelDrawParameters事件:
procedure TMyForm.cdAreaGetAxisValueLabelDrawParameters(Sender: TdxChartCustomDiagram;
AArgs: TdxChartGetAxisValueLabelDrawParametersEventArgs);
begin
if AArgs.Axis.ClassName <> 'TdxChartAxisY' then Exit;
if AArgs.Value >= 1000 * 1000 then // Millions
AArgs.Text := Format('%.1fM', [AArgs.Value / (1000 * 1000)])
else if AArgs.Value >= 1000 then // Thousands
AArgs.Text := Format('%.0fk', [AArgs.Value / 1000])
else
AArgs.Text := Format('%0f', [AArgs.Value]);
end;
因此,序列和轴值标签显示不同数量级的不同测量单位: