////[CLSCompliant(false)] protected override void OnPaintOffScreen(PaintEventArgs e) { // Sort the satellites by signal if (_Satellites == null) { return; } // Decide which collection to display List <Satellite> SatellitesToDraw = null; List <Satellite> SatellitesToRender = null; float BarWidth; try { #if PocketPC if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) { //SatellitesToRender = SatelliteCollection.Random(45); } else { if (_Satellites == null) { return; } SatellitesToRender = new List <Satellite>(); foreach (Satellite satellite in _Satellites) { // Don't draw if the satellite is stale if (!satellite.IsActive) { continue; } // Add it in SatellitesToRender.Add(satellite); } Thread.Sleep(0); } #else if (_Satellites == null) { return; } SatellitesToRender = new List <Satellite>(); for (int index = 0; index < _Satellites.Count; index++) { Satellite satellite = _Satellites[index]; // Don't draw if the satellite is stale if (!satellite.IsActive && !DesignMode) { continue; } // Add it in SatellitesToRender.Add(satellite); } #endif // Make a fake collection if necessary if (SatellitesToRender.Count == 0) { return; } // Sort the list by PRN SatellitesToRender.Sort(); // Calculate the width of each bar float TotalWidth = (Width - _GapWidth) / SatellitesToRender.Count; BarWidth = TotalWidth - _GapWidth; SatellitesToDraw = new List <Satellite>(); // If if the bars are thin, see if we can exclude 0 dB satellites if (BarWidth < 15) { // Display only the satellites with a > 0 dB signal foreach (Satellite satellite in SatellitesToRender) { // Draw if the signal is > 0 if (!satellite.SignalToNoiseRatio.IsEmpty) { SatellitesToDraw.Add(satellite); } } // If there's anything left, recalculate if (SatellitesToDraw.Count == 0) { return; } // Recalculate bar/total width TotalWidth = (Width - _GapWidth) / SatellitesToDraw.Count; BarWidth = TotalWidth - _GapWidth; } else { // Display only the satellites with a > 0 dB signal foreach (Satellite satellite in SatellitesToRender) { // Draw if the signal is > 0 SatellitesToDraw.Add(satellite); } } // Anything to do? if (SatellitesToDraw.Count == 0) { return; } // Now draw each one float StartX = _GapWidth; float StartY = (float)(Height - e.Graphics.MeasureString("10", _PseudorandomNumberFont).Height); float ScaleFactor = (float)(StartY - e.Graphics.MeasureString("10", _SignalStrengthLabelFont).Height) / 50.0f; foreach (Satellite satellite in SatellitesToDraw) { float SatelliteY = StartY - (satellite.SignalToNoiseRatio.Value * ScaleFactor); // Each icon is 30x30, so we'll translate it by half the distance if (satellite.IsFixed) { SizeF PrnSize = e.Graphics.MeasureString(satellite.PseudorandomNumber.ToString(CultureInfo.CurrentCulture), _PseudorandomNumberFont); #if PocketPC e.Graphics.FillEllipse(pSatelliteFixBrush, (int)(StartX + (BarWidth * 0.5) - (PrnSize.Width * 0.5) - 4.0), (int)(StartY - 4), (int)(PrnSize.Width + 8), (int)(PrnSize.Height + 8)); #else using (SolidBrush FixBrush = new SolidBrush(Color.FromArgb(Math.Min(255, _FixedSatellites.Count * 20), _SatelliteFixColor))) { e.Graphics.FillEllipse(FixBrush, (float)(StartX + (BarWidth * 0.5) - (PrnSize.Width * 0.5) - 4.0), StartY - 4, PrnSize.Width + 8, PrnSize.Height + 8); } #endif } StartX += _GapWidth; StartX += BarWidth; } StartX = _GapWidth; foreach (Satellite satellite in SatellitesToDraw) { // If the signal is 0dB, skip it if (satellite.SignalToNoiseRatio.Value == 0) { continue; } // Keep drawing the satellite float SatelliteY = StartY - (Math.Min(satellite.SignalToNoiseRatio.Value, 50) * ScaleFactor); #if PocketPC // Draw a rectangle for each satellite SolidBrush FillBrush = new SolidBrush(GetFillColor(satellite.SignalToNoiseRatio)); e.Graphics.FillRectangle(FillBrush, (int)StartX, (int)SatelliteY, (int)BarWidth, (int)(StartY - SatelliteY)); FillBrush.Dispose(); Pen FillPen = new Pen(GetOutlineColor(satellite.SignalToNoiseRatio)); e.Graphics.DrawRectangle(FillPen, (int)StartX, (int)SatelliteY, (int)BarWidth, (int)(StartY - SatelliteY)); FillPen.Dispose(); #else // Get the fill color Color BarColor = GetFillColor(satellite.SignalToNoiseRatio); float BarHue = BarColor.GetHue(); // Create gradients for a glass effect Color topTopColor = DoubleBufferedControl.ColorFromAhsb(255, BarHue, 0.2958f, 0.7292f); Color topBottomColor = DoubleBufferedControl.ColorFromAhsb(255, BarHue, 0.5875f, 0.35f); Color bottomTopColor = DoubleBufferedControl.ColorFromAhsb(255, BarHue, 0.7458f, 0.2f); Color bottomBottomColor = DoubleBufferedControl.ColorFromAhsb(255, BarHue, 0.6f, 0.4042f); // Draw a rectangle for each satellite RectangleF TopRect = new RectangleF(StartX, SatelliteY, BarWidth, Convert.ToSingle((StartY - SatelliteY) * 0.5)); using (Brush TopFillBrush = new LinearGradientBrush(TopRect, topTopColor, topBottomColor, LinearGradientMode.Vertical)) { e.Graphics.FillRectangle(TopFillBrush, TopRect); } // Draw a rectangle for each satellite RectangleF BottomRect = new RectangleF(StartX, SatelliteY + TopRect.Height, BarWidth, TopRect.Height); using (Brush BottomFillBrush = new LinearGradientBrush(BottomRect, bottomTopColor, bottomBottomColor, LinearGradientMode.Vertical)) { e.Graphics.FillRectangle(BottomFillBrush, BottomRect); } using (Pen FillPen = new Pen(GetOutlineColor(satellite.SignalToNoiseRatio), 1.0f)) { e.Graphics.DrawRectangle(FillPen, StartX, SatelliteY, BarWidth, StartY - SatelliteY); } #endif string PrnString = satellite.PseudorandomNumber.ToString(CultureInfo.CurrentCulture); SizeF PrnSize = e.Graphics.MeasureString(PrnString, _PseudorandomNumberFont); e.Graphics.DrawString(PrnString, _PseudorandomNumberFont, _PseudorandomNumberBrush, (float)(StartX + (BarWidth * 0.5) - (PrnSize.Width * 0.5)), StartY); string RenderString = satellite.SignalToNoiseRatio.ToString("0 dB", CultureInfo.CurrentCulture); SizeF SignalSize = e.Graphics.MeasureString(RenderString, _SignalStrengthLabelFont); if (SignalSize.Width > BarWidth) { RenderString = satellite.SignalToNoiseRatio.ToString("0 dB", CultureInfo.CurrentCulture).Replace(" dB", ""); SignalSize = e.Graphics.MeasureString(RenderString, _SignalStrengthLabelFont); } e.Graphics.DrawString(RenderString, _SignalStrengthLabelFont, _SignalStrengthLabelBrush, (float)(StartX + (BarWidth * 0.5) - (SignalSize.Width * 0.5)), SatelliteY - SignalSize.Height); StartX += _GapWidth; StartX += BarWidth; } } catch (NullReferenceException) { // Don't throw because the control is shutting down } catch { throw; } // finally // { // if (SatellitesToDraw != null) // SatellitesToDraw.Dispose(); // if (SatellitesToRender != null) // SatellitesToRender.Dispose(); // } }
protected override void OnBackColorChanged(EventArgs e) { base.OnBackColorChanged(e); Color BackgroundColor; if (BackColor.Equals(Color.Transparent)) { if (Parent != null) { BackgroundColor = Parent.BackColor; } else { BackgroundColor = Color.White; } } else { BackgroundColor = BackColor; } // Get the hue of the background color float hue = BackgroundColor.GetHue(); float saturation = BackgroundColor.GetSaturation(); float bright = BackgroundColor.GetBrightness(); float alpha = BackgroundColor.A; // Get a value which is darker or lighter CircleEdge = DoubleBufferedControl.ColorFromAhsb(220, hue, saturation, bright * 0.2f); CircleBack = DoubleBufferedControl.ColorFromAhsb(190, hue, saturation, bright * 0.4f); CircleCenter = DoubleBufferedControl.ColorFromAhsb(210, hue, saturation, bright * 0.7f); CircleBright = DoubleBufferedControl.ColorFromAhsb(250, hue, saturation, bright * 1.0f); #region Draw the faded edge of the circle to give spherical depth GlassShadowColorBlend.Colors = new Color[] { CircleEdge, CircleBack, CircleCenter, CircleCenter }; GlassShadowColorBlend.Positions = new float[] { 0.00F, 0.25f, 0.7f, 1.0f }; #endregion #region Set the colors of the reflection // If the background color is black, make the class reflection white if (BackgroundColor.Equals(Color.Black)) { float WhiteHue = Color.White.GetHue(); float WhiteSaturation = Color.White.GetSaturation(); float WhiteBright = Color.White.GetBrightness(); CircleCenter = DoubleBufferedControl.ColorFromAhsb(210, WhiteHue, WhiteSaturation, WhiteBright * 0.7f); CircleBright = DoubleBufferedControl.ColorFromAhsb(250, WhiteHue, WhiteSaturation, WhiteBright * 1.0f); GlassReflectionColorBlend.Colors = new Color[] { CircleBright, Color.FromArgb(200, CircleCenter), Color.FromArgb(10, CircleCenter), Color.Transparent }; } else { Color NearWhite = DoubleBufferedControl.ColorFromAhsb(255, hue, saturation, 1.0f); GlassReflectionColorBlend.Colors = new Color[] { NearWhite, Color.FromArgb(200, CircleCenter), Color.FromArgb(10, CircleCenter), Color.Transparent }; } GlassReflectionColorBlend.Positions = new float[] { 0F, 0.15f, 0.35F, 1.0f }; MakeBrushes(); #endregion }