我试图在Windows窗体报告中找到有关如何使用径向规的信息。 我真的找不到任何东西。不确定是否没有太多信息。 有没有人可以向我提供一些信息?我将如何使用报表查看器中文本框中的值在径向量规上显示该值,甚至使用跟踪栏来了解如何使用它。
即使在此基础上建立一个小例子也非常好:-)
答案 0 :(得分:1)
即使没有任何外部内容,您也可以有几种选择。
您可以在量规图像上绘制量规针。 Here是一个示例。
您可以通过计算外部点并向中心画一条线,或通过旋转链接中的画布来将针头绘制到图像上。
或者您可以使用内置的MSChart控件及其Donut图表类型。
这里是一个例子:
代码很简单:
DataPoints
来设置图表;然后我们编写一个函数来更新值。要点是
对于测试,我使用以下变量:
double valMin = 0; // user data minimum
double valMax = 100; // ~ maximum
float angle = 60; // open pie angle at the bottom
string valFmt = "{0}°"; // a format string
我的当前值是从跟踪栏中提取的。
设置代码:
void setupChartGauge(double val, double vMin, double vMax, float a)
{
valMin = vMin;
valMax = vMax;
angle = a;
Series s = gaugeChart.Series[0];
s.ChartType = SeriesChartType.Doughnut;
s.SetCustomProperty("PieStartAngle", (90 - angle/2) + "");
s.SetCustomProperty("DoughnutRadius", "10");
s.Points.Clear();
s.Points.AddY(angle);
s.Points.AddY(0);
s.Points.AddY(0);
setChartGauge(0);
s.Points[0].Color = Color.Transparent;
s.Points[1].Color = Color.Chartreuse;
s.Points[2].Color = Color.Tomato;
}
并设置一个值:
void setChartGauge(double val)
{
Series s = gaugeChart.Series[0];
double range = valMax - valMin;
double aRange = 360 - angle;
double f = aRange / range;
double v1 = val * f;
double v2 = (range - val) * f;
s.Points[1].YValues[0] = v1;
s.Points[2].YValues[0] = v2;
gaugeChart.Titles[0].Text = String.Format(valFmt, val);
gaugeChart.Refresh();
}
我添加了最少的样式:
Chart
有一个Title
停靠的居中底部,我也进行了更新Paint
事件中绘制一个内圈,如下所示:e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
Rectangle r = chart1.ClientRectangle;
r.Inflate(-10, -10);
using (SolidBrush brush = new SolidBrush(Color.FromArgb(55, Color.Beige)))
e.Graphics.FillEllipse(brush, r);
请注意,Pie
和Doughnut
图表只能具有一个系列。要显示第二个图表,您需要一个重叠第二个图表,它们具有完全相同的Position
。
从头开始或更新MsChart控件有无数种绘制内容的方法。各种渐变笔刷浮现在脑海。添加刻度和针将涉及旋转代码,该代码基本上包括3行代码。
更新:
这里是绘制量规针的示例。
应从Paint
事件中调用代码,并应传递有效的Graphics
对象(读取:e.Graphics
),数据值的float
, Rectangle
用于放置量规,Color
和float
用于使用矩形尺寸的百分比。
private void drawNeedle(Graphics g, float val, Rectangle r, Color c, float length)
{
Point pc = new Point(r.X + r.Width / 2, r.Y + r.Height / 2);
Point p2 = new Point((int)( pc.X + r.Width / 2 * length / 100f), pc.Y);
using (Pen pen = new Pen(c, 3f)
{ StartCap = LineCap.RoundAnchor, EndCap = LineCap.ArrowAnchor })
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TranslateTransform(pc.X, pc.Y);
g.RotateTransform(val - (270 - angle / 2));
g.TranslateTransform(-pc.X, -pc.Y);
g.DrawLine(pen, pc, p2);
g.ResetTransform();
}
}
您可以在任何支持所有者绘图的控件中使用它,包括图表。
drawNeedle(e.Graphics, (float)gaugeChart.Series[0].Points[1].YValues[0], r, Color.White, 70f);
答案 1 :(得分:-1)
这是一个带有TrackBar的简单示例:
private Syncfusion.Windows.Forms.Gauge.RadialGauge radialGauge1;
private System.Windows.Forms.TrackBar trackBar1;
private Syncfusion.Windows.Forms.Gauge.Needle needle1;
private void InitializeComponent()
{
this.needle1 = new Syncfusion.Windows.Forms.Gauge.Needle();
this.needle1.Value = 0F;
this.trackBar1 = new System.Windows.Forms.TrackBar();
this.radialGauge1 = new Syncfusion.Windows.Forms.Gauge.RadialGauge();
this.trackBar1.Value = (int) needle1.Value;
this.radialGauge1.EnableCustomNeedles = true;
this.radialGauge1.NeedleCollection.Add(needle1);
this.radialGauge1.Size = new System.Drawing.Size(230, 230);
this.radialGauge1.TabIndex = 0;
this.trackBar1.Scroll += new System.EventHandler(this.trackBar1_Scroll);
}
还有一个滚动事件,该事件在gauge和trackBar之间同步:
private void trackBar1_Scroll(object sender, EventArgs e)
{
needle1.Value = trackBar1.Value;
}