protected override void OnPaint(PaintEventArgs e) { if (!Visible) { return; // || (m_minValue == m_maxValue)) return; } base.OnPaint(e); // draw border Brush br = new SolidBrush(ForeColor); Rectangle drawSpace = ClientRectangle; Pen pen = new Pen(br); // draw labels drawSpace.Location = new Point(Padding.Left, Padding.Top); drawSpace.Width = ClientRectangle.Width - Padding.Horizontal; drawSpace.Height = ClientRectangle.Height - Padding.Vertical; string format = String.Format("g{0}", m_precision); SizeF labsize = e.Graphics.MeasureString(String.Format(".-e08" + new String('0', m_precision)), Font); int tickCount; if (m_orientation == TextOrientation.Vertical) { tickCount = (int)Math.Floor((double)(drawSpace.Height - labsize.Height) / (labsize.Height + m_tickLabelsPadding)); } else { tickCount = (int)Math.Floor((double)(drawSpace.Width - labsize.Width) / (labsize.Width + m_tickLabelsPadding)); } List <float> labels = Collections.ILTickCollection.NiceLabels(m_minValue, m_maxValue, tickCount, TickLabelRenderingHint.Auto); tickCount = labels.Count; // draw labels RectangleF dR; List <int> tickPositions = new List <int>(tickCount); if (m_orientation == TextOrientation.Vertical) { dR = new RectangleF(drawSpace.Left, drawSpace.Top + drawSpace.Height - labsize.Height, labsize.Width, labsize.Height); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Far; sf.LineAlignment = StringAlignment.Near; // draw all values in between float offsY = drawSpace.Top + drawSpace.Height; float mult = (drawSpace.Height) / (m_maxValue - m_minValue); foreach (float curVal in labels) { // translate into screen coords dR.Y = (int)(offsY - (curVal - m_minValue) * mult); tickPositions.Add((int)dR.Y); dR.Y -= (labsize.Height / 2); e.Graphics.DrawString(curVal.ToString(format), Font, br, dR, sf); } // prepare remaining space for gradient scale drawSpace.X += (int)(labsize.Width + 2 * m_tickLabelsPadding); drawSpace.Width -= (int)(labsize.Width + 2 * m_tickLabelsPadding); } else { // draw labels above gradient scale dR = new RectangleF(drawSpace.Left, drawSpace.Top, labsize.Width, labsize.Height); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; e.Graphics.DrawString(m_minValue.ToString(format), Font, br, dR, sf); tickPositions.Add(drawSpace.Left); // draw maximum sf.Alignment = StringAlignment.Far; dR.X = drawSpace.Left + drawSpace.Width - labsize.Width; e.Graphics.DrawString(m_maxValue.ToString(format), Font, br, dR, sf); tickPositions.Add(drawSpace.Left + drawSpace.Width); sf.Alignment = StringAlignment.Center; // draw all values in between float mult = (drawSpace.Width) / (m_maxValue - m_minValue); foreach (float curVal in labels) // = ls; curVal <= m_maxValue - m/2; curVal = (float) (curVal + m)) { // translate into screen coords { dR.X = (int)((curVal - m_minValue) * mult); if (dR.X < drawSpace.Left + labsize.Width) { continue; } if (dR.X > drawSpace.Left + drawSpace.Width - labsize.Width) { continue; } tickPositions.Add((int)dR.X); dR.X -= (labsize.Width / 2); e.Graphics.DrawString(curVal.ToString(format), Font, br, dR, sf); } // prep. rem. space for gradient scale drawSpace.Y += (int)(labsize.Height + 2 * m_tickLabelsPadding); drawSpace.Height -= (int)(labsize.Height + 2 * m_tickLabelsPadding); } // draw color gradient: border (gray) pen.Color = Color.FromArgb(180, 180, 180); e.Graphics.DrawRectangle(pen, drawSpace); drawSpace.X += 1; drawSpace.Y += 1; drawSpace.Width -= 1; drawSpace.Height -= 1; Internal.ILColorProvider hls = new Internal.ILColorProvider(0.0f, 0.5f, 1.0f); if (m_orientation == TextOrientation.Vertical) { for (int i = drawSpace.Height; i-- > 0;) { pen.Color = m_colormap.Map((drawSpace.Height - i) / (double)drawSpace.Height * m_colormap.Length); e.Graphics.DrawLine(pen, drawSpace.Left, drawSpace.Top + i, drawSpace.Left + drawSpace.Width, drawSpace.Top + i); } // draw tick bars int le = drawSpace.Left, re = drawSpace.Left + drawSpace.Width, le2 = le + (re - le) / 4, re2 = re - (re - le) / 4; pen.Color = ForeColor; foreach (int y in tickPositions) { e.Graphics.DrawLine(pen, le, y, le2, y); e.Graphics.DrawLine(pen, re2, y, re, y); } } else { for (int i = drawSpace.Width; i-- > 0;) { pen.Color = m_colormap.Map(i / (double)drawSpace.Width * m_colormap.Length); e.Graphics.DrawLine(pen, drawSpace.Left + i, drawSpace.Top, drawSpace.Left + i, drawSpace.Top + drawSpace.Height); } // draw tick bars int up = drawSpace.Top, bot = drawSpace.Top + drawSpace.Height, up2 = up + (bot - up) / 4, bot2 = bot - (bot - up) / 4; pen.Color = ForeColor; foreach (int x in tickPositions) { e.Graphics.DrawLine(pen, x, up, x, up2); e.Graphics.DrawLine(pen, x, bot2, x, bot); } } }
protected override void OnPaint(PaintEventArgs e) { if (!Visible) return; // || (m_minValue == m_maxValue)) return; base.OnPaint(e); // draw border Brush br = new SolidBrush(ForeColor) ; Rectangle drawSpace = ClientRectangle; Pen pen = new Pen(br); // draw labels drawSpace.Location = new Point (Padding.Left,Padding.Top); drawSpace.Width = ClientRectangle.Width - Padding.Horizontal; drawSpace.Height = ClientRectangle.Height- Padding.Vertical; string format = String.Format("g{0}",m_precision); SizeF labsize = e.Graphics.MeasureString(String.Format(".-e08" + new String('0',m_precision)),Font); int tickCount; if (m_orientation == TextOrientation.Vertical) { tickCount = (int)Math.Floor((double)(drawSpace.Height - labsize.Height) / (labsize.Height + m_tickLabelsPadding)); } else { tickCount = (int)Math.Floor((double)(drawSpace.Width - labsize.Width) / (labsize.Width + m_tickLabelsPadding)); } List<float> labels = Collections.ILTickCollection.NiceLabels(m_minValue,m_maxValue,tickCount,TickLabelRenderingHint.Auto); tickCount = labels.Count; // draw labels RectangleF dR; List<int> tickPositions = new List<int>(tickCount); if (m_orientation == TextOrientation.Vertical) { dR = new RectangleF(drawSpace.Left,drawSpace.Top + drawSpace.Height - labsize.Height, labsize.Width,labsize.Height); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Far; sf.LineAlignment = StringAlignment.Near; // draw all values in between float offsY = drawSpace.Top + drawSpace.Height; float mult = (drawSpace.Height) / (m_maxValue - m_minValue); foreach (float curVal in labels) { // translate into screen coords dR.Y = (int)(offsY - (curVal - m_minValue) * mult); tickPositions.Add((int)dR.Y); dR.Y -= (labsize.Height/2); e.Graphics.DrawString(curVal.ToString(format),Font,br,dR,sf); } // prepare remaining space for gradient scale drawSpace.X += (int)(labsize.Width + 2 * m_tickLabelsPadding); drawSpace.Width -= (int)(labsize.Width + 2 * m_tickLabelsPadding); } else { // draw labels above gradient scale dR = new RectangleF(drawSpace.Left,drawSpace.Top,labsize.Width,labsize.Height); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; e.Graphics.DrawString(m_minValue.ToString(format),Font,br,dR,sf); tickPositions.Add(drawSpace.Left); // draw maximum sf.Alignment = StringAlignment.Far; dR.X = drawSpace.Left + drawSpace.Width - labsize.Width; e.Graphics.DrawString(m_maxValue.ToString(format),Font,br,dR,sf); tickPositions.Add(drawSpace.Left + drawSpace.Width); sf.Alignment = StringAlignment.Center; // draw all values in between float mult = (drawSpace.Width) / (m_maxValue - m_minValue); foreach (float curVal in labels) { // = ls; curVal <= m_maxValue - m/2; curVal = (float) (curVal + m)) { // translate into screen coords dR.X = (int)((curVal - m_minValue) * mult); if (dR.X < drawSpace.Left + labsize.Width) continue; if (dR.X > drawSpace.Left + drawSpace.Width - labsize.Width) continue; tickPositions.Add((int)dR.X); dR.X -= (labsize.Width/2); e.Graphics.DrawString(curVal.ToString(format),Font,br,dR,sf); } // prep. rem. space for gradient scale drawSpace.Y += (int)(labsize.Height + 2 * m_tickLabelsPadding); drawSpace.Height -= (int)(labsize.Height + 2 * m_tickLabelsPadding); } // draw color gradient: border (gray) pen.Color = Color.FromArgb(180,180,180); e.Graphics.DrawRectangle(pen,drawSpace); drawSpace.X += 1; drawSpace.Y += 1; drawSpace.Width -= 1; drawSpace.Height -= 1; Internal.ILColorProvider hls = new Internal.ILColorProvider(0.0f,0.5f,1.0f); if (m_orientation == TextOrientation.Vertical) { for (int i = drawSpace.Height; i -->0;) { pen.Color = m_colormap.Map((drawSpace.Height - i) / (double)drawSpace.Height * m_colormap.Length); e.Graphics.DrawLine(pen,drawSpace.Left, drawSpace.Top+i, drawSpace.Left + drawSpace.Width,drawSpace.Top + i); } // draw tick bars int le = drawSpace.Left, re = drawSpace.Left + drawSpace.Width, le2 = le + (re - le) / 4, re2 = re - (re - le) / 4; pen.Color = ForeColor; foreach (int y in tickPositions) { e.Graphics.DrawLine(pen,le,y,le2,y); e.Graphics.DrawLine(pen,re2,y,re,y); } } else { for (int i = drawSpace.Width; i -->0;) { pen.Color = m_colormap.Map(i / (double)drawSpace.Width * m_colormap.Length); e.Graphics.DrawLine(pen,drawSpace.Left+i, drawSpace.Top, drawSpace.Left + i,drawSpace.Top + drawSpace.Height); } // draw tick bars int up = drawSpace.Top, bot = drawSpace.Top + drawSpace.Height, up2 = up + (bot - up) / 4, bot2 = bot - (bot - up) / 4; pen.Color = ForeColor; foreach (int x in tickPositions) { e.Graphics.DrawLine(pen,x,up,x,up2); e.Graphics.DrawLine(pen,x,bot2,x,bot); } } }