DotNet 4.8.1 build of DotNetBar
This commit is contained in:
104
PROMS/DotNetBar Source Code/MicroCharts/BarMicroChart.cs
Normal file
104
PROMS/DotNetBar Source Code/MicroCharts/BarMicroChart.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Drawing;
|
||||
|
||||
namespace DevComponents.DotNetBar.MicroCharts
|
||||
{
|
||||
internal class BarMicroChart : BarBaseMicroChart
|
||||
{
|
||||
public override void CreateChart(MicroChartRenderInfo info)
|
||||
{
|
||||
Graphics graphics = info.Graphics;
|
||||
|
||||
int chartHeight = info.ChartHeight;
|
||||
int chartWidth = info.ChartWidth;
|
||||
|
||||
BarMicroChartStyle style = this.Style;
|
||||
int drawStep = Math.Max(style.MinBarSize, (chartHeight / (Math.Max(1, info.DataPoints.Count))));
|
||||
int dataStep = Math.Max(1, ((info.DataPoints.Count * (drawStep + 1)) / chartHeight));
|
||||
int y = 0;
|
||||
double dataPointMinValue = info.DataPointMinValue;
|
||||
|
||||
if (dataPointMinValue > style.ZeroLineValue)
|
||||
dataPointMinValue = style.ZeroLineValue;
|
||||
|
||||
double range = info.DataPointMaxValue - dataPointMinValue;
|
||||
if (range == 0) range = 1;
|
||||
|
||||
int totalPoints = (int)Math.Ceiling((double)info.DataPoints.Count / dataStep);
|
||||
MicroChartHotPoint[] microHotPoints = new MicroChartHotPoint[totalPoints];
|
||||
int index = 0;
|
||||
int zeroX = Math.Min((int)(chartWidth * (1 - (style.ZeroLineValue - dataPointMinValue) / range)), chartWidth);
|
||||
|
||||
System.Drawing.Drawing2D.SmoothingMode smoothingMode = graphics.SmoothingMode;
|
||||
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
|
||||
using (SolidBrush positiveBarBrush = new SolidBrush(style.PositiveBarColor))
|
||||
{
|
||||
using (SolidBrush negativeBarBrush = new SolidBrush(style.NegativeBarColor))
|
||||
{
|
||||
for (int i = 0; i < info.DataPoints.Count; i += dataStep)
|
||||
{
|
||||
double value = info.DataPoints[i];
|
||||
int x = Math.Min((int)(chartWidth * (1 - (value - dataPointMinValue) / range)), chartWidth - 1);
|
||||
Rectangle barBounds = Rectangle.Empty;
|
||||
if (value > style.ZeroLineValue)
|
||||
{
|
||||
if (zeroX == chartWidth && x == zeroX) x--;
|
||||
barBounds = new Rectangle(x, y, Math.Max(1, zeroX - x), drawStep);
|
||||
|
||||
if (value == info.DataPointMaxValue && !style.HighPointBarColor.IsEmpty)
|
||||
{
|
||||
using (SolidBrush brush = new SolidBrush(style.HighPointBarColor))
|
||||
graphics.FillRectangle(brush, barBounds);
|
||||
}
|
||||
else
|
||||
graphics.FillRectangle(positiveBarBrush, barBounds);
|
||||
|
||||
microHotPoints[index] = new MicroChartHotPoint(GetHotPointBounds(barBounds, true), new Rectangle(0, barBounds.Y, chartWidth, barBounds.Height), style.PositiveBarColor, value, index);
|
||||
}
|
||||
else
|
||||
{
|
||||
barBounds = new Rectangle(zeroX, y, Math.Max(1, x - zeroX), drawStep);
|
||||
|
||||
if (value == info.DataPointMinValue && !style.LowPointBarColor.IsEmpty)
|
||||
{
|
||||
using (SolidBrush brush = new SolidBrush(style.LowPointBarColor))
|
||||
graphics.FillRectangle(brush, barBounds);
|
||||
}
|
||||
else
|
||||
graphics.FillRectangle(negativeBarBrush, barBounds);
|
||||
|
||||
microHotPoints[index] = new MicroChartHotPoint(GetHotPointBounds(barBounds, false), new Rectangle(0, barBounds.Y, chartWidth, barBounds.Height), style.NegativeBarColor, value, index);
|
||||
}
|
||||
|
||||
index++;
|
||||
y += drawStep + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
graphics.SmoothingMode = smoothingMode;
|
||||
info.MicroChartHotPoints = microHotPoints;
|
||||
}
|
||||
|
||||
protected override Rectangle GetHotPointBounds(Rectangle barBounds, bool isPositiveValue)
|
||||
{
|
||||
Rectangle bounds = Rectangle.Empty;
|
||||
if (isPositiveValue)
|
||||
{
|
||||
bounds = new Rectangle(barBounds.X - HotPointOffset,
|
||||
barBounds.Y + (barBounds.Height - HotPointOffset * 2) / 2,
|
||||
HotPointOffset * 2,
|
||||
HotPointOffset * 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
bounds = new Rectangle(barBounds.Right - HotPointOffset,
|
||||
barBounds.Y + (barBounds.Height - HotPointOffset * 2) / 2,
|
||||
HotPointOffset * 2,
|
||||
HotPointOffset * 2);
|
||||
}
|
||||
return bounds;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user