205 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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 | 
