/// <summary> /// Draw the <see c_ref="Bar"/> to the specified <see c_ref="Graphics"/> device /// at the specified location. This routine draws a single bar. /// </summary> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see c_ref="ZedGraph.GraphPane"/> object that is the parent or /// owner of this object. /// </param> /// <param name="rect">The rectangle (pixels) to contain the bar</param> /// <param name="scaleFactor"> /// The scaling factor for the features of the graph based on the <see c_ref="PaneBase.BaseDimension"/>. This /// scaling factor is calculated by the <see c_ref="PaneBase.CalcScaleFactor"/> method. The scale factor /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. /// </param> /// <param name="fullFrame">true to draw the bottom portion of the border around the /// bar (this is for legend entries)</param> /// <param name="dataValue">The data value to be used for a value-based /// color gradient. This is only applicable for <see c_ref="FillType.GradientByX"/>, /// <see c_ref="FillType.GradientByY"/> or <see c_ref="FillType.GradientByZ"/>.</param> /// <param name="isSelected">Indicates that the <see c_ref="Bar" /> should be drawn /// with attributes from the <see c_ref="Selection" /> class. /// </param> public void Draw(Graphics g, GraphPane pane, RectangleF rect, float scaleFactor, bool fullFrame, bool isSelected, PointPair dataValue) { if (isSelected) { Selection.Fill.Draw(g, rect, dataValue); Selection.Border.Draw(g, pane, scaleFactor, rect); } else { _fill.Draw(g, rect, dataValue); _border.Draw(g, pane, scaleFactor, rect); } }
/// <summary> /// Draw the <see c_ref="JapaneseCandleStick"/> to the specified <see c_ref="Graphics"/> /// device at the specified location. /// </summary> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see c_ref="GraphPane"/> object that is the parent or /// owner of this object. /// </param> /// <param name="isXBase">boolean value that indicates if the "base" axis for this /// <see c_ref="JapaneseCandleStick"/> is the X axis. True for an <see c_ref="XAxis"/> base, /// false for a <see c_ref="YAxis"/> or <see c_ref="Y2Axis"/> base.</param> /// <param name="pixBase">The independent axis position of the center of the candlestick in /// pixel units</param> /// <param name="pixHigh">The high value position of the candlestick in /// pixel units</param> /// <param name="pixLow">The low value position of the candlestick in /// pixel units</param> /// <param name="pixOpen">The opening value position of the candlestick in /// pixel units</param> /// <param name="pixClose">The closing value position of the candlestick in /// pixel units</param> /// <param name="halfSize">The scaled width of one-half of a bar, in pixels</param> /// <param name="scaleFactor"> /// The scaling factor for the features of the graph based on the <see c_ref="PaneBase.BaseDimension"/>. This /// scaling factor is calculated by the <see c_ref="PaneBase.CalcScaleFactor"/> method. The scale factor /// represents a linear multiple to be applied to font sizes, symbol sizes, etc.</param> /// <param name="pen">A pen with the <see c_ref="Color"/> attribute for this /// <see c_ref="JapaneseCandleStick"/></param> /// <param name="fill"> /// The <see c_ref="Fill" /> instance to be used for filling this /// <see c_ref="JapaneseCandleStick" /> /// </param> /// <param name="border">The <see c_ref="Border" /> instance to be used for drawing the /// border around the <see c_ref="JapaneseCandleStick" /> filled box</param> /// <param name="pt">The <see c_ref="PointPair" /> to be used for determining the /// <see c_ref="Fill" />, just in case it's a <see c_ref="FillType.GradientByX" />, /// <see c_ref="FillType.GradientByY" />, or /// <see c_ref="FillType.GradientByZ" /> <see c_ref="FillType" /></param> public void Draw(Graphics g, GraphPane pane, bool isXBase, float pixBase, float pixHigh, float pixLow, float pixOpen, float pixClose, float halfSize, float scaleFactor, Pen pen, Fill fill, Border border, PointPair pt) { //float halfSize = (int) ( _size * scaleFactor / 2.0f + 0.5f ); if (pixBase != PointPair.Missing && Math.Abs(pixLow) < 1000000 && Math.Abs(pixHigh) < 1000000) { RectangleF rect; if (isXBase) { rect = new RectangleF(pixBase - halfSize, Math.Min(pixOpen, pixClose), halfSize * 2.0f, Math.Abs(pixOpen - pixClose)); g.DrawLine(pen, pixBase, pixHigh, pixBase, pixLow); } else { rect = new RectangleF(Math.Min(pixOpen, pixClose), pixBase - halfSize, Math.Abs(pixOpen - pixClose), halfSize * 2.0f); g.DrawLine(pen, pixHigh, pixBase, pixLow, pixBase); } if (_isOpenCloseVisible && Math.Abs(pixOpen) < 1000000 && Math.Abs(pixClose) < 1000000) { if (rect.Width == 0) { rect.Width = 1; } if (rect.Height == 0) { rect.Height = 1; } fill.Draw(g, rect, pt); border.Draw(g, pane, scaleFactor, rect); } } }
/// <summary> /// Draw a legend key entry for this <see c_ref="PieItem"/> at the specified location /// </summary> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see c_ref="ZedGraph.GraphPane"/> object that is the parent or /// owner of this object. /// </param> /// <param name="rect">The <see c_ref="RectangleF"/> struct that specifies the /// location for the legend key</param> /// <param name="scaleFactor"> /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent <see c_ref="ZedGraph.GraphPane"/> object using the /// <see c_ref="PaneBase.CalcScaleFactor"/> method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// </param> override public void DrawLegendKey(Graphics g, GraphPane pane, RectangleF rect, float scaleFactor) { if (!_isVisible) { return; } // Fill the slice if (_fill.IsVisible) { // just avoid height/width being less than 0.1 so GDI+ doesn't cry using (Brush brush = _fill.MakeBrush(rect)) { g.FillRectangle(brush, rect); //brush.Dispose(); } } // Border the bar if (!_border.Color.IsEmpty) { _border.Draw(g, pane, scaleFactor, rect); } }
/// <summary> /// Render this object to the specified <see c_ref="Graphics"/> device. /// </summary> /// <remarks> /// This method is normally only called by the Draw method /// of the parent <see c_ref="GraphObjList"/> collection object. /// </remarks> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see c_ref="PaneBase"/> object that is the parent or /// owner of this object. /// </param> /// <param name="scaleFactor"> /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent <see c_ref="GraphPane"/> object using the /// <see c_ref="PaneBase.CalcScaleFactor"/> method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// </param> override public void Draw(Graphics g, PaneBase pane, float scaleFactor) { // Convert the arrow coordinates from the user coordinate system // to the screen coordinate system RectangleF pixRect = Location.TransformRect(pane); // Clip the rect to just outside the PaneRect so we don't end up with wild coordinates. RectangleF tmpRect = pane.Rect; tmpRect.Inflate(20, 20); pixRect.Intersect(tmpRect); if (Math.Abs(pixRect.Left) < 100000 && Math.Abs(pixRect.Top) < 100000 && Math.Abs(pixRect.Right) < 100000 && Math.Abs(pixRect.Bottom) < 100000) { // If the box is to be filled, fill it _fill.Draw(g, pixRect); // Draw the border around the box if required _border.Draw(g, pane, scaleFactor, pixRect); } }
/// <summary> /// Render the <see c_ref="Legend"/> to the specified <see c_ref="Graphics"/> device. /// </summary> /// <remarks> /// This method is normally only called by the Draw method /// of the parent <see c_ref="GraphPane"/> object. /// </remarks> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see c_ref="PaneBase"/> object that is the parent or /// owner of this object. /// </param> /// <param name="scaleFactor"> /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent <see c_ref="GraphPane"/> object using the /// <see c_ref="PaneBase.CalcScaleFactor"/> method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// </param> public void Draw(Graphics g, PaneBase pane, float scaleFactor) { // if the legend is not visible, do nothing if (!_isVisible) { return; } // Fill the background with the specified color if required _fill.Draw(g, _rect); PaneList paneList = GetPaneList(pane); float halfGap = _tmpSize / 2.0F; // Check for bad data values if (_hStack <= 0) { _hStack = 1; } if (_legendItemWidth <= 0) { _legendItemWidth = 100; } if (_legendItemHeight <= 0) { _legendItemHeight = _tmpSize; } //float gap = pane.ScaledGap( scaleFactor ); int iEntry = 0; float x, y; // Get a brush for the legend label text using (SolidBrush brushB = new SolidBrush(Color.Black)) { foreach (GraphPane tmpPane in paneList) { // Loop for each curve in the CurveList collection //foreach ( CurveItem curve in tmpPane.CurveList ) int count = tmpPane.CurveList.Count; for (int i = 0; i < count; i++) { CurveItem curve = tmpPane.CurveList[_isReverse ? count - i - 1 : i]; if (curve._label._text != "" && curve._label._isVisible) { // Calculate the x,y (TopLeft) location of the current // curve legend label // assuming: // charHeight/2 for the left margin, plus legendWidth for each // horizontal column // legendHeight is the line spacing, with no extra margin above x = _rect.Left + halfGap / 2.0F + (iEntry % _hStack) * _legendItemWidth; y = _rect.Top + iEntry / _hStack * _legendItemHeight; // Draw the legend label for the current curve FontSpec tmpFont = (curve._label._fontSpec != null) ? curve._label._fontSpec : FontSpec; // This is required because, for long labels, the centering can affect the // position in GDI+. tmpFont.StringAlignment = StringAlignment.Near; if (_isShowLegendSymbols) { tmpFont.Draw(g, pane, curve._label._text, x + 2.5F * _tmpSize, y + _legendItemHeight / 2.0F + 1, AlignH.Left, AlignV.Center, scaleFactor); RectangleF rect = new RectangleF(x, y + _legendItemHeight / 4.0F, 2 * _tmpSize, _legendItemHeight / 2.0F); curve.DrawLegendKey(g, tmpPane, rect, scaleFactor); } else { if (curve._label._fontSpec == null) { tmpFont.FontColor = curve.Color; } tmpFont.Draw(g, pane, curve._label._text, x + 0.0F * _tmpSize, y + _legendItemHeight / 2.0F, AlignH.Left, AlignV.Center, scaleFactor); } // maintain a curve count for positioning iEntry++; } } if (pane is MasterPane && ((MasterPane)pane).IsUniformLegendEntries) { break; } } // Draw a border around the legend if required if (iEntry > 0) { Border.Draw(g, pane, scaleFactor, _rect); } } }
/// <summary> /// Draw the <see c_ref="JapaneseCandleStick"/> to the specified <see c_ref="Graphics"/> /// device at the specified location. /// </summary> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see c_ref="GraphPane"/> object that is the parent or /// owner of this object. /// </param> /// <param name="isXBase">boolean value that indicates if the "base" axis for this /// <see c_ref="JapaneseCandleStick"/> is the X axis. True for an <see c_ref="XAxis"/> base, /// false for a <see c_ref="YAxis"/> or <see c_ref="Y2Axis"/> base.</param> /// <param name="pixBase">The independent axis position of the center of the candlestick in /// pixel units</param> /// <param name="pixHigh">The high value position of the candlestick in /// pixel units</param> /// <param name="pixLow">The low value position of the candlestick in /// pixel units</param> /// <param name="pixOpen">The opening value position of the candlestick in /// pixel units</param> /// <param name="pixClose">The closing value position of the candlestick in /// pixel units</param> /// <param name="halfSize">The scaled width of one-half of a bar, in pixels</param> /// <param name="scaleFactor"> /// The scaling factor for the features of the graph based on the <see c_ref="PaneBase.BaseDimension"/>. This /// scaling factor is calculated by the <see c_ref="PaneBase.CalcScaleFactor"/> method. The scale factor /// represents a linear multiple to be applied to font sizes, symbol sizes, etc.</param> /// <param name="pen">A pen with the <see c_ref="Color"/> attribute for this /// <see c_ref="JapaneseCandleStick"/></param> /// <param name="fill"> /// The <see c_ref="Fill" /> instance to be used for filling this /// <see c_ref="JapaneseCandleStick" /> /// </param> /// <param name="border">The <see c_ref="Border" /> instance to be used for drawing the /// border around the <see c_ref="JapaneseCandleStick" /> filled box</param> /// <param name="pt">The <see c_ref="PointPair" /> to be used for determining the /// <see c_ref="Fill" />, just in case it's a <see c_ref="FillType.GradientByX" />, /// <see c_ref="FillType.GradientByY" />, or /// <see c_ref="FillType.GradientByZ" /> <see c_ref="FillType" /></param> public void Draw( Graphics g, GraphPane pane, bool isXBase, float pixBase, float pixHigh, float pixLow, float pixOpen, float pixClose, float halfSize, float scaleFactor, Pen pen, Fill fill, Border border, PointPair pt ) { //float halfSize = (int) ( _size * scaleFactor / 2.0f + 0.5f ); if ( pixBase != PointPair.Missing && Math.Abs( pixLow ) < 1000000 && Math.Abs( pixHigh ) < 1000000) { RectangleF rect; if ( isXBase ) { rect = new RectangleF( pixBase - halfSize, Math.Min( pixOpen, pixClose ), halfSize * 2.0f, Math.Abs( pixOpen - pixClose ) ); g.DrawLine( pen, pixBase, pixHigh, pixBase, pixLow ); } else { rect = new RectangleF( Math.Min( pixOpen, pixClose ), pixBase - halfSize, Math.Abs( pixOpen - pixClose ), halfSize * 2.0f ); g.DrawLine( pen, pixHigh, pixBase, pixLow, pixBase ); } if ( _isOpenCloseVisible && Math.Abs( pixOpen ) < 1000000 && Math.Abs( pixClose ) < 1000000 ) { if ( rect.Width == 0 ) rect.Width = 1; if ( rect.Height == 0 ) rect.Height = 1; fill.Draw( g, rect, pt ); border.Draw( g, pane, scaleFactor, rect ); } } }