V2.2.8 最终版本

This commit is contained in:
Sunny 2020-10-12 20:56:03 +08:00
parent b545068aa5
commit 63b11666df
24 changed files with 521 additions and 320 deletions

Binary file not shown.

Binary file not shown.

View File

@ -57,7 +57,6 @@
this.BarChart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(54)))), ((int)(((byte)(54)))), ((int)(((byte)(54))))); this.BarChart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(54)))), ((int)(((byte)(54)))), ((int)(((byte)(54)))));
this.BarChart.Location = new System.Drawing.Point(30, 48); this.BarChart.Location = new System.Drawing.Point(30, 48);
this.BarChart.Name = "BarChart"; this.BarChart.Name = "BarChart";
this.BarChart.Option = null;
this.BarChart.Size = new System.Drawing.Size(670, 400); this.BarChart.Size = new System.Drawing.Size(670, 400);
this.BarChart.TabIndex = 0; this.BarChart.TabIndex = 0;
this.BarChart.Text = "uiBarChart1"; this.BarChart.Text = "uiBarChart1";

View File

@ -125,7 +125,6 @@
this.BarChart.Location = new System.Drawing.Point(30, 48); this.BarChart.Location = new System.Drawing.Point(30, 48);
this.BarChart.MinimumSize = new System.Drawing.Size(1, 1); this.BarChart.MinimumSize = new System.Drawing.Size(1, 1);
this.BarChart.Name = "BarChart"; this.BarChart.Name = "BarChart";
this.BarChart.Option = null;
this.BarChart.Size = new System.Drawing.Size(670, 400); this.BarChart.Size = new System.Drawing.Size(670, 400);
this.BarChart.TabIndex = 35; this.BarChart.TabIndex = 35;
this.BarChart.Text = "uiBarChartEx1"; this.BarChart.Text = "uiBarChartEx1";

View File

@ -57,7 +57,6 @@
this.DoughnutChart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(54)))), ((int)(((byte)(54)))), ((int)(((byte)(54))))); this.DoughnutChart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(54)))), ((int)(((byte)(54)))), ((int)(((byte)(54)))));
this.DoughnutChart.Location = new System.Drawing.Point(30, 48); this.DoughnutChart.Location = new System.Drawing.Point(30, 48);
this.DoughnutChart.Name = "DoughnutChart"; this.DoughnutChart.Name = "DoughnutChart";
this.DoughnutChart.Option = null;
this.DoughnutChart.Size = new System.Drawing.Size(670, 400); this.DoughnutChart.Size = new System.Drawing.Size(670, 400);
this.DoughnutChart.TabIndex = 0; this.DoughnutChart.TabIndex = 0;
this.DoughnutChart.Text = "uiDoughnutChart1"; this.DoughnutChart.Text = "uiDoughnutChart1";

View File

@ -125,7 +125,6 @@
this.LineChart.Location = new System.Drawing.Point(30, 48); this.LineChart.Location = new System.Drawing.Point(30, 48);
this.LineChart.MinimumSize = new System.Drawing.Size(1, 1); this.LineChart.MinimumSize = new System.Drawing.Size(1, 1);
this.LineChart.Name = "LineChart"; this.LineChart.Name = "LineChart";
this.LineChart.Option = null;
this.LineChart.Size = new System.Drawing.Size(670, 400); this.LineChart.Size = new System.Drawing.Size(670, 400);
this.LineChart.TabIndex = 35; this.LineChart.TabIndex = 35;
this.LineChart.Text = "uiLineChart1"; this.LineChart.Text = "uiLineChart1";

View File

@ -70,7 +70,6 @@
this.PieChart.LegendFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.PieChart.LegendFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.PieChart.Location = new System.Drawing.Point(30, 48); this.PieChart.Location = new System.Drawing.Point(30, 48);
this.PieChart.Name = "PieChart"; this.PieChart.Name = "PieChart";
this.PieChart.Option = null;
this.PieChart.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None; this.PieChart.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None;
this.PieChart.Size = new System.Drawing.Size(670, 400); this.PieChart.Size = new System.Drawing.Size(670, 400);
this.PieChart.SubFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.PieChart.SubFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));

View File

@ -435,6 +435,7 @@
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Forms\Pages\FTitlePage3.resx"> <EmbeddedResource Include="Forms\Pages\FTitlePage3.resx">
<DependentUpon>FTitlePage3.cs</DependentUpon> <DependentUpon>FTitlePage3.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx"> <EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>

View File

