private void drawCandleLine(DrawingContext dc, double highest, double lowest, DrawingObject obj) { var opens = obj.Vals; var closes = obj.Vals1; var highs = obj.Vals2; var lows = obj.Vals3; if (opens == null || closes == null || highs == null || lows == null || opens.Length==0 || opens.Length != closes.Length || closes.Length != highs.Length || highs.Length != lows.Length) { return; } //绘制可视区域的K线 for (int i = 0; i < drawItemCount; ++i) { int itemIndex = drawItemStartIndex + i; double xoffset = (int)(i * (itemWidth + itemSpace)) + 0.5 + left; double yTop = (int)((highest - highs[itemIndex]) / (highest - lowest) * height) + 0.5 + top; double yBottom = (int)((highest - lows[itemIndex]) / (highest - lowest) * height) + 0.5 + top; double yOpen = (int)((highest - opens[itemIndex]) / (highest - lowest) * height) + 0.5 + top; double yClose = (int)((highest - closes[itemIndex]) / (highest - lowest) * height) + 0.5 + top; double bodyBottom = yOpen; double bodyTop = yClose; Color bodyColor = new Color(); bodyColor.R = 255; bodyColor.G = 0; bodyColor.B = 0; if (opens[itemIndex] > closes[itemIndex]) { bodyTop = yOpen; bodyBottom = yClose; bodyColor.R = 0; bodyColor.G = 128; bodyColor.B = 0; } var pen = getPen(0, 0, 0, 1); var brush = getBrush(bodyColor.R, bodyColor.G, bodyColor.B); //draw top vertical line dc.DrawLine(pen, new Point(xoffset + itemWidth / 2, yTop), new Point(xoffset + itemWidth / 2, bodyTop)); //draw kline body double bodyHeight = bodyBottom - bodyTop; dc.DrawRectangle(brush, pen, new Rect(xoffset, bodyTop, itemWidth, bodyHeight)); //draw bottom line. dc.DrawLine(pen, new Point(xoffset + itemWidth / 2, bodyBottom), new Point(xoffset + itemWidth / 2, yBottom)); } }
private void drawZeroVerticalLines(DrawingContext dc, double highest, double lowest, DrawingObject obj) { if (obj.Type != DrawingObjectType.zVLines) { return; } initPart(obj.Part); var pen = getPen(0, 0, 255, 1); for (var i = 0; i < drawItemCount; ++i) { var itemIndex = drawItemStartIndex + i; var xoffset = (int)(i * (itemWidth + itemSpace)) + 0.5 + left; var yoffset = height - (int)((obj.Vals[itemIndex] + highest) / (2 * highest) * height) + 0.5 + top; if (itemIndex > 0) { if (obj.Vals[itemIndex] * obj.Vals[itemIndex - 1] < 0) { if (obj.Vals[itemIndex - 1] < 0) { dc.DrawLine(getPen(255, 0, 0, 2.5), new Point(xoffset, top + height / 2 - 4), new Point(xoffset, top + height / 2 + 4)); } if (obj.Vals[itemIndex - 1] > 0) { dc.DrawLine(getPen(0, 128, 0, 2.5), new Point(xoffset, top + height / 2 - 4), new Point(xoffset, top + height / 2 + 4)); } continue; } } pen.Thickness = 1; dc.DrawLine(pen, new Point(xoffset, top + height / 2 + 0.5), new Point(xoffset, yoffset)); } }
private void drawVLines(DrawingContext dc, double highest, double lowest, DrawingObject obj) { if (obj.Type != DrawingObjectType.vLines) { return; } var vals = obj.Vals; for (var i = 0; i < drawItemCount; ++i) { int itemIndex = drawItemStartIndex + i; double xoffset = (int)(i * (itemWidth + itemSpace)) + 0.5 + left; double yoffset = (1.0 - vals[itemIndex] / highest) * height + 0.5 + top; Color color = obj.Color; if (obj.drawItemHandler != null) { //very slow. /* JSEngine.Inst.call(obj.drawItemHandler,priceFile.Opens[itemIndex], priceFile.Closes[itemIndex], priceFile.Highs[itemIndex], priceFile.Lows[itemIndex], priceFile.Vols[itemIndex], priceFile.Amounts[itemIndex]); * */ } var pen = getPen(color.R, color.G, color.B, 1); if (priceList.Opens[itemIndex] > priceList.Closes[itemIndex]) { pen = getPen(255, 0, 0, 1); } else { pen = getPen(0, 128, 0, 1); } dc.DrawLine(pen, new Point(xoffset + itemWidth / 2, yoffset), new Point(xoffset + itemWidth / 2, top + height)); } }
private void drawObj(DrawingContext dc,double highest,double lowest,DrawingObject obj) { initPart(obj.Part); switch (obj.Type) { case DrawingObjectType.Line: drawLine(dc, highest, lowest, obj); break; case DrawingObjectType.zVLines: drawZeroVerticalLines(dc, highest, lowest, obj); break; case DrawingObjectType.CandleLine: drawCandleLine(dc, highest, lowest, obj); break; case DrawingObjectType.vLines: drawVLines(dc, highest, lowest, obj); break; } }
internal void addDrawingObj(string id, double[] points, int part, Color c, double thickness,DrawingObjectType type ) { DrawingObject obj =new DrawingObject() { Vals = points, Part = part, Color = c, Thickness = thickness, Type=type, }; if (objects.ContainsKey(id)) { objects[id] = obj; return; } objects.Add(id,obj); }
// internal void addKLineObj(string id,int part, double[] open, double[] close, double[] high, double[] low) { DrawingObject obj = new DrawingObject() { Type=DrawingObjectType.CandleLine, Vals=open, Vals1=close, Vals2=high, Vals3=low }; if (objects.ContainsKey(id)) { objects[id] = obj; return; } objects.Add(id, obj); }
private void drawLine(DrawingContext dc, double highest, double lowest, DrawingObject obj) { var pen = getPen(obj.Color.R, obj.Color.G, obj.Color.B, obj.Thickness); PathFigure pfFast = new PathFigure(); PathGeometry pgFast = new PathGeometry(); pgFast.Figures.Add(pfFast); for (var i = 0; i < drawItemCount; ++i) { var itemIndex = drawItemStartIndex + i; var xoffset = (int)(i * (itemWidth + itemSpace)) + 0.5 + left; var yoffset = (int)((highest - obj.Vals[itemIndex]) / (highest - lowest) * height) + 0.5 + top; if (i == 0) { pfFast.StartPoint = new Point(xoffset, yoffset); } else { pfFast.Segments.Add(new LineSegment(new Point(xoffset, yoffset), true)); } } dc.DrawGeometry(Brushes.Transparent, pen, pgFast); }