csharp
private void AddStatisticsAnnotations(ChartArea chartArea, int channelIndex)
{
RemoveExistingAnnotations(channelIndex);
// 获取ChartArea的相对坐标(百分比)
float chartAreaX = chartArea.Position.X; // X坐标(百分比)
float chartAreaY = chartArea.Position.Y; // Y坐标(百分比)
float chartAreaWidth = chartArea.Position.Width; // 宽度(百分比)
float chartAreaHeight = chartArea.Position.Height; // 高度(百分比)
// 设置相对偏移量(百分比)
float offsetX = 10f; // 水平偏移(百分比)
float offsetY = 5f; // 垂直偏移(百分比)
// 计算注释的相对坐标(相对于整个Chart控件)
float posX = chartAreaX + offsetX;
float posY = chartAreaY + offsetY;
// 创建并配置注释
Color textColor = _channelColors[channelIndex % _channelColors.Length];
// 创建包含所有统计信息的多行文本
string annotationText = $"Max: - V\nAvg: - V\nMin: - V";
TextAnnotation annotation = new TextAnnotation
{
Name = $"StatsAnnotation{channelIndex}",
Text = annotationText,
ForeColor = textColor,
X = posX,
Y = posY,
Alignment = ContentAlignment.TopLeft,
ClipToChartArea = chartArea.Name,
IsSizeAlwaysRelative = true, // 使用相对坐标
Font = new Font("Arial", 10) // 设置合适的字体大小
};
chartWaveform.Annotations.Add(annotation);
//Console.WriteLine($"Added {annotation.Name} at ({annotation.X}%, {annotation.Y}%)");
}
private void RemoveExistingAnnotations(int channelIndex)
{
// 移除旧的统计注释
string annotationName = $"StatsAnnotation{channelIndex}";
var annotation = chartWaveform.Annotations.FindByName(annotationName);
if (annotation != null)
{
chartWaveform.Annotations.Remove(annotation);
}
}
private void UpdateChannelStatistics(int channelIndex, List<ushort> values)
{
if (values == null || values.Count == 0) return;
// 计算统计值
double maxAdc = values[0];
double minAdc = values[0];
double sumAdc = 0;
foreach (var value in values)
{
if (value > maxAdc) maxAdc = value;
if (value < minAdc) minAdc = value;
sumAdc += value;
}
double avgAdc = sumAdc / values.Count;
// 转换为电压值
double maxAdcValue = Math.Pow(2, adcBit) - 1;
double maxVoltage = vref / 1000.0;
double maxV = (maxAdc / maxAdcValue) * maxVoltage;
double minV = (minAdc / maxAdcValue) * maxVoltage;
double avgV = (avgAdc / maxAdcValue) * maxVoltage;
// 更新单个注释的文本
UpdateStatsAnnotationText(channelIndex, maxV, avgV, minV);
}
private void UpdateStatsAnnotationText(int channelIndex, double maxV, double avgV, double minV)
{
string annotationName = $"StatsAnnotation{channelIndex}";
var annotation = chartWaveform.Annotations.FindByName(annotationName) as TextAnnotation;
if (annotation != null)
{
annotation.Text = $"Max: {maxV:F3}V\nAvg: {avgV:F3}V\nMin: {minV:F3}V";
}
}
// 为每个通道添加统计注释
AddStatisticsAnnotations(chartWaveform.ChartAreas[ch], ch);
// 计算并更新统计信息
UpdateChannelStatistics(ch, channelValues[ch]);