@ -107,21 +107,21 @@ namespace Sunny.UI
{ {
Bars.Clear(); Bars.Clear();
NeedDraw = false; NeedDraw = false;
if (BarOption == null || BarOption.Series == null || BarOption.SeriesCount == 0) return; if (Option == null || Option.Series == null || Option.SeriesCount == 0) return;
DrawOrigin = new Point(BarOption.Grid.Left, Height - BarOption.Grid.Bottom); DrawOrigin = new Point(Option.Grid.Left, Height - Option.Grid.Bottom);
DrawSize = new Size(Width - BarOption.Grid.Left - BarOption.Grid.Right, DrawSize = new Size(Width - Option.Grid.Left - Option.Grid.Right,
Height - BarOption.Grid.Top - BarOption.Grid.Bottom); Height - Option.Grid.Top - Option.Grid.Bottom);
if (DrawSize.Width <= 0 || DrawSize.Height <= 0) return; if (DrawSize.Width <= 0 || DrawSize.Height <= 0) return;
if (BarOption.XAxis.Data.Count == 0) return; if (Option.XAxis.Data.Count == 0) return;
NeedDraw = true; NeedDraw = true;
DrawBarWidth = DrawSize.Width * 1.0f / BarOption.XAxis.Data.Count; DrawBarWidth = DrawSize.Width * 1.0f / Option.XAxis.Data.Count;
double min = double.MaxValue; double min = double.MaxValue;
double max = double.MinValue; double max = double.MinValue;
foreach (var series in BarOption.Series) foreach (var series in Option.Series)
{ {
if (series.Data.Count > 0) if (series.Data.Count > 0)
{ {
@ -130,10 +130,10 @@ namespace Sunny.UI
} }
} }
if (min > 0 && max > 0 && !BarOption.YAxis.Scale) min = 0; if (min > 0 && max > 0 && !Option.YAxis.Scale) min = 0;
if (min < 0 && max < 0 && !BarOption.YAxis.Scale) max = 0; if (min < 0 && max < 0 && !Option.YAxis.Scale) max = 0;
if (!BarOption.YAxis.MaxAuto) max = BarOption.YAxis.Max; if (!Option.YAxis.MaxAuto) max = Option.YAxis.Max;
if (!BarOption.YAxis.MinAuto) min = BarOption.YAxis.Min; if (!Option.YAxis.MinAuto) min = Option.YAxis.Min;
if ((max - min).IsZero()) if ((max - min).IsZero())
{ {
@ -141,20 +141,20 @@ namespace Sunny.UI
min = 0; min = 0;
} }
CalcDegreeScale(min, max, BarOption.YAxis.SplitNumber, CalcDegreeScale(min, max, Option.YAxis.SplitNumber,
out int start, out int end, out double interval); out int start, out int end, out double interval);
YAxisStart = start; YAxisStart = start;
YAxisEnd = end; YAxisEnd = end;
YAxisInterval = interval; YAxisInterval = interval;
float x1 = DrawBarWidth / (BarOption.SeriesCount * 2 + BarOption.SeriesCount + 1); float x1 = DrawBarWidth / (Option.SeriesCount * 2 + Option.SeriesCount + 1);
float x2 = x1 * 2; float x2 = x1 * 2;
for (int i = 0; i < BarOption.SeriesCount; i++) for (int i = 0; i < Option.SeriesCount; i++)
{ {
float barX = DrawOrigin.X; float barX = DrawOrigin.X;
var series = BarOption.Series[i]; var series = Option.Series[i];
Bars.TryAdd(i, new List<BarInfo>()); Bars.TryAdd(i, new List<BarInfo>());
for (int j = 0; j < series.Data.Count; j++) for (int j = 0; j < series.Data.Count; j++)
{ {
@ -181,7 +181,7 @@ namespace Sunny.UI
float h = Math.Abs((float)(DrawSize.Height * (end * interval - series.Data[j]) / ((end - start) * interval))); float h = Math.Abs((float)(DrawSize.Height * (end * interval - series.Data[j]) / ((end - start) * interval)));
Bars[i].Add(new BarInfo() Bars[i].Add(new BarInfo()
{ {
Rect = new RectangleF(xx, BarOption.Grid.Top + 1, ww, h - 1), Rect = new RectangleF(xx, Option.Grid.Top + 1, ww, h - 1),
Color = color Color = color
}); });
} }
@ -227,15 +227,15 @@ namespace Sunny.UI
} }
} }
if (BarOption.ToolTip != null) if (Option.ToolTip != null)
{ {
for (int i = 0; i < BarOption.XAxis.Data.Count; i++) for (int i = 0; i < Option.XAxis.Data.Count; i++)
{ {
string str = BarOption.XAxis.Data[i]; string str = Option.XAxis.Data[i];
foreach (var series in BarOption.Series) foreach (var series in Option.Series)
{ {
str += '\n'; str += '\n';
str += series.Name + " : " + series.Data[i].ToString(BarOption.ToolTip.ValueFormat); str += series.Name + " : " + series.Data[i].ToString(Option.ToolTip.ValueFormat);
} }
Bars[0][i].Tips = str; Bars[0][i].Tips = str;
@ -258,7 +258,7 @@ namespace Sunny.UI
get => selectIndex; get => selectIndex;
set set
{ {
if (BarOption.ToolTip != null && selectIndex != value) if (Option.ToolTip != null && selectIndex != value)
{ {
selectIndex = value; selectIndex = value;
Invalidate(); Invalidate();
@ -274,12 +274,12 @@ namespace Sunny.UI
try try
{ {
if (!BarOption.ToolTip.Visible) return; if (!Option.ToolTip.Visible) return;
if (e.Location.X > BarOption.Grid.Left && e.Location.X < Width - BarOption.Grid.Right if (e.Location.X > Option.Grid.Left && e.Location.X < Width - Option.Grid.Right
&& e.Location.Y > BarOption.Grid.Top && && e.Location.Y > Option.Grid.Top &&
e.Location.Y < Height - BarOption.Grid.Bottom) e.Location.Y < Height - Option.Grid.Bottom)
{ {
SelectIndex = (int)((e.Location.X - BarOption.Grid.Left) / DrawBarWidth); SelectIndex = (int)((e.Location.X - Option.Grid.Left) / DrawBarWidth);
} }
else else
{ {
@ -296,9 +296,9 @@ namespace Sunny.UI
int x = e.Location.X + 15; int x = e.Location.X + 15;
int y = e.Location.Y + 20; int y = e.Location.Y + 20;
if (e.Location.X + 15 + tip.Width > Width - BarOption.Grid.Right) if (e.Location.X + 15 + tip.Width > Width - Option.Grid.Right)
x = e.Location.X - tip.Width - 2; x = e.Location.X - tip.Width - 2;
if (e.Location.Y + 20 + tip.Height > Height - BarOption.Grid.Bottom) if (e.Location.Y + 20 + tip.Height > Height - Option.Grid.Bottom)
y = e.Location.Y - tip.Height - 2; y = e.Location.Y - tip.Height - 2;
tip.Left = x; tip.Left = x;
@ -312,14 +312,19 @@ namespace Sunny.UI
} }
} }
[Browsable(false)] [Browsable(false), DefaultValue(null)]
protected UIBarOption BarOption public UIBarOption Option
{ {
get get
{ {
UIOption option = Option ?? EmptyOption; UIOption option = BaseOption ?? EmptyOption;
return (UIBarOption)option; return (UIBarOption)option;
} }
set
{
SetOption(value);
}
} }
protected override void CreateEmptyOption() protected override void CreateEmptyOption()
@ -371,51 +376,51 @@ namespace Sunny.UI
protected override void DrawOption(Graphics g) protected override void DrawOption(Graphics g)
{ {
if (BarOption == null) return; if (Option == null) return;
if (!NeedDraw) return; if (!NeedDraw) return;
if (BarOption.ToolTip != null && BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow) DrawToolTip(g); if (Option.ToolTip != null && Option.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow) DrawToolTip(g);
DrawAxis(g); DrawAxis(g);
DrawTitle(g, BarOption.Title); DrawTitle(g, Option.Title);
DrawSeries(g, BarOption.Series); DrawSeries(g, Option.Series);
if (BarOption.ToolTip != null && BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Line) DrawToolTip(g); if (Option.ToolTip != null && Option.ToolTip.AxisPointer.Type == UIAxisPointerType.Line) DrawToolTip(g);
DrawLegend(g, BarOption.Legend); DrawLegend(g, Option.Legend);
DrawAxisScales(g); DrawAxisScales(g);
} }
protected virtual void DrawToolTip(Graphics g) protected virtual void DrawToolTip(Graphics g)
{ {
if (selectIndex < 0) return; if (selectIndex < 0) return;
if (BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Line) if (Option.ToolTip.AxisPointer.Type == UIAxisPointerType.Line)
{ {
float x = DrawOrigin.X + SelectIndex * DrawBarWidth + DrawBarWidth / 2.0f; float x = DrawOrigin.X + SelectIndex * DrawBarWidth + DrawBarWidth / 2.0f;
g.DrawLine(ChartStyle.ToolTipShadowColor, x, DrawOrigin.Y, x, BarOption.Grid.Top); g.DrawLine(ChartStyle.ToolTipShadowColor, x, DrawOrigin.Y, x, Option.Grid.Top);
} }
if (BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow) if (Option.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow)
{ {
float x = DrawOrigin.X + SelectIndex * DrawBarWidth; float x = DrawOrigin.X + SelectIndex * DrawBarWidth;
g.FillRectangle(ChartStyle.ToolTipShadowColor, x, BarOption.Grid.Top, DrawBarWidth, Height - BarOption.Grid.Top - BarOption.Grid.Bottom); g.FillRectangle(ChartStyle.ToolTipShadowColor, x, Option.Grid.Top, DrawBarWidth, Height - Option.Grid.Top - Option.Grid.Bottom);
} }
} }
protected virtual void DrawAxis(Graphics g) protected virtual void DrawAxis(Graphics g)
{ {
if (YAxisStart >= 0) g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X + DrawSize.Width, DrawOrigin.Y)); if (YAxisStart >= 0) g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X + DrawSize.Width, DrawOrigin.Y));
if (YAxisEnd <= 0) g.DrawLine(ChartStyle.ForeColor, new Point(DrawOrigin.X, BarOption.Grid.Top), new Point(DrawOrigin.X + DrawSize.Width, BarOption.Grid.Top)); if (YAxisEnd <= 0) g.DrawLine(ChartStyle.ForeColor, new Point(DrawOrigin.X, Option.Grid.Top), new Point(DrawOrigin.X + DrawSize.Width, Option.Grid.Top));
g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X, DrawOrigin.Y - DrawSize.Height)); g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X, DrawOrigin.Y - DrawSize.Height));
if (BarOption.XAxis.AxisTick.Show) if (Option.XAxis.AxisTick.Show)
{ {
float start; float start;
if (BarOption.XAxis.AxisTick.AlignWithLabel) if (Option.XAxis.AxisTick.AlignWithLabel)
{ {
start = DrawOrigin.X + DrawBarWidth / 2.0f; start = DrawOrigin.X + DrawBarWidth / 2.0f;
for (int i = 0; i < BarOption.XAxis.Data.Count; i++) for (int i = 0; i < Option.XAxis.Data.Count; i++)
{ {
g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
start += DrawBarWidth; start += DrawBarWidth;
} }
} }
@ -434,36 +439,36 @@ namespace Sunny.UI
if (!haveZero) if (!haveZero)
{ {
start = DrawOrigin.X; start = DrawOrigin.X;
for (int i = 0; i <= BarOption.XAxis.Data.Count; i++) for (int i = 0; i <= Option.XAxis.Data.Count; i++)
{ {
g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
start += DrawBarWidth; start += DrawBarWidth;
} }
} }
} }
} }
if (BarOption.XAxis.AxisLabel.Show) if (Option.XAxis.AxisLabel.Show)
{ {
float start = DrawOrigin.X + DrawBarWidth / 2.0f; float start = DrawOrigin.X + DrawBarWidth / 2.0f;
foreach (var data in BarOption.XAxis.Data) foreach (var data in Option.XAxis.Data)
{ {
SizeF sf = g.MeasureString(data, SubFont); SizeF sf = g.MeasureString(data, SubFont);
g.DrawString(data, SubFont, ChartStyle.ForeColor, start - sf.Width / 2.0f, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawString(data, SubFont, ChartStyle.ForeColor, start - sf.Width / 2.0f, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
start += DrawBarWidth; start += DrawBarWidth;
} }
SizeF sfname = g.MeasureString(BarOption.XAxis.Name, SubFont); SizeF sfname = g.MeasureString(Option.XAxis.Name, SubFont);
g.DrawString(BarOption.XAxis.Name, SubFont, ChartStyle.ForeColor, DrawOrigin.X + (DrawSize.Width - sfname.Width) / 2.0f, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length + sfname.Height); g.DrawString(Option.XAxis.Name, SubFont, ChartStyle.ForeColor, DrawOrigin.X + (DrawSize.Width - sfname.Width) / 2.0f, DrawOrigin.Y + Option.XAxis.AxisTick.Length + sfname.Height);
} }
if (BarOption.YAxis.AxisTick.Show) if (Option.YAxis.AxisTick.Show)
{ {
float start = DrawOrigin.Y; float start = DrawOrigin.Y;
float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart); float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart);
for (int i = YAxisStart; i <= YAxisEnd; i++) for (int i = YAxisStart; i <= YAxisEnd; i++)
{ {
g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, DrawOrigin.X - BarOption.YAxis.AxisTick.Length, start); g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, DrawOrigin.X - Option.YAxis.AxisTick.Length, start);
if (i != 0) if (i != 0)
{ {
@ -471,17 +476,17 @@ namespace Sunny.UI
{ {
pn.DashStyle = DashStyle.Dash; pn.DashStyle = DashStyle.Dash;
pn.DashPattern = new float[] { 3, 3 }; pn.DashPattern = new float[] { 3, 3 };
g.DrawLine(pn, DrawOrigin.X, start, Width - BarOption.Grid.Right, start); g.DrawLine(pn, DrawOrigin.X, start, Width - Option.Grid.Right, start);
} }
} }
else else
{ {
g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, Width - BarOption.Grid.Right, start); g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, Width - Option.Grid.Right, start);
float lineStart = DrawOrigin.X; float lineStart = DrawOrigin.X;
for (int j = 0; j <= BarOption.XAxis.Data.Count; j++) for (int j = 0; j <= Option.XAxis.Data.Count; j++)
{ {
g.DrawLine(ChartStyle.ForeColor, lineStart, start, lineStart, start + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, lineStart, start, lineStart, start + Option.XAxis.AxisTick.Length);
lineStart += DrawBarWidth; lineStart += DrawBarWidth;
} }
} }
@ -490,7 +495,7 @@ namespace Sunny.UI
} }
} }
if (BarOption.YAxis.AxisLabel.Show) if (Option.YAxis.AxisLabel.Show)
{ {
float start = DrawOrigin.Y; float start = DrawOrigin.Y;
float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart); float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart);
@ -498,32 +503,32 @@ namespace Sunny.UI
float wmax = 0; float wmax = 0;
for (int i = YAxisStart; i <= YAxisEnd; i++) for (int i = YAxisStart; i <= YAxisEnd; i++)
{ {
string label = BarOption.YAxis.AxisLabel.GetLabel(i * YAxisInterval, idx); string label = Option.YAxis.AxisLabel.GetLabel(i * YAxisInterval, idx);
SizeF sf = g.MeasureString(label, SubFont); SizeF sf = g.MeasureString(label, SubFont);
wmax = Math.Max(wmax, sf.Width); wmax = Math.Max(wmax, sf.Width);
g.DrawString(label, SubFont, ChartStyle.ForeColor, DrawOrigin.X - BarOption.YAxis.AxisTick.Length - sf.Width, start - sf.Height / 2.0f); g.DrawString(label, SubFont, ChartStyle.ForeColor, DrawOrigin.X - Option.YAxis.AxisTick.Length - sf.Width, start - sf.Height / 2.0f);
start -= DrawBarHeight; start -= DrawBarHeight;
} }
SizeF sfname = g.MeasureString(BarOption.YAxis.Name, SubFont); SizeF sfname = g.MeasureString(Option.YAxis.Name, SubFont);
int x = (int)(DrawOrigin.X - BarOption.YAxis.AxisTick.Length - wmax - sfname.Height); int x = (int)(DrawOrigin.X - Option.YAxis.AxisTick.Length - wmax - sfname.Height);
int y = (int)(BarOption.Grid.Top + (DrawSize.Height - sfname.Width) / 2); int y = (int)(Option.Grid.Top + (DrawSize.Height - sfname.Width) / 2);
g.DrawString(BarOption.YAxis.Name, SubFont, ChartStyle.ForeColor, new Point(x, y), g.DrawString(Option.YAxis.Name, SubFont, ChartStyle.ForeColor, new Point(x, y),
new StringFormat() { Alignment = StringAlignment.Center }, 270); new StringFormat() { Alignment = StringAlignment.Center }, 270);
} }
} }
private void DrawAxisScales(Graphics g) private void DrawAxisScales(Graphics g)
{ {
foreach (var line in BarOption.YAxisScaleLines) foreach (var line in Option.YAxisScaleLines)
{ {
double ymin = YAxisStart * YAxisInterval; double ymin = YAxisStart * YAxisInterval;
double ymax = YAxisEnd * YAxisInterval; double ymax = YAxisEnd * YAxisInterval;
float pos = (float)((line.Value - ymin) * (Height - BarOption.Grid.Top - BarOption.Grid.Bottom) / (ymax - ymin)); float pos = (float)((line.Value - ymin) * (Height - Option.Grid.Top - Option.Grid.Bottom) / (ymax - ymin));
pos = (Height - BarOption.Grid.Bottom - pos); pos = (Height - Option.Grid.Bottom - pos);
using (Pen pn = new Pen(line.Color, line.Size)) using (Pen pn = new Pen(line.Color, line.Size))
{ {
g.DrawLine(pn, DrawOrigin.X, pos, Width - BarOption.Grid.Right, pos); g.DrawLine(pn, DrawOrigin.X, pos, Width - Option.Grid.Right, pos);
} }
SizeF sf = g.MeasureString(line.Name, SubFont); SizeF sf = g.MeasureString(line.Name, SubFont);
@ -531,9 +536,9 @@ namespace Sunny.UI
if (line.Left == UILeftAlignment.Left) if (line.Left == UILeftAlignment.Left)
g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + 4, pos - 2 - sf.Height); g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + 4, pos - 2 - sf.Height);
if (line.Left == UILeftAlignment.Center) if (line.Left == UILeftAlignment.Center)
g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + (Width - BarOption.Grid.Left - BarOption.Grid.Right - sf.Width) / 2, pos - 2 - sf.Height); g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + (Width - Option.Grid.Left - Option.Grid.Right - sf.Width) / 2, pos - 2 - sf.Height);
if (line.Left == UILeftAlignment.Right) if (line.Left == UILeftAlignment.Right)
g.DrawString(line.Name, SubFont, line.Color, Width - sf.Width - 4 - BarOption.Grid.Right, pos - 2 - sf.Height); g.DrawString(line.Name, SubFont, line.Color, Width - sf.Width - 4 - Option.Grid.Right, pos - 2 - sf.Height);
} }
} }
@ -550,7 +555,7 @@ namespace Sunny.UI
} }
} }
for (int i = 0; i < BarOption.XAxis.Data.Count; i++) for (int i = 0; i < Option.XAxis.Data.Count; i++)
{ {
Bars[0][i].Size = g.MeasureString(Bars[0][i].Tips, SubFont); Bars[0][i].Size = g.MeasureString(Bars[0][i].Tips, SubFont);
} }

