首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将windows窗体报表与径向测量仪结合使用

如何将windows窗体报表与径向测量仪结合使用
EN

Stack Overflow用户
提问于 2019-02-07 17:24:00
回答 2查看 1.4K关注 0票数 0

我试图查找有关如何在windows窗体报表中使用径向仪表盘的信息。我真的在这上面找不到任何东西。不确定是否没有太多关于这方面的信息。有没有人能帮我弄到一些信息?如何在报表查看器中使用文本框中的值在径向仪表盘上显示该值,甚至使用跟踪条来了解如何使用它。

即使在此基础上构建一个小示例也是非常好的:-)

EN

回答 2

Stack Overflow用户

发布于 2019-02-11 17:40:25

即使没有任何外部的东西,你也有几个选择。

  • 您可以在仪表图像上绘制仪表指针。Here就是一个例子。
  • 您可以通过计算外点并向中心绘制一条线,或者像链接中那样旋转画布来将指针绘制到图像上。
  • 或者您可以使用内置的MSChart控件及其圆环图图表类型。

下面是一个这样的例子:

代码很简单:

  • 首先,我们通过添加三个DataPoints来设置图表;然后我们编写一个函数来更新值。

这些要点是为了

  • the open,透明part
  • the scale in red

表示仪表的值。

为了进行测试,我使用以下变量:

代码语言:javascript
复制
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

我的当前值是从跟踪条中提取的。

设置代码:

代码语言:javascript
复制
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;
}

并设置一个值:

代码语言:javascript
复制
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事件中画了一个内圆,如下所示:<代码>H235<代码>F236

代码语言:javascript
复制
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图表只能有one系列。要显示第二个,你需要一个重叠的第二个chartarea,其中包含完全相同的Position

有无数种方法可以绘制内容,无论是从头开始还是更新MsChart控件。脑海中浮现出各种渐变笔刷。添加刻度和指针将涉及旋转代码,它基本上由3行代码组成。

更新:

这是一个绘制仪表指针的示例。

代码应该从Paint事件中调用,并且应该传递一个有效的Graphics对象(read:e.Graphics)、一个数据值的float、一个放置仪表的Rectangle、一个要使用的矩形大小百分比的Color和一个float

代码语言:javascript
复制
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();
    }
}

您可以在任何支持所有者描述的控件中使用它,包括图表:

代码语言:javascript
复制
drawNeedle(e.Graphics, (float)gaugeChart.Series[0].Points[1].YValues[0], r, Color.White, 70f);
票数 2
EN

Stack Overflow用户

发布于 2019-02-07 20:50:14

下面是一个包含TrackBar的简单示例:

代码语言:javascript
复制
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之间同步的滚动事件:

代码语言:javascript
复制
private void trackBar1_Scroll(object sender, EventArgs e)
    {
        needle1.Value = trackBar1.Value;
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54570018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档