2016-05-18 5 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

私はあなたに役立つコードが必要なので、これを言及します。 –

+0

可能であれば、それを1つの図形で描画することをお勧めします。 – Cyberdrew

答えて

1

GraphicsPath.AddPie + AddLine + AddLine + CloseFigureはあなたのparamsに依存します。

関連する問題