Files
vms2016_kadisp/cVMS.NET_CS/HMI/MainDisplay/BarGraph.cs

205 lines
7.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace vmsnet.HMI
{
public partial class BarCtrl : UserControl
{
CGROUP NowGrp = null;
RectangleF BarRect = new RectangleF(0, 0, 0, 0);
public Boolean Show_DebugMsg { get; set; }
public BarCtrl()
{
InitializeComponent();
// Initialize Variables
// Set Optimized Double Buffer to reduce flickering
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
// Redraw when resized
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.Font = SystemInformation.MenuFont;
Show_DebugMsg = false;
}
public CGROUP Group
{
set
{
NowGrp = value;
}
}
/// Override OnPaint method
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
this.SuspendLayout();
// AntiAliasing
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
if (bMakeBarRect) MakeBarRect();
DrawBarGraph(e.Graphics);
Draw_Debug(e.Graphics);
this.Update();
this.ResumeLayout();
}
public void Draw_Debug(Graphics g)
{
if (!Show_DebugMsg) return;
//Single newy = 50;
//String newstr = "";
SizeF fontsize;
StringBuilder DebugMsg = new StringBuilder();
DebugMsg.AppendLine("GRP=" + this.NowGrp.ToString());
// newstr = "CHinfo=" + chinfo.GetUpperBound(0);
foreach ( CITEM item in NowGrp.Items)
{
DebugMsg.AppendLine("item=" + item.ToString());
}
fontsize = g.MeasureString(DebugMsg.ToString(), this.Font);
g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Black)), new Rectangle(0, 0, (int)(fontsize.Width * 1.3), (int)(fontsize.Height * 1.3)));
g.DrawString(DebugMsg.ToString(), this.Font, Brushes.Tomato, 10, 10);
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
BarRect = new RectangleF(DisplayRectangle.Left + Padding.Left, DisplayRectangle.Top + Padding.Top, DisplayRectangle.Width - Padding.Left - Padding.Right, DisplayRectangle.Height - Padding.Top - Padding.Bottom);
}
public Boolean bMakeBarRect = true;
private void MakeBarRect()
{
if (BarRect.Width == 0) return;
if (!bMakeBarRect) return;
if (NowGrp == null) return;
if (NowGrp.Items == null) return;
//각아이템의 2pixel 만큼 떨어져있다.
int ItemWidth = (int)(Math.Floor((this.BarRect.Width - ((NowGrp.NullBalanceSeq - 1) * 1)) / NowGrp.NullBalanceSeq));
if (ItemWidth < 2) ItemWidth = 2; //너무작은건 어절수없음
int ItemHeight = (int)(Math.Floor((BarRect.Height - 20 - 10) / 2));
int totalWidth = ItemWidth * NowGrp.NullBalanceSeq + ItemWidth; //1개를 더 추가한다.
Single CenterMarginX = (BarRect.Width - totalWidth) / 2;
//차트내의 아이템의 표시영역을 결정
//UInt16 itemindex = 0;
foreach (CITEM item in NowGrp.Items)
{
//Single Term = 0;//= item.idx == 0 ? 0 : item.idx * 2;
Single X = 0;//(item.idx * ItemWidth) + Term;
Single y = 0;//ChartRect.Top;
if (item.seq <= NowGrp.NullBalanceSeq)
{
//상위그룹
// Term = item.seq == 1 ? 0 : (item.seq) * 2;
X = (item.seq * ItemWidth) ;//+ Term;
y = 20;
}
else
{
//하위그룹
// Term = item.seq == NowGrp.NullBalanceSeq ? 0 : (item.seq - (NowGrp.NullBalanceSeq + 1)) * 2;
X = (item.seq - NowGrp.NullBalanceSeq -1) * ItemWidth;//+ Term;
y = ItemHeight + 20;
}
item.BarRect = new RectangleF(BarRect.Left + X + CenterMarginX, BarRect.Top + y, ItemWidth, ItemHeight - 10);
// itemindex += 1;
}
bMakeBarRect = false;
}
private void DrawBarGraph(Graphics g)
{
if (BarRect.Width < 1) return;
if (bMakeBarRect) MakeBarRect();//영역을 새로 생성해야한다면 만듬
if (NowGrp == null) return;
if (NowGrp.Items == null) return;
int YMax = 4;
int YMin = 0;
///현재등록된 아이템을 화면에 표시한다.
foreach (CITEM item in NowGrp.Items)
{
//값에따른 색상입히기
Color BarColor = Color.Green;
if (item.ismin) BarColor = Color.Blue; //<-- Color.DeepSkyBlue;
else if (item.ismax) BarColor = Color.Tomato;
else if (item.onalamh ) BarColor = Color.Red;
else if (item.onalaml) BarColor = Color.DeepSkyBlue; //<-- Color.Blue;
Single Percent = (100 * item.CurValue) / (YMax - YMin);
//값에따른 높이값
Single ValueHeight = item.BarRect.Height * (Percent / 100);
if (ValueHeight > 1)
{
Single ValueY = item.BarRect.Top + (item.BarRect.Height - ValueHeight);
//색상으로 칠한다.
g.FillRectangle(new SolidBrush(BarColor), item.BarRect.Left, ValueY, item.BarRect.Width, ValueHeight);
}
//테두리표시
if (item. )
{
g.DrawRectangle(Pens.Black, item.BarRect.Left, item.BarRect.Top, item.BarRect.Width, item.BarRect.Height);
}
//g.DrawString(item.idx.ToString("000"), new Font("Arial", 7), Brushes.Black, item.BarRect.Left, item.BarRect.Bottom);
}
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
bMakeBarRect = true;
Invalidate();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// DispCtrl
//
this.Name = "BarCtrl";
this.Size = new System.Drawing.Size(287, 321);
this.ResumeLayout(false);
}
} //end class
} //end namespace