using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace ArdupilotMega.Controls { public partial class HSI : UserControl { Bitmap _headingimage; bool drawnheading = false; int _heading = 0; int _navbearing = 0; [System.ComponentModel.Browsable(true)] public int Heading { get { return _heading; } set { _heading = value; this.Invalidate(); } } [System.ComponentModel.Browsable(true)] public int NavHeading { get { return _navbearing; } set { _navbearing = value; } } /// /// Override to prevent offscreen drawing the control - mono mac /// public new void Invalidate() { if (!ThisReallyVisible()) { return; } base.Invalidate(); } /// /// this is to fix a mono off screen drawing issue /// /// public bool ThisReallyVisible() { Control ctl = Control.FromHandle(this.Handle); return ctl.Visible; } public HSI() { InitializeComponent(); _headingimage = new Bitmap(this.Width, this.Height); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); int _radiusinside = (int)(Width / 3.6f); int _radiusoutside = (int)(Width / 2.2f); // drawnheading = false; if (drawnheading == false || this.DesignMode) { _headingimage = new Bitmap(Width, Height); Graphics g = Graphics.FromImage(_headingimage); g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //Graphics g = e.Graphics; g.TranslateTransform(this.Width/2,this.Height /2); int font = this.Width / 14; for (int a = 0; a <= 360; a += 5) { if (a == 0) { g.DrawString("N".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside)); g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11); } else if (a == 90) { g.DrawString("E".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside)); g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11); } else if (a == 180) { g.DrawString("S".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside)); g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11); } else if (a == 270) { g.DrawString("W".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside)); g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11); } else if (a == 360) { // ignore it, as we process it at 0 } else if ((a % 30) == 0) // number labeled { g.DrawString((a / 10).ToString("0").PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside)); g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11); } else if (a % 10 == 0) // larger line { g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 7); } else if (a % 5 == 0) // small line { g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 4); } g.RotateTransform(5); } g.ResetTransform(); drawnheading = true; } e.Graphics.TranslateTransform(Width / 2, Height / 2); e.Graphics.RotateTransform(-Heading); e.Graphics.DrawImage(_headingimage, new Rectangle(-Width / 2, - Height/2,Width,Height)); e.Graphics.RotateTransform(Heading); Pen or = new Pen(Color.DarkOrange,2); // body e.Graphics.DrawLine(or, 0, 30, 0, -10); // wing e.Graphics.DrawLine(or, -30, 0, 30, 0); //tail e.Graphics.DrawLine(or, -10, 25, 10, 25); e.Graphics.DrawLine(new Pen(Color.White,2),0,-_radiusoutside,0,-_radiusinside); e.Graphics.RotateTransform(NavHeading - Heading); Point[] headbug = new Point[7]; headbug[0] = new Point(-5, -_radiusoutside + 0); headbug[1] = new Point(-5, -_radiusoutside + 4); headbug[2] = new Point(-3, -_radiusoutside + 4); headbug[3] = new Point(0, -_radiusoutside + 8); headbug[4] = new Point(3, -_radiusoutside + 4); headbug[5] = new Point(5, -_radiusoutside + 4); headbug[6] = new Point(5, -_radiusoutside + 0); e.Graphics.DrawLines(or, headbug); // this.Invalidate(); } protected override void OnResize(EventArgs e) { Width = Height; base.OnResize(e); this.Invalidate(); drawnheading = false; } } }