我有一个图表,显示几行显示频段内的信号强度。
每个图表由一个“区域”和四个“系列”组成。在父表单上有几个图,如下所示。所有这些都是动态创建的,并且具有不同的宽度。
我想要做的是当鼠标悬停在图表的特定区域上时添加工具提示或注释(或其他内容),如下面的模型所示:
如果鼠标移动到图表的另一侧,则会在图表区域周围的框中显示不同的频道编号和频率。
它不必完全如模型中所示,尽管为了向用户显示通道的宽度而不管当时该区域中显示的波形如何,轮廓将是优选的。例如,上面显示的波形可能只有8MHz宽,但通道1本身可能有10MHz宽的分配(设备根据其提供的负载改变其带宽。)
X轴为MHz,通道以MHz为单位定义,因此理想的是根据X轴而不是像素来定义轮廓。
另请注意,这是一张每秒最多更新10次的实时图表。因此,最好每次新数据到达时都不需要更新信息。
答案 0 :(得分:0)
我能够组合几个项目来制作以下解决方案:
[credit LICEcap]
高亮显示是一个填充在图表控件的“OnPaint”方法中的矩形。
该文本是一个简单的TextAnnotation,在mousemove事件期间应用。
需要进行相当多的坐标转换才能将所有部分放在正确的位置 - 尤其是文本。我需要在像素,位置和值之间进行转换。
第一次转换是像素,以便使用MeasureString使文本居中。然后我将其从像素位置转换为X轴值,然后需要将其转换为位置,因为注释需要使用“位置”坐标。没有从像素转换到位置的功能。有一个像素值和一个值位置,这就是我的方式。
我并不认为这是最好的,甚至是正确的方法,但它有效。如果其他人有更好的解决方案或改进我的代码的方法,请发布。
这是我的文本定位代码:
double temp = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(Convert.ToDouble(ce.sChannelFrequency) * 1000);
using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(new Bitmap(1, 1))) {
SizeF size = graphics.MeasureString(freq.Text, new Font("eurostile", 13, FontStyle.Bold, GraphicsUnit.Pixel));
temp -= (size.Width/2+10);
}
if (temp < 0) temp = 0;
temp = chart1.ChartAreas[0].AxisX.PixelPositionToValue(temp);
freq.X = chart1.ChartAreas[0].AxisX.ValueToPosition(temp);