2016-05-18 26 views
-3

我对GDI +相当陌生,想知道是否有人可以指导我如何在C#GDI +中创建此形状。我在下面包含了我的代码,目前我只是使用一个图像,但我宁愿只画一个图像。有人可以指导我如何在GDI中创建形状+

我用这个作为参考:

Stack Overflow

enter image description here

public static byte[] RangeGauge(GaugeData data, int size, ImageFormat format) 
     { 
      var min = data.Ranges.Min(t => t.MinValue); 
      var max = data.Ranges.Max(t => t.MaxValue); 
      var rangeTotal = max - min; 
      var value = data.Value; 
      var valueAngle = (((value - min)/rangeTotal) * 270) + 135; 
      using (var bmp = new Bitmap(500, 500)) 
      { 
       bmp.SetResolution(300, 300); 
       using (var g = Graphics.FromImage(bmp)) 
       { 
        g.SmoothingMode = SmoothingMode.HighQuality; 
        g.InterpolationMode = InterpolationMode.HighQualityBilinear; 
        g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
        var rec = new Rectangle(0, 0, 500, 500); 
        g.FillPie(new SolidBrush(Color.White), rec, 45, 90); 
        var startDeg = 135f; 
        foreach (var item in data.Ranges.OrderBy(o => o.MinValue)) 
        { 
         g.FillPie(new SolidBrush(item.TrueColor), rec, startDeg, (float)(((item.MaxValue - item.MinValue)/rangeTotal) * 270)); 
         startDeg = (float)(startDeg + (((item.MaxValue - item.MinValue)/rangeTotal) * 270)); 
        } 
        g.FillEllipse(new SolidBrush(Color.White), new Rectangle(125, 125, 250, 250)); 
        //HERE is where I would rather draw needle 
        using (var needle = Graphics.FromImage(bmp)) 
        { 
         needle.TranslateTransform(250, 250); 
         needle.RotateTransform((float)valueAngle); 
         needle.TranslateTransform(-105, -105); 
         var myAssembly = Assembly.GetExecutingAssembly(); 
         var myStream = myAssembly.GetManifestResourceStream("LoggingService.Needle.png"); 
         needle.DrawImage(Image.FromStream(myStream), new PointF(0, 0)); 
        } 
        g.FillEllipse(new SolidBrush(Color.White), new Rectangle(175, 175, 150, 150)); 
        var sf = new StringFormat 
        { 
         Alignment = StringAlignment.Center, 
         LineAlignment = StringAlignment.Center 
        }; 
        g.TextRenderingHint = TextRenderingHint.AntiAlias; 
        g.DrawString(value.ToString(), new Font(new FontFamily("Impact"), 18, FontStyle.Regular), new SolidBrush(Color.Black), 
         new PointF(250, 250), sf); 
        g.DrawString(data.Label, new Font(new FontFamily("Impact"), 12, FontStyle.Regular), new SolidBrush(Color.Black), 
         new PointF(250, 425), sf); 
       } 
       using (var ms = new MemoryStream()) 
       { 
        if (size == 500) 
        { 
         bmp.Save(ms, format); 
         return ms.ToArray(); 
        } 
        var newBmp = new Bitmap(bmp, size, size); 
        bmp.SetResolution(300, 300); 
        newBmp.Save(ms, format); 
        return ms.ToArray(); 
       } 
      } 
     } 
    public class GaugeData 
    { 
     public Range[] Ranges { get; set; } 
     public double Value { get; set; } 
     public string Label { get; set; } 
    } 
    public class Range 
    { 
     public double MinValue { get; set; } 
     public double MaxValue { get; set; } 
     public string Color { get; set; } 
     internal Color TrueColor => (Color) new ColorConverter().ConvertFromString(Color); 
    } 
+0

你试过画一个圆圈吗?那里有很多例子。一旦你有了这些,最上面的部分只是做一些数学问题,并在其上面绘制一个多边形。如果你想要一个空心的话,它只会变得复杂。 –

+0

我提到这个是因为我们需要代码来帮助你。 http://stackoverflow.com/help/mcve –

+0

如果可能,我宁愿将它绘制成一个形状。 – Cyberdrew

回答

1

GraphicsPath.AddPie + AddLine + AddLine + CloseFigure取决于你PARAMS。

相关问题