Example #1
0
        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);
                }
            }
        }
Example #2
0
        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); 
                }
            }
        }