View File

@ -34,38 +34,38 @@ namespace Sunny.UI
{ {
Bars.Clear(); Bars.Clear();
NeedDraw = false; NeedDraw = false;
if (BarOption == null || BarOption.Series == null || BarOption.SeriesCount == 0) return; if (Option == null || Option.Series == null || Option.SeriesCount == 0) return;
DrawOrigin = new Point(BarOption.Grid.Left, Height - BarOption.Grid.Bottom); DrawOrigin = new Point(Option.Grid.Left, Height - Option.Grid.Bottom);
DrawSize = new Size(Width - BarOption.Grid.Left - BarOption.Grid.Right, DrawSize = new Size(Width - Option.Grid.Left - Option.Grid.Right,
Height - BarOption.Grid.Top - BarOption.Grid.Bottom); Height - Option.Grid.Top - Option.Grid.Bottom);
if (DrawSize.Width <= 0 || DrawSize.Height <= 0) return; if (DrawSize.Width <= 0 || DrawSize.Height <= 0) return;
if (BarOption.Series.Count == 0) return; if (Option.Series.Count == 0) return;
NeedDraw = true; NeedDraw = true;
DrawBarWidth = DrawSize.Width * 1.0f / BarOption.Series.Count; DrawBarWidth = DrawSize.Width * 1.0f / Option.Series.Count;
double min = double.MaxValue; double min = double.MaxValue;
double max = double.MinValue; double max = double.MinValue;
foreach (var series in BarOption.Series) foreach (var series in Option.Series)
{ {
min = Math.Min(min, series.Data.Min()); min = Math.Min(min, series.Data.Min());
max = Math.Max(max, series.Data.Max()); max = Math.Max(max, series.Data.Max());
} }
if (min > 0 && max > 0 && !BarOption.YAxis.Scale) if (min > 0 && max > 0 && !Option.YAxis.Scale)
{ {
min = 0; min = 0;
} }
if (min < 0 && max < 0 && !BarOption.YAxis.Scale) if (min < 0 && max < 0 && !Option.YAxis.Scale)
{ {
max = 0; max = 0;
} }
if (!BarOption.YAxis.MaxAuto) max = BarOption.YAxis.Max; if (!Option.YAxis.MaxAuto) max = Option.YAxis.Max;
if (!BarOption.YAxis.MinAuto) min = BarOption.YAxis.Min; if (!Option.YAxis.MinAuto) min = Option.YAxis.Min;
if ((max - min).IsZero()) if ((max - min).IsZero())
{ {
@ -73,7 +73,7 @@ namespace Sunny.UI
min = 0; min = 0;
} }
CalcDegreeScale(min, max, BarOption.YAxis.SplitNumber, CalcDegreeScale(min, max, Option.YAxis.SplitNumber,
out int start, out int end, out double interval); out int start, out int end, out double interval);
YAxisStart = start; YAxisStart = start;
@ -81,14 +81,14 @@ namespace Sunny.UI
YAxisInterval = interval; YAxisInterval = interval;
float barX = DrawOrigin.X; float barX = DrawOrigin.X;
if (BarOption.AutoSizeBars) if (Option.AutoSizeBars)
{ {
float x1 = DrawSize.Width * 1.0f / DataCount / 4; float x1 = DrawSize.Width * 1.0f / DataCount / 4;
float x2 = x1 * 2; float x2 = x1 * 2;
for (int i = 0; i < BarOption.SeriesCount; i++) for (int i = 0; i < Option.SeriesCount; i++)
{ {
var series = BarOption.Series[i]; var series = Option.Series[i];
Bars.TryAdd(i, new List<BarInfo>()); Bars.TryAdd(i, new List<BarInfo>());
for (int j = 0; j < series.Data.Count; j++) for (int j = 0; j < series.Data.Count; j++)
@ -116,7 +116,7 @@ namespace Sunny.UI
float h = Math.Abs((float)(DrawSize.Height * (end * interval - series.Data[j]) / ((end - start) * interval))); float h = Math.Abs((float)(DrawSize.Height * (end * interval - series.Data[j]) / ((end - start) * interval)));
Bars[i].Add(new BarInfo() Bars[i].Add(new BarInfo()
{ {
Rect = new RectangleF(xx, BarOption.Grid.Top + 1, ww, h - 1), Rect = new RectangleF(xx, Option.Grid.Top + 1, ww, h - 1),
Color = color Color = color
}); });
} }
@ -161,12 +161,12 @@ namespace Sunny.UI
} }
else else
{ {
for (int i = 0; i < BarOption.SeriesCount; i++) for (int i = 0; i < Option.SeriesCount; i++)
{ {
var series = BarOption.Series[i]; var series = Option.Series[i];
float x1; float x1;
if (BarOption.FixedSeriesCount > 0) if (Option.FixedSeriesCount > 0)
x1 = DrawBarWidth / (BarOption.FixedSeriesCount * 2 + BarOption.FixedSeriesCount + 1); x1 = DrawBarWidth / (Option.FixedSeriesCount * 2 + Option.FixedSeriesCount + 1);
else else
x1 = DrawBarWidth / (series.Data.Count * 2 + series.Data.Count + 1); x1 = DrawBarWidth / (series.Data.Count * 2 + series.Data.Count + 1);
@ -180,7 +180,7 @@ namespace Sunny.UI
color = series.Colors[j]; color = series.Colors[j];
float xx; float xx;
if (BarOption.FixedSeriesCount > 0) if (Option.FixedSeriesCount > 0)
xx = barX + DrawBarWidth / (series.Data.Count * 2 + series.Data.Count + 1) * ((j + 1) * 3 - 1); xx = barX + DrawBarWidth / (series.Data.Count * 2 + series.Data.Count + 1) * ((j + 1) * 3 - 1);
else else
xx = barX + x1 * ((j + 1) * 3 - 1); xx = barX + x1 * ((j + 1) * 3 - 1);
@ -203,7 +203,7 @@ namespace Sunny.UI
float h = Math.Abs((float)(DrawSize.Height * (end * interval - series.Data[j]) / ((end - start) * interval))); float h = Math.Abs((float)(DrawSize.Height * (end * interval - series.Data[j]) / ((end - start) * interval)));
Bars[i].Add(new BarInfo() Bars[i].Add(new BarInfo()
{ {
Rect = new RectangleF(xx, BarOption.Grid.Top + 1, ww, h - 1), Rect = new RectangleF(xx, Option.Grid.Top + 1, ww, h - 1),
Color = color Color = color
}); });
} }
@ -247,19 +247,19 @@ namespace Sunny.UI
} }
} }
if (BarOption.ToolTip != null) if (Option.ToolTip != null)
{ {
for (int i = 0; i < BarOption.Series.Count; i++) for (int i = 0; i < Option.Series.Count; i++)
{ {
var series = BarOption.Series[i]; var series = Option.Series[i];
string str = BarOption.Series[i].Name; string str = Option.Series[i].Name;
for (int j = 0; j < series.Data.Count; j++) for (int j = 0; j < series.Data.Count; j++)
{ {
str += '\n'; str += '\n';
if (series.BarName.Count > 0 && j < series.BarName.Count) if (series.BarName.Count > 0 && j < series.BarName.Count)
str += series.BarName[j] + " : "; str += series.BarName[j] + " : ";
str += series.Data[j].ToString(BarOption.ToolTip.ValueFormat); str += series.Data[j].ToString(Option.ToolTip.ValueFormat);
} }
Bars[i][0].Tips = str; Bars[i][0].Tips = str;
@ -277,7 +277,7 @@ namespace Sunny.UI
for (int j = 0; j < bars.Count; j++) for (int j = 0; j < bars.Count; j++)
{ {
g.FillRectangle(bars[j].Color, bars[j].Rect); g.FillRectangle(bars[j].Color, bars[j].Rect);
var s = BarOption.Series[i]; var s = Option.Series[i];
if (s.ShowBarName) if (s.ShowBarName)
{ {
if (s.BarName.Count > 0 && j < s.BarName.Count) if (s.BarName.Count > 0 && j < s.BarName.Count)
@ -296,7 +296,7 @@ namespace Sunny.UI
if (s.ShowValue) if (s.ShowValue)
{ {
string value = s.Data[j].ToString("F" + BarOption.YAxis.AxisLabel.DecimalCount); string value = s.Data[j].ToString("F" + Option.YAxis.AxisLabel.DecimalCount);
SizeF sf = g.MeasureString(value, SubFont); SizeF sf = g.MeasureString(value, SubFont);
if (s.Data[j] < 0) if (s.Data[j] < 0)
g.DrawString(value, SubFont, bars[j].Color, g.DrawString(value, SubFont, bars[j].Color,
@ -310,7 +310,7 @@ namespace Sunny.UI
} }
} }
for (int i = 0; i < BarOption.Series.Count; i++) for (int i = 0; i < Option.Series.Count; i++)
{ {
Bars[i][0].Size = g.MeasureString(Bars[i][0].Tips, SubFont); Bars[i][0].Size = g.MeasureString(Bars[i][0].Tips, SubFont);
} }
@ -321,9 +321,9 @@ namespace Sunny.UI
get get
{ {
int dataCount = 0; int dataCount = 0;
for (int i = 0; i < BarOption.SeriesCount; i++) for (int i = 0; i < Option.SeriesCount; i++)
{ {
dataCount += BarOption.Series[i].Data.Count; dataCount += Option.Series[i].Data.Count;
} }
return dataCount; return dataCount;
@ -333,33 +333,33 @@ namespace Sunny.UI
protected override void DrawAxis(Graphics g) protected override void DrawAxis(Graphics g)
{ {
if (YAxisStart >= 0) g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X + DrawSize.Width, DrawOrigin.Y)); if (YAxisStart >= 0) g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X + DrawSize.Width, DrawOrigin.Y));
if (YAxisEnd <= 0) g.DrawLine(ChartStyle.ForeColor, new Point(DrawOrigin.X, BarOption.Grid.Top), new Point(DrawOrigin.X + DrawSize.Width, BarOption.Grid.Top)); if (YAxisEnd <= 0) g.DrawLine(ChartStyle.ForeColor, new Point(DrawOrigin.X, Option.Grid.Top), new Point(DrawOrigin.X + DrawSize.Width, Option.Grid.Top));
g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X, DrawOrigin.Y - DrawSize.Height)); g.DrawLine(ChartStyle.ForeColor, DrawOrigin, new Point(DrawOrigin.X, DrawOrigin.Y - DrawSize.Height));
//绘制X轴刻度 //绘制X轴刻度
if (BarOption.XAxis.AxisTick.Show) if (Option.XAxis.AxisTick.Show)
{ {
float start; float start;
if (BarOption.XAxis.AxisTick.AlignWithLabel) if (Option.XAxis.AxisTick.AlignWithLabel)
{ {
if (BarOption.AutoSizeBars) if (Option.AutoSizeBars)
{ {
start = DrawOrigin.X; start = DrawOrigin.X;
for (int i = 0; i < BarOption.Series.Count; i++) for (int i = 0; i < Option.Series.Count; i++)
{ {
float w = DrawSize.Width * BarOption.Series[i].Data.Count * 1.0f / DataCount; float w = DrawSize.Width * Option.Series[i].Data.Count * 1.0f / DataCount;
g.DrawLine(ChartStyle.ForeColor, start + (int)(w / 2), DrawOrigin.Y, start + (int)(w / 2), DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, start + (int)(w / 2), DrawOrigin.Y, start + (int)(w / 2), DrawOrigin.Y + Option.XAxis.AxisTick.Length);
start += (int)w; start += (int)w;
} }
} }
else else
{ {
start = DrawOrigin.X + DrawBarWidth / 2.0f; start = DrawOrigin.X + DrawBarWidth / 2.0f;
for (int i = 0; i < BarOption.Series.Count; i++) for (int i = 0; i < Option.Series.Count; i++)
{ {
g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
start += DrawBarWidth; start += DrawBarWidth;
} }
} }
@ -368,22 +368,22 @@ namespace Sunny.UI
{ {
start = DrawOrigin.X; start = DrawOrigin.X;
if (BarOption.AutoSizeBars) if (Option.AutoSizeBars)
{ {
for (int i = 0; i < BarOption.Series.Count; i++) for (int i = 0; i < Option.Series.Count; i++)
{ {
float w = DrawSize.Width * BarOption.Series[i].Data.Count * 1.0f / DataCount; float w = DrawSize.Width * Option.Series[i].Data.Count * 1.0f / DataCount;
g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
start += (int)w; start += (int)w;
} }
g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X + DrawSize.Width, DrawOrigin.Y, DrawOrigin.X + DrawSize.Width, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X + DrawSize.Width, DrawOrigin.Y, DrawOrigin.X + DrawSize.Width, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
} }
else else
{ {
for (int i = 0; i <= BarOption.Series.Count; i++) for (int i = 0; i <= Option.Series.Count; i++)
{ {
g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length); g.DrawLine(ChartStyle.ForeColor, start, DrawOrigin.Y, start, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
start += DrawBarWidth; start += DrawBarWidth;
} }
} }
@ -391,42 +391,42 @@ namespace Sunny.UI
} }
//绘制X轴标签 //绘制X轴标签
if (BarOption.XAxis.AxisLabel.Show) if (Option.XAxis.AxisLabel.Show)
{ {
if (BarOption.AutoSizeBars) if (Option.AutoSizeBars)
{ {
float start = DrawOrigin.X; float start = DrawOrigin.X;
foreach (var data in BarOption.Series) foreach (var data in Option.Series)
{ {
float w = DrawSize.Width * data.Data.Count * 1.0f / DataCount; float w = DrawSize.Width * data.Data.Count * 1.0f / DataCount;
SizeF sf = g.MeasureString(data.Name, SubFont); SizeF sf = g.MeasureString(data.Name, SubFont);
g.DrawString(data.Name, SubFont, ChartStyle.ForeColor, start + w / 2.0f - sf.Width / 2.0f, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length + BarOption.XAxis.AxisTick.Distance); g.DrawString(data.Name, SubFont, ChartStyle.ForeColor, start + w / 2.0f - sf.Width / 2.0f, DrawOrigin.Y + Option.XAxis.AxisTick.Length + Option.XAxis.AxisTick.Distance);
start += w; start += w;
} }
} }
else else
{ {
float start = DrawOrigin.X + DrawBarWidth / 2.0f; float start = DrawOrigin.X + DrawBarWidth / 2.0f;
foreach (var data in BarOption.Series) foreach (var data in Option.Series)
{ {
SizeF sf = g.MeasureString(data.Name, SubFont); SizeF sf = g.MeasureString(data.Name, SubFont);
g.DrawString(data.Name, SubFont, ChartStyle.ForeColor, start - sf.Width / 2.0f, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length + BarOption.XAxis.AxisTick.Distance); g.DrawString(data.Name, SubFont, ChartStyle.ForeColor, start - sf.Width / 2.0f, DrawOrigin.Y + Option.XAxis.AxisTick.Length + Option.XAxis.AxisTick.Distance);
start += DrawBarWidth; start += DrawBarWidth;
} }
} }
SizeF sfName = g.MeasureString(BarOption.XAxis.Name, SubFont); SizeF sfName = g.MeasureString(Option.XAxis.Name, SubFont);
g.DrawString(BarOption.XAxis.Name, SubFont, ChartStyle.ForeColor, DrawOrigin.X + (DrawSize.Width - sfName.Width) / 2.0f, DrawOrigin.Y + BarOption.XAxis.AxisTick.Length + BarOption.XAxis.AxisTick.Distance + sfName.Height); g.DrawString(Option.XAxis.Name, SubFont, ChartStyle.ForeColor, DrawOrigin.X + (DrawSize.Width - sfName.Width) / 2.0f, DrawOrigin.Y + Option.XAxis.AxisTick.Length + Option.XAxis.AxisTick.Distance + sfName.Height);
} }
//绘制Y轴刻度 //绘制Y轴刻度
if (BarOption.YAxis.AxisTick.Show) if (Option.YAxis.AxisTick.Show)
{ {
float start = DrawOrigin.Y; float start = DrawOrigin.Y;
float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart); float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart);
for (int i = YAxisStart; i <= YAxisEnd; i++) for (int i = YAxisStart; i <= YAxisEnd; i++)
{ {
g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, DrawOrigin.X - BarOption.YAxis.AxisTick.Length, start); g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, DrawOrigin.X - Option.YAxis.AxisTick.Length, start);
if (i != 0) if (i != 0)
{ {
@ -434,12 +434,12 @@ namespace Sunny.UI
{ {
pn.DashStyle = DashStyle.Dash; pn.DashStyle = DashStyle.Dash;
pn.DashPattern = new float[] { 3, 3 }; pn.DashPattern = new float[] { 3, 3 };
g.DrawLine(pn, DrawOrigin.X, start, Width - BarOption.Grid.Right, start); g.DrawLine(pn, DrawOrigin.X, start, Width - Option.Grid.Right, start);
} }
} }
else else
{ {
g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, Width - BarOption.Grid.Right, start); g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, start, Width - Option.Grid.Right, start);
// float lineStart = DrawOrigin.X; // float lineStart = DrawOrigin.X;
// for (int j = 0; j <= BarOption.Series.Count; j++) // for (int j = 0; j <= BarOption.Series.Count; j++)
@ -454,7 +454,7 @@ namespace Sunny.UI
} }
//绘制Y轴标签 //绘制Y轴标签
if (BarOption.YAxis.AxisLabel.Show) if (Option.YAxis.AxisLabel.Show)
{ {
float start = DrawOrigin.Y; float start = DrawOrigin.Y;
float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart); float DrawBarHeight = DrawSize.Height * 1.0f / (YAxisEnd - YAxisStart);
@ -462,17 +462,17 @@ namespace Sunny.UI
float wmax = 0; float wmax = 0;
for (int i = YAxisStart; i <= YAxisEnd; i++) for (int i = YAxisStart; i <= YAxisEnd; i++)
{ {
string label = BarOption.YAxis.AxisLabel.GetLabel(i * YAxisInterval, idx); string label = Option.YAxis.AxisLabel.GetLabel(i * YAxisInterval, idx);
SizeF sf = g.MeasureString(label, SubFont); SizeF sf = g.MeasureString(label, SubFont);
wmax = Math.Max(wmax, sf.Width); wmax = Math.Max(wmax, sf.Width);
g.DrawString(label, SubFont, ChartStyle.ForeColor, DrawOrigin.X - BarOption.YAxis.AxisTick.Length - sf.Width, start - sf.Height / 2.0f); g.DrawString(label, SubFont, ChartStyle.ForeColor, DrawOrigin.X - Option.YAxis.AxisTick.Length - sf.Width, start - sf.Height / 2.0f);
start -= DrawBarHeight; start -= DrawBarHeight;
} }
SizeF sfname = g.MeasureString(BarOption.YAxis.Name, SubFont); SizeF sfname = g.MeasureString(Option.YAxis.Name, SubFont);
int x = (int)(DrawOrigin.X - BarOption.YAxis.AxisTick.Length - wmax - sfname.Height); int x = (int)(DrawOrigin.X - Option.YAxis.AxisTick.Length - wmax - sfname.Height);
int y = (int)(BarOption.Grid.Top + (DrawSize.Height - sfname.Width) / 2); int y = (int)(Option.Grid.Top + (DrawSize.Height - sfname.Width) / 2);
g.DrawString(BarOption.YAxis.Name, SubFont, ChartStyle.ForeColor, new Point(x, y), g.DrawString(Option.YAxis.Name, SubFont, ChartStyle.ForeColor, new Point(x, y),
new StringFormat() { Alignment = StringAlignment.Center }, 270); new StringFormat() { Alignment = StringAlignment.Center }, 270);
} }
} }
@ -481,18 +481,18 @@ namespace Sunny.UI
{ {
try try
{ {
if (!BarOption.ToolTip.Visible) return; if (!Option.ToolTip.Visible) return;
if (e.Location.X > BarOption.Grid.Left && if (e.Location.X > Option.Grid.Left &&
e.Location.X < Width - BarOption.Grid.Right && e.Location.X < Width - Option.Grid.Right &&
e.Location.Y > BarOption.Grid.Top && e.Location.Y > Option.Grid.Top &&
e.Location.Y < Height - BarOption.Grid.Bottom) e.Location.Y < Height - Option.Grid.Bottom)
{ {
if (BarOption.AutoSizeBars) if (Option.AutoSizeBars)
{ {
float startX = DrawOrigin.X; float startX = DrawOrigin.X;
for (int i = 0; i < BarOption.Series.Count; i++) for (int i = 0; i < Option.Series.Count; i++)
{ {
float w = DrawSize.Width * BarOption.Series[i].Data.Count * 1.0f / DataCount; float w = DrawSize.Width * Option.Series[i].Data.Count * 1.0f / DataCount;
if (e.Location.X >= startX && e.Location.X < startX + w) if (e.Location.X >= startX && e.Location.X < startX + w)
{ {
SelectIndex = i; SelectIndex = i;
@ -504,7 +504,7 @@ namespace Sunny.UI
} }
else else
{ {
SelectIndex = (int)((e.Location.X - BarOption.Grid.Left) / DrawBarWidth); SelectIndex = (int)((e.Location.X - Option.Grid.Left) / DrawBarWidth);
} }
} }
else else
@ -522,9 +522,9 @@ namespace Sunny.UI
int x = e.Location.X + 15; int x = e.Location.X + 15;
int y = e.Location.Y + 20; int y = e.Location.Y + 20;
if (e.Location.X + 15 + tip.Width > Width - BarOption.Grid.Right) if (e.Location.X + 15 + tip.Width > Width - Option.Grid.Right)
x = e.Location.X - tip.Width - 2; x = e.Location.X - tip.Width - 2;
if (e.Location.Y + 20 + tip.Height > Height - BarOption.Grid.Bottom) if (e.Location.Y + 20 + tip.Height > Height - Option.Grid.Bottom)
y = e.Location.Y - tip.Height - 2; y = e.Location.Y - tip.Height - 2;
tip.Left = x; tip.Left = x;
@ -542,25 +542,25 @@ namespace Sunny.UI
{ {
if (selectIndex < 0) return; if (selectIndex < 0) return;
if (BarOption.AutoSizeBars) if (Option.AutoSizeBars)
{ {
float startX = DrawOrigin.X; float startX = DrawOrigin.X;
for (int i = 0; i < BarOption.SeriesCount; i++) for (int i = 0; i < Option.SeriesCount; i++)
{ {
float w = DrawSize.Width * BarOption.Series[i].Data.Count * 1.0f / DataCount; float w = DrawSize.Width * Option.Series[i].Data.Count * 1.0f / DataCount;
if (i == selectIndex) if (i == selectIndex)
{ {
if (BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Line) if (Option.ToolTip.AxisPointer.Type == UIAxisPointerType.Line)
{ {
float x = startX + w / 2.0f; float x = startX + w / 2.0f;
g.DrawLine(ChartStyle.ToolTipShadowColor, x, DrawOrigin.Y, x, BarOption.Grid.Top); g.DrawLine(ChartStyle.ToolTipShadowColor, x, DrawOrigin.Y, x, Option.Grid.Top);
} }
if (BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow) if (Option.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow)
{ {
g.FillRectangle(ChartStyle.ToolTipShadowColor, startX, BarOption.Grid.Top, w, Height - BarOption.Grid.Top - BarOption.Grid.Bottom); g.FillRectangle(ChartStyle.ToolTipShadowColor, startX, Option.Grid.Top, w, Height - Option.Grid.Top - Option.Grid.Bottom);
} }
} }

View File

@ -127,8 +127,8 @@ namespace Sunny.UI
private UIOption _option; private UIOption _option;
[Browsable(false)] [Browsable(false), DefaultValue(null)]
public UIOption Option protected UIOption BaseOption
{ {
get => _option; get => _option;
set set
@ -140,7 +140,7 @@ namespace Sunny.UI
public void SetOption(UIOption option) public void SetOption(UIOption option)
{ {
Option = option; BaseOption = option;
CalcData(); CalcData();
} }

View File

@ -63,20 +63,20 @@ namespace Sunny.UI
protected override void DrawOption(Graphics g) protected override void DrawOption(Graphics g)
{ {
if (DoughnutOption == null) return; if (Option == null) return;
DrawTitle(g, DoughnutOption.Title); DrawTitle(g, Option.Title);
DrawSeries(g, DoughnutOption.Series); DrawSeries(g, Option.Series);
DrawLegend(g, DoughnutOption.Legend); DrawLegend(g, Option.Legend);
} }
protected override void CalcData() protected override void CalcData()
{ {
Angles.Clear(); Angles.Clear();
if (DoughnutOption == null || DoughnutOption.Series == null || DoughnutOption.Series.Count == 0) return; if (Option == null || Option.Series == null || Option.Series.Count == 0) return;
for (int pieIndex = 0; pieIndex < DoughnutOption.Series.Count; pieIndex++) for (int pieIndex = 0; pieIndex < Option.Series.Count; pieIndex++)
{ {
var pie = DoughnutOption.Series[pieIndex]; var pie = Option.Series[pieIndex];
Angles.TryAdd(pieIndex, new ConcurrentDictionary<int, Angle>()); Angles.TryAdd(pieIndex, new ConcurrentDictionary<int, Angle>());
double all = 0; double all = 0;
@ -92,14 +92,14 @@ namespace Sunny.UI
float angle = (float)(pie.Data[i].Value * 360.0f / all); float angle = (float)(pie.Data[i].Value * 360.0f / all);
float percent = (float)(pie.Data[i].Value * 100.0f / all); float percent = (float)(pie.Data[i].Value * 100.0f / all);
string text = ""; string text = "";
if (DoughnutOption.ToolTip != null) if (Option.ToolTip != null)
{ {
try try
{ {
UITemplate template = new UITemplate(DoughnutOption.ToolTip.Formatter); UITemplate template = new UITemplate(Option.ToolTip.Formatter);
template.Set("a", pie.Name); template.Set("a", pie.Name);
template.Set("b", pie.Data[i].Name); template.Set("b", pie.Data[i].Name);
template.Set("c", pie.Data[i].Value.ToString(DoughnutOption.ToolTip.ValueFormat)); template.Set("c", pie.Data[i].Value.ToString(Option.ToolTip.ValueFormat));
template.Set("d", percent.ToString("F2")); template.Set("d", percent.ToString("F2"));
text = template.Render(); text = template.Render();
} }
@ -154,30 +154,35 @@ namespace Sunny.UI
private readonly ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>> Angles = new ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>>(); private readonly ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>> Angles = new ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>>();
[Browsable(false)] [Browsable(false), DefaultValue(null)]
private UIDoughnutOption DoughnutOption public UIDoughnutOption Option
{ {
get get
{ {
UIOption option = Option ?? EmptyOption; UIOption option = BaseOption ?? EmptyOption;
UIDoughnutOption o = (UIDoughnutOption)option; UIDoughnutOption o = (UIDoughnutOption)option;
return o; return o;
} }
set
{
SetOption(value);
}
} }
protected override void OnMouseMove(MouseEventArgs e) protected override void OnMouseMove(MouseEventArgs e)
{ {
base.OnMouseMove(e); base.OnMouseMove(e);
if (DoughnutOption.SeriesCount == 0) if (Option.SeriesCount == 0)
{ {
SetPieAndAzIndex(-1, -1); SetPieAndAzIndex(-1, -1);
return; return;
} }
for (int pieIndex = 0; pieIndex < DoughnutOption.SeriesCount; pieIndex++) for (int pieIndex = 0; pieIndex < Option.SeriesCount; pieIndex++)
{ {
for (int azIndex = 0; azIndex < DoughnutOption.Series[pieIndex].Data.Count; azIndex++) for (int azIndex = 0; azIndex < Option.Series[pieIndex].Data.Count; azIndex++)
{ {
Angle angle = Angles[pieIndex][azIndex]; Angle angle = Angles[pieIndex][azIndex];
PointF pf = angle.Center; PointF pf = angle.Center;
@ -214,7 +219,7 @@ namespace Sunny.UI
tip.Top = e.Location.Y + 20; tip.Top = e.Location.Y + 20;
} }
if (DoughnutOption.ToolTip.Visible) if (Option.ToolTip.Visible)
{ {
if (!tip.Visible) tip.Visible = angle.Text.IsValid(); if (!tip.Visible) tip.Visible = angle.Text.IsValid();
} }

View File

@ -1,4 +1,25 @@
using System; /******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2020 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@qq.com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UILineChart.cs
* : 线
* : V2.2
* : 2020-10-01
*
* 2020-10-01: V2.2.8 线
******************************************************************************/
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Drawing; using System.Drawing;
@ -26,16 +47,16 @@ namespace Sunny.UI
protected override void CalcData() protected override void CalcData()
{ {
NeedDraw = false; NeedDraw = false;
if (LineOption == null || LineOption.Series == null || LineOption.Series.Count == 0) return; if (Option?.Series == null || Option.Series.Count == 0) return;
DrawOrigin = new Point(LineOption.Grid.Left, Height - LineOption.Grid.Bottom); DrawOrigin = new Point(Option.Grid.Left, Height - Option.Grid.Bottom);
DrawSize = new Size(Width - LineOption.Grid.Left - LineOption.Grid.Right, DrawSize = new Size(Width - Option.Grid.Left - Option.Grid.Right,
Height - LineOption.Grid.Top - LineOption.Grid.Bottom); Height - Option.Grid.Top - Option.Grid.Bottom);
if (DrawSize.Width <= 0 || DrawSize.Height <= 0) return; if (DrawSize.Width <= 0 || DrawSize.Height <= 0) return;
CalcAxises(); CalcAxises();
foreach (var series in LineOption.Series.Values) foreach (var series in Option.Series.Values)
{ {
series.ClearPoints(); series.ClearPoints();
float[] x = XScale.CalcXPixels(series.XData.ToArray(), DrawOrigin.X, DrawSize.Width); float[] x = XScale.CalcXPixels(series.XData.ToArray(), DrawOrigin.X, DrawSize.Width);
@ -53,7 +74,7 @@ namespace Sunny.UI
private void CalcAxises() private void CalcAxises()
{ {
if (LineOption.XAxisType == UIAxisType.DateTime) if (Option.XAxisType == UIAxisType.DateTime)
XScale = new UIDateScale(); XScale = new UIDateScale();
else else
XScale = new UILinearScale(); XScale = new UILinearScale();
@ -62,35 +83,40 @@ namespace Sunny.UI
//Y轴 //Y轴
{ {
LineOption.GetAllDataYRange(out double min, out double max); Option.GetAllDataYRange(out double min, out double max);
if (min > 0 && max > 0 && !LineOption.YAxis.Scale) min = 0; if (min > 0 && max > 0 && !Option.YAxis.Scale) min = 0;
if (min < 0 && max < 0 && !LineOption.YAxis.Scale) max = 0; if (min < 0 && max < 0 && !Option.YAxis.Scale) max = 0;
YScale.SetRange(min, max); YScale.SetRange(min, max);
if (!LineOption.YAxis.MaxAuto) YScale.Max = LineOption.YAxis.Max; if (!Option.YAxis.MaxAuto) YScale.Max = Option.YAxis.Max;
if (!LineOption.YAxis.MinAuto) YScale.Min = LineOption.YAxis.Min; if (!Option.YAxis.MinAuto) YScale.Min = Option.YAxis.Min;
YScale.AxisChange(); YScale.AxisChange();
YLabels = YScale.CalcLabels(); YLabels = YScale.CalcLabels();
} }
//X轴 //X轴
{ {
LineOption.GetAllDataXRange(out double min, out double max); Option.GetAllDataXRange(out double min, out double max);
XScale.SetRange(min, max); XScale.SetRange(min, max);
if (!LineOption.XAxis.MaxAuto) XScale.Max = LineOption.XAxis.Max; if (!Option.XAxis.MaxAuto) XScale.Max = Option.XAxis.Max;
if (!LineOption.XAxis.MinAuto) XScale.Min = LineOption.XAxis.Min; if (!Option.XAxis.MinAuto) XScale.Min = Option.XAxis.Min;
XScale.AxisChange(); XScale.AxisChange();
XLabels = XScale.CalcLabels(); XLabels = XScale.CalcLabels();
} }
} }
[Browsable(false)] [Browsable(false), DefaultValue(null)]
private UILineOption LineOption public UILineOption Option
{ {
get get
{ {
UIOption option = Option ?? EmptyOption; UIOption option = BaseOption ?? EmptyOption;
return (UILineOption)option; return (UILineOption)option;
} }
set
{
SetOption(value);
}
} }
protected override void CreateEmptyOption() protected override void CreateEmptyOption()
@ -124,40 +150,42 @@ namespace Sunny.UI
protected override void DrawOption(Graphics g) protected override void DrawOption(Graphics g)
{ {
if (LineOption == null) return; if (Option == null) return;
if (!NeedDraw) return; if (!NeedDraw) return;
// if (BarOption.ToolTip != null && BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow) DrawToolTip(g); // if (BarOption.ToolTip != null && BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Shadow) DrawToolTip(g);
DrawAxis(g); DrawAxis(g);
DrawTitle(g, LineOption.Title); DrawTitle(g, Option.Title);
DrawAxisScales(g); DrawAxisScales(g);
DrawSeries(g); DrawSeries(g);
// if (BarOption.ToolTip != null && BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Line) DrawToolTip(g); // if (BarOption.ToolTip != null && BarOption.ToolTip.AxisPointer.Type == UIAxisPointerType.Line) DrawToolTip(g);
DrawLegend(g, LineOption.Legend); DrawLegend(g, Option.Legend);
} }
private void DrawAxis(Graphics g) private void DrawAxis(Graphics g)
{ {
g.DrawRectangle(ChartStyle.ForeColor, LineOption.Grid.Left, LineOption.Grid.Top, DrawSize.Width, DrawSize.Height); g.DrawRectangle(ChartStyle.ForeColor, Option.Grid.Left, Option.Grid.Top, DrawSize.Width, DrawSize.Height);
float zeroPos = YScale.CalcYPixel(0, DrawOrigin.Y, DrawSize.Height);
g.DrawLine(ChartStyle.ForeColor, DrawOrigin.X, zeroPos, DrawOrigin.X + DrawSize.Width, zeroPos);
if (XScale == null || YScale == null) return; if (XScale == null || YScale == null) return;
//X Tick //X Tick
if (LineOption.XAxis.AxisTick.Show) if (Option.XAxis.AxisTick.Show)
{ {
float[] xlabels = XScale.CalcXPixels(XLabels, DrawOrigin.X, DrawSize.Width); float[] labels = XScale.CalcXPixels(XLabels, DrawOrigin.X, DrawSize.Width);
for (int i = 0; i < xlabels.Length; i++) for (int i = 0; i < labels.Length; i++)
{ {
float x = xlabels[i]; float x = labels[i];
if (LineOption.XAxis.AxisLabel.Show) if (Option.XAxis.AxisLabel.Show)
{ {
string label; string label;
if (LineOption.XAxisType == UIAxisType.DateTime) if (Option.XAxisType == UIAxisType.DateTime)
label = new DateTimeInt64(XLabels[i]).ToString(XScale.Format); label = new DateTimeInt64(XLabels[i]).ToString(XScale.Format);
else else
label = XLabels[i].ToString(XScale.Format); label = XLabels[i].ToString(XScale.Format);
SizeF sf = g.MeasureString(label, SubFont); SizeF sf = g.MeasureString(label, SubFont);
g.DrawString(label, SubFont, ChartStyle.ForeColor, x - sf.Width / 2.0f, DrawOrigin.Y + LineOption.XAxis.AxisTick.Length); g.DrawString(label, SubFont, ChartStyle.ForeColor, x - sf.Width / 2.0f, DrawOrigin.Y + Option.XAxis.AxisTick.Length);
} }
if (x.Equals(DrawOrigin.X)) continue; if (x.Equals(DrawOrigin.X)) continue;
@ -167,30 +195,30 @@ namespace Sunny.UI
{ {
pn.DashStyle = DashStyle.Dash; pn.DashStyle = DashStyle.Dash;
pn.DashPattern = new float[] { 3, 3 }; pn.DashPattern = new float[] { 3, 3 };
g.DrawLine(pn, x, DrawOrigin.Y, x, LineOption.Grid.Top); g.DrawLine(pn, x, DrawOrigin.Y, x, Option.Grid.Top);
} }
} }
SizeF sfname = g.MeasureString(LineOption.XAxis.Name, SubFont); SizeF sfName = g.MeasureString(Option.XAxis.Name, SubFont);
g.DrawString(LineOption.XAxis.Name, SubFont, ChartStyle.ForeColor, g.DrawString(Option.XAxis.Name, SubFont, ChartStyle.ForeColor,
DrawOrigin.X + (DrawSize.Width - sfname.Width) / 2.0f, DrawOrigin.X + (DrawSize.Width - sfName.Width) / 2.0f,
DrawOrigin.Y + LineOption.XAxis.AxisTick.Length + sfname.Height); DrawOrigin.Y + Option.XAxis.AxisTick.Length + sfName.Height);
} }
//Y Tick //Y Tick
if (LineOption.YAxis.AxisTick.Show) if (Option.YAxis.AxisTick.Show)
{ {
float[] ylabels = YScale.CalcYPixels(YLabels, DrawOrigin.Y, DrawSize.Height); float[] labels = YScale.CalcYPixels(YLabels, DrawOrigin.Y, DrawSize.Height);
float wmax = 0; float widthMax = 0;
for (int i = 0; i < ylabels.Length; i++) for (int i = 0; i < labels.Length; i++)
{ {
float y = ylabels[i]; float y = labels[i];
if (LineOption.YAxis.AxisLabel.Show) if (Option.YAxis.AxisLabel.Show)
{ {
string label = YLabels[i].ToString(YScale.Format); string label = YLabels[i].ToString(YScale.Format);
SizeF sf = g.MeasureString(label, SubFont); SizeF sf = g.MeasureString(label, SubFont);
wmax = Math.Max(wmax, sf.Width); widthMax = Math.Max(widthMax, sf.Width);
g.DrawString(label, SubFont, ChartStyle.ForeColor, DrawOrigin.X - LineOption.YAxis.AxisTick.Length - sf.Width, y - sf.Height / 2.0f); g.DrawString(label, SubFont, ChartStyle.ForeColor, DrawOrigin.X - Option.YAxis.AxisTick.Length - sf.Width, y - sf.Height / 2.0f);
} }
if (y.Equals(DrawOrigin.Y)) continue; if (y.Equals(DrawOrigin.Y)) continue;
@ -200,15 +228,15 @@ namespace Sunny.UI
{ {
pn.DashStyle = DashStyle.Dash; pn.DashStyle = DashStyle.Dash;
pn.DashPattern = new float[] { 3, 3 }; pn.DashPattern = new float[] { 3, 3 };
g.DrawLine(pn, DrawOrigin.X, y, Width - LineOption.Grid.Right, y); g.DrawLine(pn, DrawOrigin.X, y, Width - Option.Grid.Right, y);
} }
} }
SizeF sfname = g.MeasureString(LineOption.YAxis.Name, SubFont); SizeF sfName = g.MeasureString(Option.YAxis.Name, SubFont);
int xx = (int)(DrawOrigin.X - LineOption.YAxis.AxisTick.Length - wmax - sfname.Height); int xx = (int)(DrawOrigin.X - Option.YAxis.AxisTick.Length - widthMax - sfName.Height);
int yy = (int)(LineOption.Grid.Top + (DrawSize.Height - sfname.Width) / 2); int yy = (int)(Option.Grid.Top + (DrawSize.Height - sfName.Width) / 2);
g.DrawString(LineOption.YAxis.Name, SubFont, ChartStyle.ForeColor, new Point(xx, yy), g.DrawString(Option.YAxis.Name, SubFont, ChartStyle.ForeColor, new Point(xx, yy),
new StringFormat() { Alignment = StringAlignment.Center }, 270); new StringFormat() { Alignment = StringAlignment.Center }, 270);
} }
} }
@ -222,7 +250,7 @@ namespace Sunny.UI
if (series.Points.Count == 1 && series.Symbol == UILinePointSymbol.None) if (series.Points.Count == 1 && series.Symbol == UILinePointSymbol.None)
{ {
g.FillEllipse(color, series.Points[0].X - 2, series.Points[0].Y - 2, 4, 4); g.DrawPoint(color, series.Points[0], 4);
return; return;
} }
@ -242,9 +270,9 @@ namespace Sunny.UI
if (YScale == null) return; if (YScale == null) return;
int idx = 0; int idx = 0;
if (LineOption.GreaterWarningArea == null && LineOption.LessWarningArea == null) if (Option.GreaterWarningArea == null && Option.LessWarningArea == null)
{ {
foreach (var series in LineOption.Series.Values) foreach (var series in Option.Series.Values)
{ {
Color color = series.Color; Color color = series.Color;
if (!series.CustomColor) color = ChartStyle.GetColor(idx); if (!series.CustomColor) color = ChartStyle.GetColor(idx);
@ -260,7 +288,7 @@ namespace Sunny.UI
float wTop = 0; float wTop = 0;
float wBottom = Height; float wBottom = Height;
foreach (var series in LineOption.Series.Values) foreach (var series in Option.Series.Values)
{ {
Color color = series.Color; Color color = series.Color;
if (!series.CustomColor) color = ChartStyle.GetColor(idx); if (!series.CustomColor) color = ChartStyle.GetColor(idx);
@ -270,35 +298,35 @@ namespace Sunny.UI
DrawSeries(graphics, color, series); DrawSeries(graphics, color, series);
} }
if (LineOption.GreaterWarningArea != null) if (Option.GreaterWarningArea != null)
{ {
using (Graphics graphics = bmpGreater.Graphics()) using (Graphics graphics = bmpGreater.Graphics())
{ {
DrawSeries(graphics, LineOption.GreaterWarningArea.Color, series); DrawSeries(graphics, Option.GreaterWarningArea.Color, series);
} }
} }
if (LineOption.LessWarningArea != null) if (Option.LessWarningArea != null)
{ {
using (Graphics graphics = bmpLess.Graphics()) using (Graphics graphics = bmpLess.Graphics())
{ {
DrawSeries(graphics, LineOption.LessWarningArea.Color, series); DrawSeries(graphics, Option.LessWarningArea.Color, series);
} }
} }
idx++; idx++;
} }
if (LineOption.GreaterWarningArea != null) if (Option.GreaterWarningArea != null)
{ {
wTop = YScale.CalcYPixel(LineOption.GreaterWarningArea.Value, DrawOrigin.Y, DrawSize.Height); wTop = YScale.CalcYPixel(Option.GreaterWarningArea.Value, DrawOrigin.Y, DrawSize.Height);
g.DrawImage(bmpGreater, new Rectangle(0, 0, Width, (int)wTop), g.DrawImage(bmpGreater, new Rectangle(0, 0, Width, (int)wTop),
new Rectangle(0, 0, Width, (int)wTop), GraphicsUnit.Pixel); new Rectangle(0, 0, Width, (int)wTop), GraphicsUnit.Pixel);
} }
if (LineOption.LessWarningArea != null) if (Option.LessWarningArea != null)
{ {
wBottom = YScale.CalcYPixel(LineOption.LessWarningArea.Value, DrawOrigin.Y, DrawSize.Height); wBottom = YScale.CalcYPixel(Option.LessWarningArea.Value, DrawOrigin.Y, DrawSize.Height);
g.DrawImage(bmpLess, new Rectangle(0, (int)wBottom, Width, Height - (int)wBottom), g.DrawImage(bmpLess, new Rectangle(0, (int)wBottom, Width, Height - (int)wBottom),
new Rectangle(0, (int)wBottom, Width, Height - (int)wBottom), GraphicsUnit.Pixel); new Rectangle(0, (int)wBottom, Width, Height - (int)wBottom), GraphicsUnit.Pixel);
} }
@ -312,7 +340,7 @@ namespace Sunny.UI
} }
idx = 0; idx = 0;
foreach (var series in LineOption.Series.Values) foreach (var series in Option.Series.Values)
{ {
Color color = series.Color; Color color = series.Color;
if (!series.CustomColor) color = ChartStyle.GetColor(idx); if (!series.CustomColor) color = ChartStyle.GetColor(idx);
@ -320,7 +348,7 @@ namespace Sunny.UI
if (series.Symbol != UILinePointSymbol.None) if (series.Symbol != UILinePointSymbol.None)
{ {
using (Brush br = new SolidBrush(ChartStyle.BackColor)) using (Brush br = new SolidBrush(ChartStyle.BackColor))
using (Pen pn = new Pen(series.SymbolColor, series.SymbolLineWidth)) using (Pen pn = new Pen(color, series.SymbolLineWidth))
{ {
foreach (var p in series.Points) foreach (var p in series.Points)
{ {
@ -389,12 +417,12 @@ namespace Sunny.UI
{ {
if (YScale == null) return; if (YScale == null) return;
foreach (var line in LineOption.YAxisScaleLines) foreach (var line in Option.YAxisScaleLines)
{ {
float pos = YScale.CalcYPixel(line.Value, DrawOrigin.Y, DrawSize.Height); float pos = YScale.CalcYPixel(line.Value, DrawOrigin.Y, DrawSize.Height);
using (Pen pn = new Pen(line.Color, line.Size)) using (Pen pn = new Pen(line.Color, line.Size))
{ {
g.DrawLine(pn, DrawOrigin.X, pos, Width - LineOption.Grid.Right, pos); g.DrawLine(pn, DrawOrigin.X, pos, Width - Option.Grid.Right, pos);
} }
SizeF sf = g.MeasureString(line.Name, SubFont); SizeF sf = g.MeasureString(line.Name, SubFont);
@ -402,9 +430,9 @@ namespace Sunny.UI
if (line.Left == UILeftAlignment.Left) if (line.Left == UILeftAlignment.Left)
g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + 4, pos - 2 - sf.Height); g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + 4, pos - 2 - sf.Height);
if (line.Left == UILeftAlignment.Center) if (line.Left == UILeftAlignment.Center)
g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + (Width - LineOption.Grid.Left - LineOption.Grid.Right - sf.Width) / 2, pos - 2 - sf.Height); g.DrawString(line.Name, SubFont, line.Color, DrawOrigin.X + (Width - Option.Grid.Left - Option.Grid.Right - sf.Width) / 2, pos - 2 - sf.Height);
if (line.Left == UILeftAlignment.Right) if (line.Left == UILeftAlignment.Right)
g.DrawString(line.Name, SubFont, line.Color, Width - sf.Width - 4 - LineOption.Grid.Right, pos - 2 - sf.Height); g.DrawString(line.Name, SubFont, line.Color, Width - sf.Width - 4 - Option.Grid.Right, pos - 2 - sf.Height);
} }
} }
@ -417,7 +445,7 @@ namespace Sunny.UI
if (!NeedDraw) return; if (!NeedDraw) return;
selectPointsTemp.Clear(); selectPointsTemp.Clear();
foreach (var series in LineOption.Series.Values) foreach (var series in Option.Series.Values)
{ {
if (series.DataCount == 0) continue; if (series.DataCount == 0) continue;
if (series.GetNearestPoint(e.Location, 4, out double x, out double y, out int index)) if (series.GetNearestPoint(e.Location, 4, out double x, out double y, out int index))
@ -472,17 +500,17 @@ namespace Sunny.UI
sb.Append(point.Name); sb.Append(point.Name);
sb.Append('\n'); sb.Append('\n');
sb.Append(LineOption.XAxis.Name + ": "); sb.Append(Option.XAxis.Name + ": ");
if (LineOption.XAxisType == UIAxisType.DateTime) if (Option.XAxisType == UIAxisType.DateTime)
sb.Append(new DateTimeInt64(point.X).ToString(LineOption.XAxis.AxisLabel.DateTimeFormat)); sb.Append(new DateTimeInt64(point.X).ToString(Option.XAxis.AxisLabel.DateTimeFormat));
else else
sb.Append(point.X.ToString("F" + LineOption.XAxis.AxisLabel.DecimalCount)); sb.Append(point.X.ToString("F" + Option.XAxis.AxisLabel.DecimalCount));
sb.Append('\n'); sb.Append('\n');
sb.Append(LineOption.YAxis.Name + ": " + point.Y.ToString("F" + LineOption.YAxis.AxisLabel.DecimalCount)); sb.Append(Option.YAxis.Name + ": " + point.Y.ToString("F" + Option.YAxis.AxisLabel.DecimalCount));
idx++; idx++;
} }
if (LineOption.ToolTip.Visible) if (Option.ToolTip.Visible)
{ {
if (sb.ToString().IsNullOrEmpty()) if (sb.ToString().IsNullOrEmpty())
{ {
@ -498,9 +526,9 @@ namespace Sunny.UI
int x = e.Location.X + 15; int x = e.Location.X + 15;
int y = e.Location.Y + 20; int y = e.Location.Y + 20;
if (e.Location.X + 15 + tip.Width > Width - LineOption.Grid.Right) if (e.Location.X + 15 + tip.Width > Width - Option.Grid.Right)
x = e.Location.X - tip.Width - 2; x = e.Location.X - tip.Width - 2;
if (e.Location.Y + 20 + tip.Height > Height - LineOption.Grid.Bottom) if (e.Location.Y + 20 + tip.Height > Height - Option.Grid.Bottom)
y = e.Location.Y - tip.Height - 2; y = e.Location.Y - tip.Height - 2;
tip.Left = x; tip.Left = x;

View File

@ -1,4 +1,25 @@
using System; /******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2020 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@qq.com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UILineChartOption.cs
* : 线
* : V2.2
* : 2020-10-01
*
* 2020-10-01: V2.2.8 线
******************************************************************************/
using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;

View File

@ -26,7 +26,7 @@ namespace Sunny.UI
{ {
public abstract class UIOption public abstract class UIOption
{ {
public UITitle Title; public UITitle Title = new UITitle();
public UILegend Legend; public UILegend Legend;
} }
@ -109,7 +109,7 @@ namespace Sunny.UI
public class UITitle public class UITitle
{ {
public string Text { get; set; } = "UIPieChart"; public string Text { get; set; } = "SunnyUI Chart";
public string SubText { get; set; } = ""; public string SubText { get; set; } = "";

View File

@ -62,10 +62,10 @@ namespace Sunny.UI
protected override void DrawOption(Graphics g) protected override void DrawOption(Graphics g)
{ {
if (PieOption == null) return; if (Option == null) return;
DrawTitle(g, PieOption.Title); DrawTitle(g, Option.Title);
DrawSeries(g, PieOption.Series); DrawSeries(g, Option.Series);
DrawLegend(g, PieOption.Legend); DrawLegend(g, Option.Legend);
} }
private bool AllIsZero; private bool AllIsZero;
@ -73,11 +73,11 @@ namespace Sunny.UI
protected override void CalcData() protected override void CalcData()
{ {
Angles.Clear(); Angles.Clear();
if (PieOption == null || PieOption.Series == null || PieOption.Series.Count == 0) return; if (Option == null || Option.Series == null || Option.Series.Count == 0) return;
for (int pieIndex = 0; pieIndex < PieOption.Series.Count; pieIndex++) for (int pieIndex = 0; pieIndex < Option.Series.Count; pieIndex++)
{ {
var pie = PieOption.Series[pieIndex]; var pie = Option.Series[pieIndex];
Angles.TryAdd(pieIndex, new ConcurrentDictionary<int, Angle>()); Angles.TryAdd(pieIndex, new ConcurrentDictionary<int, Angle>());
double all = 0; double all = 0;
@ -94,14 +94,14 @@ namespace Sunny.UI
float angle = (float)(pie.Data[i].Value * 360.0f / all); float angle = (float)(pie.Data[i].Value * 360.0f / all);
float percent = (float)(pie.Data[i].Value * 100.0f / all); float percent = (float)(pie.Data[i].Value * 100.0f / all);
string text = ""; string text = "";
if (PieOption.ToolTip != null) if (Option.ToolTip != null)
{ {
try try
{ {
UITemplate template = new UITemplate(PieOption.ToolTip.Formatter); UITemplate template = new UITemplate(Option.ToolTip.Formatter);
template.Set("a", pie.Name); template.Set("a", pie.Name);
template.Set("b", pie.Data[i].Name); template.Set("b", pie.Data[i].Name);
template.Set("c", pie.Data[i].Value.ToString(PieOption.ToolTip.ValueFormat)); template.Set("c", pie.Data[i].Value.ToString(Option.ToolTip.ValueFormat));
template.Set("d", percent.ToString("F2")); template.Set("d", percent.ToString("F2"));
text = template.Render(); text = template.Render();
} }
@ -178,14 +178,18 @@ namespace Sunny.UI
private readonly ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>> Angles = new ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>>(); private readonly ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>> Angles = new ConcurrentDictionary<int, ConcurrentDictionary<int, Angle>>();
[Browsable(false)] [Browsable(false), DefaultValue(null)]
private UIPieOption PieOption public UIPieOption Option
{ {
get get
{ {
UIOption option = Option ?? EmptyOption; UIOption option = BaseOption ?? EmptyOption;
UIPieOption o = (UIPieOption)option; return (UIPieOption)option;
return o; }
set
{
SetOption(value);
} }
} }
@ -193,7 +197,7 @@ namespace Sunny.UI
{ {
base.OnMouseMove(e); base.OnMouseMove(e);
if (PieOption.SeriesCount == 0) if (Option.SeriesCount == 0)
{ {
SetPieAndAzIndex(-1, -1); SetPieAndAzIndex(-1, -1);
return; return;
@ -201,16 +205,16 @@ namespace Sunny.UI
if (AllIsZero) return; if (AllIsZero) return;
for (int pieIndex = 0; pieIndex < PieOption.SeriesCount; pieIndex++) for (int pieIndex = 0; pieIndex < Option.SeriesCount; pieIndex++)
{ {
RectangleF rect = GetSeriesRect(PieOption.Series[pieIndex]); RectangleF rect = GetSeriesRect(Option.Series[pieIndex]);
if (!e.Location.InRect(rect)) continue; if (!e.Location.InRect(rect)) continue;
PointF pf = new PointF(rect.Left + rect.Width / 2.0f, rect.Top + rect.Height / 2.0f); PointF pf = new PointF(rect.Left + rect.Width / 2.0f, rect.Top + rect.Height / 2.0f);
if (MathEx.CalcDistance(e.Location, pf) * 2 > rect.Width) continue; if (MathEx.CalcDistance(e.Location, pf) * 2 > rect.Width) continue;
double az = MathEx.CalcAngle(e.Location, pf); double az = MathEx.CalcAngle(e.Location, pf);
for (int azIndex = 0; azIndex < PieOption.Series[pieIndex].Data.Count; azIndex++) for (int azIndex = 0; azIndex < Option.Series[pieIndex].Data.Count; azIndex++)
{ {
Angle angle = Angles[pieIndex][azIndex]; Angle angle = Angles[pieIndex][azIndex];
if (az >= angle.Start && az <= angle.Start + angle.Sweep) if (az >= angle.Start && az <= angle.Start + angle.Sweep)
@ -243,7 +247,7 @@ namespace Sunny.UI
tip.Top = e.Location.Y + 20; tip.Top = e.Location.Y + 20;
} }
if (PieOption.ToolTip.Visible) if (Option.ToolTip.Visible)
{ {
if (!tip.Visible) tip.Visible = angle.Text.IsValid(); if (!tip.Visible) tip.Visible = angle.Text.IsValid();
} }

View File

@ -1,4 +1,25 @@
using System; /******************************************************************************
* SunnyUI
* CopyRight (C) 2012-2020 ShenYongHua().
* QQ群56829229 QQ17612584 EMailSunnyUI@qq.com
*
* Blog: https://www.cnblogs.com/yhuse
* Gitee: https://gitee.com/yhuse/SunnyUI
* GitHub: https://github.com/yhuse/SunnyUI
*
* SunnyUI.dll can be used for free under the GPL-3.0 license.
* If you use this code, please keep this note.
* 使
******************************************************************************
* : UIScale.cs
* :
* : V2.2
* : 2020-10-01
*
* 2020-10-01: V2.2.8 线
******************************************************************************/
using System;
using System.Globalization; using System.Globalization;
using static System.Double; using static System.Double;

View File

@ -8,6 +8,9 @@ namespace Sunny.UI
public UIColorItem() public UIColorItem()
{ {
InitializeComponent(); InitializeComponent();
btnOK.Text = UILocalize.OK;
btnCancel.Text = UILocalize.Cancel;
} }
private LabelRotate m_colorSample; private LabelRotate m_colorSample;

View File

@ -705,6 +705,9 @@ namespace Sunny.UI
months.Add("十月"); months.Add("十月");
months.Add("十一月"); months.Add("十一月");
months.Add("十二月"); months.Add("十二月");
btnOK.Text = UILocalize.OK;
btnCancel.Text = UILocalize.Cancel;
} }
private int activeDay = -1; private int activeDay = -1;

View File

@ -414,6 +414,8 @@ namespace Sunny.UI
{ {
InitializeComponent(); InitializeComponent();
this.MouseWheel += UITimeItem_MouseWheel; this.MouseWheel += UITimeItem_MouseWheel;
btnOK.Text = UILocalize.OK;
btnCancel.Text = UILocalize.Cancel;
} }
private void UITimeItem_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) private void UITimeItem_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)

View File

@ -157,9 +157,10 @@ namespace Sunny.UI
return isOk; return isOk;
} }
public static bool ShowMessageDialog(string message, string title, bool isShowCancel, UIStyle style) public static bool ShowMessageDialog(string message, string title, bool isShowCancel, UIStyle style, bool topMost = false)
{ {
UIMessageForm frm = new UIMessageForm(); UIMessageForm frm = new UIMessageForm();
frm.TopMost = topMost;
frm.ShowMessage(message, title, isShowCancel, style); frm.ShowMessage(message, title, isShowCancel, style);
frm.ShowDialog(); frm.ShowDialog();
bool isOk = frm.IsOK; bool isOk = frm.IsOK;
@ -168,6 +169,57 @@ namespace Sunny.UI
} }
} }
public static class UIMessageBox
{
public static void Show(string text)
{
Show(text, UILocalize.InfoTitle);
}
public static void ShowInfo(string text)
{
Show(text, UILocalize.InfoTitle, UIStyle.Gray);
}
public static void ShowSuccess(string text)
{
Show(text, UILocalize.SuccessTitle, UIStyle.Green);
}
public static void ShowWarning(string text)
{
Show(text, UILocalize.WarningTitle, UIStyle.Orange);
}
public static void ShowError(string text)
{
Show(text, UILocalize.ErrorTitle, UIStyle.Red);
}
public static bool ShowAsk(string text)
{
return Show(text, UILocalize.AskTitle, UIStyle.Blue, UIMessageBoxButtons.OKCancel);
}
public static bool Show(string text, string caption, UIStyle style = UIStyle.Blue, UIMessageBoxButtons buttons = UIMessageBoxButtons.OK, bool topMost = false)
{
return UIMessageDialog.ShowMessageDialog(text, caption, buttons == UIMessageBoxButtons.OKCancel, style, topMost);
}
}
public enum UIMessageBoxButtons
{
/// <summary>
/// 确定
/// </summary>
OK = 0,
/// <summary>
/// 确定、取消
/// </summary>
OKCancel = 1
}
public static class UIInputDialog public static class UIInputDialog
{ {
private static bool InputStringDialog(ref string value, bool checkEmpty = true, string desc = "请输入字符串:", UIStyle style = UIStyle.Blue, bool topMost = false) private static bool InputStringDialog(ref string value, bool checkEmpty = true, string desc = "请输入字符串:", UIStyle style = UIStyle.Blue, bool topMost = false)

Binary file not shown.

View File

@ -35,6 +35,34 @@ namespace Sunny.UI
return Color.FromArgb(alpha, color); return Color.FromArgb(alpha, color);
} }
private static Graphics graphics;
/// <summary>
/// 提供一个Graphics常用于需要计算文字大小时
/// </summary>
/// <returns>大小</returns>
public static Graphics Graphics()
{
if (graphics == null)
{
Bitmap bmp = new Bitmap(1, 1);
graphics = bmp.Graphics();
}
return graphics;
}
/// <summary>
/// 计算文字大小
/// </summary>
/// <param name="text">文字</param>
/// <param name="font">字体</param>
/// <returns>大小</returns>
public static SizeF MeasureString(this string text, Font font)
{
return Graphics().MeasureString(text, font);
}
/// <summary> /// <summary>
/// 九宫切图背景填充,#http://st233.com/blog.php?id=24 /// 九宫切图背景填充,#http://st233.com/blog.php?id=24
/// 例如按钮是图片分成九个区域 然后只需要将四角填充到目标区域 其余的拉伸就可以了 /// 例如按钮是图片分成九个区域 然后只需要将四角填充到目标区域 其余的拉伸就可以了
@ -149,15 +177,15 @@ namespace Sunny.UI
return point.X >= rect.Left && point.X <= rect.Right && point.Y >= rect.Top && point.Y <= rect.Bottom; return point.X >= rect.Left && point.X <= rect.Right && point.Y >= rect.Top && point.Y <= rect.Bottom;
} }
public static void Smooth(this Graphics graphics, bool smooth = true) public static void Smooth(this Graphics g, bool smooth = true)
{ {
if (smooth) if (smooth)
{ {
graphics.SetHighQuality(); g.SetHighQuality();
} }
else else
{ {
graphics.SetDefaultQuality(); g.SetDefaultQuality();
} }
} }
@ -195,9 +223,9 @@ namespace Sunny.UI
g.DrawString(text, font, color, pt.X, pt.Y); g.DrawString(text, font, color, pt.X, pt.Y);
} }
public static void DrawLines(this Graphics g, Color color, Point[] points, bool smooth = false) public static void DrawLines(this Graphics g, Color color, Point[] points, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawLines(pen, points); g.DrawLines(pen, points);
@ -205,9 +233,9 @@ namespace Sunny.UI
} }
} }
public static void DrawLines(this Graphics g, Color color, PointF[] points, bool smooth = false) public static void DrawLines(this Graphics g, Color color, PointF[] points, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawLines(pen, points); g.DrawLines(pen, points);
@ -215,9 +243,9 @@ namespace Sunny.UI
} }
} }
public static void DrawCurve(this Graphics g, Color color, Point[] points, bool smooth = false) public static void DrawCurve(this Graphics g, Color color, Point[] points, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawCurve(pen, points); g.DrawCurve(pen, points);
@ -225,9 +253,9 @@ namespace Sunny.UI
} }
} }
public static void DrawCurve(this Graphics g, Color color, PointF[] points, bool smooth = false) public static void DrawCurve(this Graphics g, Color color, PointF[] points, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawCurve(pen, points); g.DrawCurve(pen, points);
@ -235,9 +263,9 @@ namespace Sunny.UI
} }
} }
public static void DrawLine(this Graphics g, Color color, int x1, int y1, int x2, int y2, bool smooth = false) public static void DrawLine(this Graphics g, Color color, int x1, int y1, int x2, int y2, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawLine(pen, x1, y1, x2, y2); g.DrawLine(pen, x1, y1, x2, y2);
@ -245,9 +273,9 @@ namespace Sunny.UI
} }
} }
public static void DrawLine(this Graphics g, Color color, Point pt1, Point pt2, bool smooth = false) public static void DrawLine(this Graphics g, Color color, Point pt1, Point pt2, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawLine(pen, pt1, pt2); g.DrawLine(pen, pt1, pt2);
@ -255,9 +283,9 @@ namespace Sunny.UI
} }
} }
public static void DrawLine(this Graphics g, Color color, float x1, float y1, float x2, float y2, bool smooth = false) public static void DrawLine(this Graphics g, Color color, float x1, float y1, float x2, float y2, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawLine(pen, x1, y1, x2, y2); g.DrawLine(pen, x1, y1, x2, y2);
@ -265,9 +293,9 @@ namespace Sunny.UI
} }
} }
public static void DrawLine(this Graphics g, Color color, PointF pt1, PointF pt2, bool smooth = false) public static void DrawLine(this Graphics g, Color color, PointF pt1, PointF pt2, bool smooth = false, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawLine(pen, pt1, pt2); g.DrawLine(pen, pt1, pt2);
@ -275,9 +303,9 @@ namespace Sunny.UI
} }
} }
public static void DrawArc(this Graphics g, Color color, int x, int y, int width, int height, int startAngle, int sweepAngle, bool smooth = true) public static void DrawArc(this Graphics g, Color color, int x, int y, int width, int height, int startAngle, int sweepAngle, bool smooth = true, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawArc(pen, x, y, width, height, startAngle, sweepAngle); g.DrawArc(pen, x, y, width, height, startAngle, sweepAngle);
@ -285,9 +313,9 @@ namespace Sunny.UI
} }
} }
public static void DrawArc(this Graphics g, Color color, float x, float y, float width, float height, float startAngle, float sweepAngle, bool smooth = true) public static void DrawArc(this Graphics g, Color color, float x, float y, float width, float height, float startAngle, float sweepAngle, bool smooth = true, float penWidth = 1)
{ {
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawArc(pen, x, y, width, height, startAngle, sweepAngle); g.DrawArc(pen, x, y, width, height, startAngle, sweepAngle);
@ -305,9 +333,9 @@ namespace Sunny.UI
} }
} }
public static void DrawPath(this Graphics g, Color color, GraphicsPath path, bool smooth = true) public static void DrawPath(this Graphics g, Color color, GraphicsPath path, bool smooth = true, float penWidth = 1)
{ {
using (Pen pn = new Pen(color)) using (Pen pn = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawPath(pn, path); g.DrawPath(pn, path);
@ -325,9 +353,9 @@ namespace Sunny.UI
} }
} }
public static void DrawEllipse(this Graphics g, Color color, Rectangle rect, bool smooth = true) public static void DrawEllipse(this Graphics g, Color color, Rectangle rect, bool smooth = true, float penWidth = 1)
{ {
using (Pen pn = new Pen(color)) using (Pen pn = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawEllipse(pn, rect); g.DrawEllipse(pn, rect);
@ -345,9 +373,9 @@ namespace Sunny.UI
} }
} }
public static void DrawEllipse(this Graphics g, Color color, RectangleF rect, bool smooth = true) public static void DrawEllipse(this Graphics g, Color color, RectangleF rect, bool smooth = true, float penWidth = 1)
{ {
using (Pen pn = new Pen(color)) using (Pen pn = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawEllipse(pn, rect); g.DrawEllipse(pn, rect);
@ -385,9 +413,9 @@ namespace Sunny.UI
} }
} }
public static void DrawRectangle(this Graphics g, Color color, Rectangle rect, bool smooth = false) public static void DrawRectangle(this Graphics g, Color color, Rectangle rect, bool smooth = false, float penWidth = 1)
{ {
using (Pen pn = new Pen(color)) using (Pen pn = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawRectangle(pn, rect); g.DrawRectangle(pn, rect);
@ -405,9 +433,9 @@ namespace Sunny.UI
} }
} }
public static void DrawRectangle(this Graphics g, Color color, RectangleF rect, bool smooth = false) public static void DrawRectangle(this Graphics g, Color color, RectangleF rect, bool smooth = false, float penWidth = 1)
{ {
using (Pen pn = new Pen(color)) using (Pen pn = new Pen(color, penWidth))
{ {
g.Smooth(smooth); g.Smooth(smooth);
g.DrawRectangle(pn, rect.X, rect.Y, rect.Width, rect.Height); g.DrawRectangle(pn, rect.X, rect.Y, rect.Width, rect.Height);
@ -648,10 +676,10 @@ namespace Sunny.UI
g.FillPie(color, rect.Left, rect.Top, rect.Width, rect.Height, startAngle, sweepAngle, smooth); g.FillPie(color, rect.Left, rect.Top, rect.Width, rect.Height, startAngle, sweepAngle, smooth);
} }
public static void DrawPie(this Graphics g, Color color, int x, int y, int width, int height, float startAngle, float sweepAngle, bool smooth = true) public static void DrawPie(this Graphics g, Color color, int x, int y, int width, int height, float startAngle, float sweepAngle, bool smooth = true, float penWidth = 1)
{ {
g.Smooth(smooth); g.Smooth(smooth);
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.DrawPie(pen, x, y, width, height, startAngle, sweepAngle); g.DrawPie(pen, x, y, width, height, startAngle, sweepAngle);
} }
@ -659,15 +687,35 @@ namespace Sunny.UI
g.Smooth(false); g.Smooth(false);
} }
public static void DrawPoint(this Graphics g, Color color, int x, int y, float size)
{
g.FillEllipse(color, x - size / 2.0f, y - size / 2.0f, size, size);
}
public static void DrawPoint(this Graphics g, Color color, float x, float y, float size)
{
g.FillEllipse(color, x - size / 2.0f, y - size / 2.0f, size, size);
}
public static void DrawPoint(this Graphics g, Color color, Point point, float size)
{
g.DrawPoint(color, point.X, point.Y, size);
}
public static void DrawPoint(this Graphics g, Color color, PointF point, float size)
{
g.DrawPoint(color, point.X, point.Y, size);
}
public static void DrawPie(this Graphics g, Color color, Rectangle rect, float startAngle, float sweepAngle, bool smooth = true) public static void DrawPie(this Graphics g, Color color, Rectangle rect, float startAngle, float sweepAngle, bool smooth = true)
{ {
g.DrawPie(color, rect.Left, rect.Top, rect.Width, rect.Height, startAngle, sweepAngle, smooth); g.DrawPie(color, rect.Left, rect.Top, rect.Width, rect.Height, startAngle, sweepAngle, smooth);
} }
public static void DrawPie(this Graphics g, Color color, float x, float y, float width, float height, float startAngle, float sweepAngle, bool smooth = true) public static void DrawPie(this Graphics g, Color color, float x, float y, float width, float height, float startAngle, float sweepAngle, bool smooth = true, float penWidth = 1)
{ {
g.Smooth(smooth); g.Smooth(smooth);
using (Pen pen = new Pen(color)) using (Pen pen = new Pen(color, penWidth))
{ {
g.DrawPie(pen, x, y, width, height, startAngle, sweepAngle); g.DrawPie(pen, x, y, width, height, startAngle, sweepAngle);
} }

View File

@ -1,5 +1,18 @@
+ 增加; - 删除; * 修改 + 增加; - 删除; * 修改
2020-10-12 V2.2.8
+ UILineChart完成曲线图表
+ UIScale增加坐标轴刻度计算类
+ UIFlowLayoutPanel增加
+ UIBarChartEx增加了一个新的柱状图类型序列个数可以不相等
+ UDateTimeInt64增加DateTimeInt64类时间整形互转类
* UIForm增加窗体阴影
* UIMainFrame页面框架增加Selecting事件在页面切换时执行该事件
* UITextBox解决Anchor包含Top、Bottom时在窗体最小化后恢复时高度变化
* UISwitch增加长方形形状开关取消长宽比锁定
* UITreeView背景色可改设置FillColor以及SystemCustomMode = true
* UIDataGridView解决水平滚动条在有列冻结时出错的问题
2020-09-17 V2.2.7 2020-09-17 V2.2.7
+ 新增双主键线程安全字典,分组线程安全字典 + 新增双主键线程安全字典,分组线程安全字典
+ UIHorScrollBarExUIVerScrollBarEx重写了两个滚动条 + UIHorScrollBarExUIVerScrollBarEx重写了两个滚动条