作成日: 2022/03/14 最終更新日: 2022/03/14
文書種別
使用方法
詳細
本コンポーネントには、アラームゾーンを描画するための専用の機能は用意されていません。
代替策として、RenderedイベントとPaintイベントを利用し、独自に矩形を描画する方法が考えられます。
最初にRenderedイベントにおいて、指定した矩形範囲をコントロール座標に変換します(DataToPointメソッドを使用)。次いでPaintイベントにて、e.Graphics.FillRectangleメソッドを用いてこの矩形を塗りつぶします。
以下に、レベル=0~20、20~80、80~100の3つのゾーンに分けて色分けするコードを記載します。

◎サンプルコード(VB)
代替策として、RenderedイベントとPaintイベントを利用し、独自に矩形を描画する方法が考えられます。
最初にRenderedイベントにおいて、指定した矩形範囲をコントロール座標に変換します(DataToPointメソッドを使用)。次いでPaintイベントにて、e.Graphics.FillRectangleメソッドを用いてこの矩形を塗りつぶします。
以下に、レベル=0~20、20~80、80~100の3つのゾーンに分けて色分けするコードを記載します。

◎サンプルコード(VB)
Imports C1.Chart
Imports C1.Win.Chart
Public Class Form1
Dim posA1, posA2, posB1, posB2, posC1, posC2 As Point
Dim isFirstTime As Boolean = True
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データの作成
Dim dt As New DataTable()
dt.Columns.AddRange({New DataColumn("時間", GetType(Double)), New DataColumn("レベル", GetType(Double))})
Dim r As New Random()
For i = 0 To 49
dt.Rows.Add(i, r.Next(0, 100))
Next
dt.AcceptChanges()
' シリーズへのバインド
Dim series1 As Series = New Series()
series1.ChartType = ChartType.Line 'チャートタイプの設定
series1.DataSource = dt
series1.BindingX = "時間"
series1.Binding = "レベル"
FlexChart1.Series.Clear()
FlexChart1.Series.Add(series1)
FlexChart1.AxisX.Title = "時間"
FlexChart1.AxisY.Title = "レベル"
' 軸の設定
FlexChart1.AxisX.Min = 0
FlexChart1.AxisX.Max = 50
FlexChart1.AxisY.Min = 0
FlexChart1.AxisY.Max = 100
End Sub
Private Sub FlexChart1_Rendered(sender As Object, e As RenderEventArgs) Handles FlexChart1.Rendered
If isFirstTime Then
' フラグの初期化
isFirstTime = False
' 描画領域の取得
posA1 = Point.Truncate(FlexChart1.DataToPoint(New PointF(0.0F, 100.0F)))
posA2 = Point.Truncate(FlexChart1.DataToPoint(New PointF(50.0F, 80.0F)))
posB1 = Point.Truncate(FlexChart1.DataToPoint(New PointF(0.0F, 80.0F)))
posB2 = Point.Truncate(FlexChart1.DataToPoint(New PointF(50.0F, 20.0F)))
posC1 = Point.Truncate(FlexChart1.DataToPoint(New PointF(0.0F, 20.0F)))
posC2 = Point.Truncate(FlexChart1.DataToPoint(New PointF(50.0F, 0.0F)))
' 描画の強制
FlexChart1.Invalidate()
End If
End Sub
Private Sub FlexChart1_Paint(sender As Object, e As PaintEventArgs) Handles FlexChart1.Paint
' ゾーンのの塗りつぶし
e.Graphics.FillRectangle(Brushes.Orange, New Rectangle(posA1, New Size(Math.Abs(posA2.X - posA1.X), Math.Abs(posA2.Y - posA1.Y))))
e.Graphics.FillRectangle(Brushes.LightBlue, New Rectangle(posB1, New Size(Math.Abs(posB2.X - posB1.X), Math.Abs(posB2.Y - posB1.Y))))
e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(posC1, New Size(Math.Abs(posC2.X - posC1.X), Math.Abs(posC2.Y - posC1.Y))))
End Sub
End Class
◎サンプルコード(C#)
using C1.Chart;
using C1.Win.Chart;
namespace prj_C1FlexChart
{
public partial class Form1 : Form
{
Point posA1, posA2, posB1, posB2, posC1, posC2;
bool isFirstTime = true;
public Form1()
{
InitializeComponent();
// データの作成
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
{
new DataColumn("時間", typeof(double)),
new DataColumn("レベル", typeof(double))
});
Random r = new Random();
for (var i = 0; i <= 49; i++)
dt.Rows.Add(i, r.Next(0, 100));
dt.AcceptChanges();
// シリーズへのバインド
flexChart1.Series.Clear();
Series series1 = new Series();
series1.ChartType = ChartType.Line; // チャートタイプの設定
series1.DataSource = dt;
series1.BindingX = "時間";
series1.Binding = "レベル";
flexChart1.Series.Add(series1);
flexChart1.AxisX.Title = "時間";
flexChart1.AxisY.Title = "レベル";
// 軸の設定
flexChart1.AxisX.Min = 0;
flexChart1.AxisX.Max = 50;
flexChart1.AxisY.Min = 0;
flexChart1.AxisY.Max = 100;
}
private void flexChart1_Rendered(object sender, RenderEventArgs e)
{
if (isFirstTime)
{
// フラグの初期化
isFirstTime = false;
// 描画領域の取得
posA1 = Point.Truncate(flexChart1.DataToPoint(new PointF(0.0F, 100.0F)));
posA2 = Point.Truncate(flexChart1.DataToPoint(new PointF(50.0F, 80.0F)));
posB1 = Point.Truncate(flexChart1.DataToPoint(new PointF(0.0F, 80.0F)));
posB2 = Point.Truncate(flexChart1.DataToPoint(new PointF(50.0F, 20.0F)));
posC1 = Point.Truncate(flexChart1.DataToPoint(new PointF(0.0F, 20.0F)));
posC2 = Point.Truncate(flexChart1.DataToPoint(new PointF(50.0F, 0.0F)));
// 描画の強制
flexChart1.Invalidate();
}
}
private void flexChart1_Paint(object sender, PaintEventArgs e)
{
// ゾーンのの塗りつぶし
e.Graphics.FillRectangle(Brushes.Orange, new Rectangle(posA1, new Size(Math.Abs(posA2.X - posA1.X), Math.Abs(posA2.Y - posA1.Y))));
e.Graphics.FillRectangle(Brushes.LightBlue, new Rectangle(posB1, new Size(Math.Abs(posB2.X - posB1.X), Math.Abs(posB2.Y - posB1.Y))));
e.Graphics.FillRectangle(Brushes.Blue, new Rectangle(posC1, new Size(Math.Abs(posC2.X - posC1.X), Math.Abs(posC2.Y - posC1.Y))));
}
}
}