如何使用带有径向量规的Windows窗体报告

时间:2019-02-07 09:24:00

标签: c# windows forms controls report

我试图在Windows窗体报告中找到有关如何使用径向规的信息。 我真的找不到任何东西。不确定是否没有太多信息。 有没有人可以向我提供一些信息?我将如何使用报表查看器中文本框中的值在径向量规上显示该值,甚至使用跟踪栏来了解如何使用它。

即使在此基础上建立一个小例子也非常好:-)

2 个答案:

答案 0 :(得分:1)

即使没有任何外部内容,您也可以有几种选择。

  • 您可以在量规图像上绘制量规针。 Here是一个示例。

  • 您可以通过计算外部点并向中心画一条线,或通过旋转链接中的画布来将针头绘制到图像上。

  • 或者您可以使用内置的MSChart控件及其Donut图表类型。

这里是一个例子:

enter image description here

代码很简单:

  • 首先,我们通过添加三个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);

请注意,PieDoughnut图表只能具有一个系列。要显示第二个图表,您需要一个重叠第二个图表,它们具有完全相同的Position

从头开始或更新MsChart控件有无数种绘制内容的方法。各种渐变笔刷浮现在脑海。添加刻度和针将涉及旋转代码,该代码基本上包括3行代码。

更新

这里是绘制量规针的示例。

应从Paint事件中调用代码,并应传递有效的Graphics对象(读取:e.Graphics),数据值的floatRectangle用于放置量规,Colorfloat用于使用矩形尺寸的百分比。

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;
    }