1196 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1196 lines
		
	
	
		
			47 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 TrendCtrlII
 | |
| {
 | |
|     public enum EDRAGTYPE
 | |
|     {
 | |
|         SCREEN,
 | |
|         ZOOM,
 | |
|         UC
 | |
|     }
 | |
| 
 | |
|     public enum EBUTTONTYPE
 | |
|     {
 | |
|         LEFTMON,
 | |
|         RIGHTMON
 | |
|     }
 | |
| 
 | |
|     public enum EALIGN
 | |
|     {
 | |
|         LEFT,
 | |
|         CENTER,
 | |
|         RIGHT
 | |
|     }
 | |
| 
 | |
|     public partial class TrendCtrlII : UserControl
 | |
|     {
 | |
|         private ChartStyle _Style = new ChartStyle();
 | |
|         public CMouseinfo Mouseinfo;    //마우스위치정보
 | |
| 
 | |
|         public string yymm;
 | |
|         private Int64 starttime;
 | |
|         private Int64 endtime;
 | |
|       
 | |
|         //zoom area
 | |
|         private Int64 startview;  //zoom 시작시간
 | |
|         private Int64 endview;    //zoom 종료시간        
 | |
|         public Int64 startviewo;  //zoom 시작시간
 | |
|         public Int64 endviewo;    //zoom 종료시간
 | |
|         public Int64 querystart;
 | |
|         public Int64 queryend;
 | |
| 
 | |
|         public Single LineWidth = 1;
 | |
|         private Rectangle UserZoom;     //사용자줌영역
 | |
| 
 | |
|         //실값
 | |
|         public Single[] values;
 | |
|         public int[] times;
 | |
|         private CChinfo[] chinfo;
 | |
| 
 | |
|         private Rectangle Cursorrect;
 | |
| 
 | |
|         //화면상의 버튼데이터
 | |
|         //private List<RectangleF> Buttons = new List<RectangleF>(0);
 | |
|         //private List<Object> Buttonstag = new List<Object>(0);
 | |
|         //private List<EBUTTONTYPE> Buttonstype = new List<EBUTTONTYPE>(0);
 | |
| 
 | |
|         private Boolean init;    //그리드초기화완료여부
 | |
|         public String initmsg = "initializing...";
 | |
|         public int initpercent = 0;
 | |
| 
 | |
|         public List<CUserCursor> uc = new List<CUserCursor>(0); //사용자커서 최대2개까지한다.
 | |
|                 
 | |
|         //미정리
 | |
|                 
 | |
|         //MY EVENT
 | |
|         //public event OnClickProbeSensorHandlerL OnClickLEFT; //셀클릭
 | |
|         //public delegate void OnClickProbeSensorHandlerL();       
 | |
|         //public event OnClickProbeSensorHandlerR OnClickRIGHT; //셀클릭
 | |
|         //public delegate void OnClickProbeSensorHandlerR();
 | |
|         public event OnUpdateUserControlHandler OnUpdateUserCursor; //UPDATE USER CURSOR
 | |
|         public delegate void OnUpdateUserControlHandler(int idx);       
 | |
| 
 | |
| 
 | |
|         //화면디자인관련      
 | |
|         private Cursor cursor = Cursors.Default;    //현재커서의모양
 | |
| 
 | |
|         private StringBuilder Warn_msg = new StringBuilder("");   //경고메세지(화면 최상단중앙에 표시됨)
 | |
|         private Font Warn_Font;
 | |
|         
 | |
|         //기타설정'
 | |
|         public RectangleF WindowRect;  //머릿부분
 | |
|         public RectangleF ChartRect;
 | |
| 
 | |
| 
 | |
|         public TrendCtrlII()
 | |
|         {
 | |
|             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;
 | |
|             this.Warn_Font = new Font("나눔고딕", 20, FontStyle.Bold);
 | |
|             this.Warn_msg.Append("메세지가 없습니다");
 | |
|             this.Mouseinfo = new CMouseinfo(new PointF(0, 0));
 | |
|                       
 | |
|         }
 | |
| 
 | |
|         public ChartStyle Style
 | |
|         {
 | |
|             get { return this._Style; }
 | |
|             set { this._Style = value; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Draws the background gradient and the grid into Graphics <paramref name="g"/>
 | |
|         /// </summary>
 | |
|         /// <param name="g">Graphic</param>
 | |
|         public void DrawBackgroundWindow(Graphics g,RectangleF crect,RectangleF winrect)
 | |
|         {
 | |
|             //using (Brush gradientBrush = new LinearGradientBrush(this.WindowRect, Style.design_backcolor_start, Style.design_backcolor_bottom, LinearGradientMode.Vertical))
 | |
|             //{
 | |
|             //    g.FillRectangle(gradientBrush, this.WindowRect);
 | |
|             //}
 | |
|             //g.FillRectangle(Brushes.Black, this.WindowRect);
 | |
| 
 | |
|             //전체창에대한 보더
 | |
|             RectangleF borderrect = new RectangleF(winrect.Left, winrect.Top, winrect.Width - 1, winrect.Height - 1);
 | |
|             g.DrawRectangle(Pens.Gray, borderrect.Left, borderrect.Top, borderrect.Width, borderrect.Height);
 | |
|                    
 | |
| 
 | |
|             //실제차트정보
 | |
|            //g.FillRectangle(Brushes.Gray, ChartRect.Left + 2, ChartRect.Top + 2, ChartRect.Width, ChartRect.Height);
 | |
|            //g.FillRectangle(Brushes.Black, ChartRect);
 | |
| 
 | |
| 
 | |
|             //Display Collection TIME
 | |
|             //String Str = "Collection Time : " + GetDateTimeStr(startview, false) + " - " + GetDateTimeStr(endview, false);
 | |
|             //SizeF fontszie = g.MeasureString(Str, this.Font);
 | |
|            //// Rectangle rect = new Rectangle((int)winrect.Left, (int)winrect.Top, (int)winrect.Width, (int)(fontszie.Height * 2));
 | |
|         //    g.DrawString(Str, this.Font, Brushes.Black, rect.Left + 10, 3+rect.Top + (rect.Height - fontszie.Height) / 2);
 | |
|            // //g.DrawLine(Pens.Black, winrect.Left, fontszie.Height * 2, winrect.Left + winrect.Width, fontszie.Height * 2);
 | |
|             
 | |
|             //CHART BORDER
 | |
|             g.DrawRectangle(new Pen(Color.Black, 2), crect.Left, crect.Top, crect.Width, crect.Height);
 | |
|             
 | |
|         }
 | |
| 
 | |
|         /// Override OnPaint method
 | |
|         protected override void OnPaint(PaintEventArgs e)
 | |
|         {
 | |
|             base.OnPaint(e);
 | |
|             this.SuspendLayout();
 | |
|             
 | |
|             //Buttons.Clear();
 | |
|             //Buttonstag.Clear();
 | |
|             //Buttonstype.Clear();
 | |
|             //윈도우크기와 차트영역을 활성화한다.
 | |
|                                              
 | |
|             //표시아이템이없다면 오류를 낸다.
 | |
|             if ( !init || chinfo == null)
 | |
|             {
 | |
|                 //progress
 | |
|                 int bw = (int)(this.Width * 0.8);
 | |
|                 int bh = (int)(this.Height * 0.05);
 | |
|                 Rectangle rr = new Rectangle((this.Width - bw) / 2, (this.Height - bh) / 2 + 10, bw, bh);
 | |
| 
 | |
|                 //Display Initial Message
 | |
|                 Font nf = new Font("나눔고딕", 20, FontStyle.Bold);
 | |
|                 Rectangle FullRect = new Rectangle(0, 0, this.Width, this.Height);
 | |
|                 SizeF initsize = e.Graphics.MeasureString(initmsg, nf);
 | |
|                 e.Graphics.DrawString(initmsg, nf, Brushes.Black, this.Width / 2 - initsize.Width / 2, this.Height / 2 - initsize.Height / 2 - bh);
 | |
|                 
 | |
|                 //Display progress Bar
 | |
|                 if (initpercent > 100) initpercent = 100;
 | |
|                 int perc = (int)(rr.Width * initpercent / 100);
 | |
|                 e.Graphics.FillRectangle(Brushes.Green, new Rectangle(rr.Left, rr.Top, perc, rr.Height));
 | |
|                 
 | |
|                 //Display Control Border
 | |
|                 e.Graphics.DrawRectangle(Pens.DarkGray, rr);
 | |
| 
 | |
|                 //using (Brush gradientBrush = new LinearGradientBrush(FullRect, Color.Gray, Color.Gray, LinearGradientMode.Vertical))
 | |
|                 //{
 | |
|                 //    
 | |
|                 //    e.Graphics.FillRectangle(gradientBrush, FullRect);
 | |
|                 //    // String initstr = "initializing...";
 | |
|                 //    //if (initmsg != "") initstr += "\n\n" + initmsg;    
 | |
|                 //}
 | |
| 
 | |
|                 //LinearGradientBrush lb = new LinearGradientBrush(rr, Color.Gray, Color.WhiteSmoke,LinearGradientMode.Vertical);
 | |
|                 //lb.Dispose();                
 | |
|                 //e.Graphics.DrawRectangle(Pens.DarkGoldenrod, FullRect.Left, FullRect.Top, FullRect.Width - 1, FullRect.Height - 1);
 | |
| 
 | |
|                 this.ResumeLayout();                
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|           
 | |
|             // AntiAliasing
 | |
|             e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 | |
| 
 | |
|             //e.Graphics.DrawString(this.chinfo.Length.ToString(), this.Font, Brushes.Red, 200, 200);
 | |
| 
 | |
|             try { DrawBackgroundWindow(e.Graphics, ChartRect, WindowRect); }   //전체배경및 차트배경 }
 | |
|             catch { }
 | |
| 
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 Draw_Grid(e.Graphics, ChartRect);  //x축,y축의 눈금과 그리드표시
 | |
|             }
 | |
|             catch { }
 | |
|             //Draw_NaviLR(e.Graphics, ChartRect);
 | |
|             try
 | |
|             {
 | |
|                 Draw_channel(e.Graphics, ChartRect, WindowRect);
 | |
|             }
 | |
|             catch { }
 | |
|             try
 | |
|             {
 | |
|                 Draw_ZoomSelct(e.Graphics);
 | |
|             }
 | |
|             catch { }
 | |
|             try
 | |
|             {
 | |
|                 Draw_Cursor(e.Graphics, ChartRect);
 | |
|             }
 | |
|             catch { }
 | |
|             try
 | |
|             {
 | |
|                 Draw_MouseInfo(e.Graphics);
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 Draw_Debug(e.Graphics);
 | |
|             }
 | |
| 
 | |
|             this.Update();
 | |
|             this.ResumeLayout();
 | |
|         }
 | |
| 
 | |
|         public void Draw_Cursor(Graphics g,RectangleF Crect )
 | |
|         {
 | |
|             
 | |
|             if (this.uc.Count == 0) return;
 | |
|             Font cfont = new Font("나눔고딕", 10, FontStyle.Bold);
 | |
| 
 | |
|             //커서는 기본 2개를 둔다(전체사이즈를 측정하기위해서 임시로 크기를 테스트한다.)
 | |
|             String cursorstr = "▦ C1 2012-00-00- 00:00:00\n▦ C1 2012-00-00- 00:00:00\n▦ C1 2012-00-00- 00:00:00";
 | |
|             SizeF FontSize = g.MeasureString(cursorstr.ToString(), cfont);
 | |
| 
 | |
|             //커서가표시될영역
 | |
| 
 | |
|             Cursorrect = new Rectangle(0, 0, 50,50);
 | |
|             Cursorrect.X = (int)(Crect.Left + Crect.Width - FontSize.Width * 1.1) - 1;
 | |
|             Cursorrect.Y = (int)Crect.Top + 2;
 | |
|             Cursorrect.Width = (int)(FontSize.Width * 1.1);
 | |
|             Cursorrect.Height = (int)(FontSize.Height * 1.3);
 | |
| 
 | |
|             g.FillRectangle(Brushes.Black, Cursorrect);
 | |
|             g.DrawRectangle(Pens.Gray, Cursorrect);
 | |
| 
 | |
|             Single newy = Cursorrect.Top + ((Cursorrect.Height - FontSize.Height)/2) ;
 | |
|             Single Maxwidth = 0;
 | |
|                       
 | |
|             String fulltext = "";
 | |
|             foreach (CUserCursor uctl in this.uc)
 | |
|             {
 | |
|                 Single newx = GetXfromTime(uctl.Time, Crect);
 | |
|                 uctl.Newx = newx;
 | |
|              
 | |
|                 Single imgsizew = Properties.Resources.down_16.Width;
 | |
|                 Single imgsizeh = Properties.Resources.down_16.Height;
 | |
| 
 | |
|                 cursorstr = ("▦ C" + (uctl.Idx + 1).ToString() + " " + GetTimeStr((int)uctl.Time, true, true, true, true));
 | |
|                 
 | |
|                // cursorstr += uctl.Newx.ToString();
 | |
| 
 | |
|                 FontSize = g.MeasureString(cursorstr.ToString(), cfont);
 | |
|                 if (FontSize.Width > Maxwidth) Maxwidth = FontSize.Width;
 | |
| 
 | |
|                 if (uctl.Idx < 1)
 | |
|                 {
 | |
|                     g.DrawImage(Properties.Resources.down_16, (newx - imgsizew / 2)-1, Crect.Top - imgsizeh - 5);
 | |
|                     //g.DrawLine(new Pen(Color.Gray, 2), newx+1, Crect.Top, newx+1, Crect.Top + Crect.Height);
 | |
|                     g.DrawLine(new Pen(Color.Green, 1), newx, Crect.Top, newx, Crect.Top + Crect.Height);
 | |
|                   //  g.DrawString(newx.ToString() + "," + uctl.Time.ToString(), this.Font, Brushes.Red, newx, 300);
 | |
|                     g.DrawString(cursorstr, cfont, Brushes.Lime, Cursorrect.Left + ((Cursorrect.Width - FontSize.Width) / 2), newy);
 | |
|                     fulltext = cursorstr;
 | |
|                  
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     cursorstr += "\n\t△t " + GetTimeStr((int)Math.Abs(uctl.Time - uc[0].Time), false, true, true, false);
 | |
| 
 | |
|                     g.DrawImage(Properties.Resources.down_orange, (newx - imgsizew / 2) - 1, Crect.Top - imgsizeh - 5);
 | |
|                     //g.DrawLine(new Pen(Color.Gray, 2), newx + 1, Crect.Top, newx + 1, Crect.Top + Crect.Height);
 | |
|                     g.DrawLine(new Pen(Color.Orange, 1), newx, Crect.Top, newx, Crect.Top + Crect.Height);
 | |
|                  //   g.DrawString(newx.ToString() + "," + uctl.Time.ToString(), this.Font, Brushes.Red, newx, 300);
 | |
|                     g.DrawString(cursorstr, cfont, Brushes.Orange, Cursorrect.Left + ((Cursorrect.Width - FontSize.Width) / 2), newy); 
 | |
|                     if (fulltext == "") fulltext = cursorstr;
 | |
|                     else fulltext += "\n" + cursorstr; 
 | |
|                         
 | |
|                 }
 | |
|                 newy += FontSize.Height + 1;
 | |
|             }
 | |
| 
 | |
|             FontSize = g.MeasureString(fulltext, cfont);
 | |
|             Cursorrect = new Rectangle((int)(ChartRect.Left + ChartRect.Width - Maxwidth), (int)ChartRect.Top, (int)Maxwidth, (int)(newy - FontSize.Height));
 | |
|         }
 | |
| 
 | |
|         public void Draw_MouseInfo(Graphics g)
 | |
|         {
 | |
|             if (this.Mouseinfo.Showinfo)    //마웃위치정보를 화면에 표시를 한다.
 | |
|             {
 | |
|                 String tm = GetTimeStr((int)Mouseinfo.Time, true, true,true,true) + "\n" + Mouseinfo.Volt.ToString("#0.00") + "v";
 | |
|                 if (Style.디버그메세지) tm += "\n" + Mouseinfo.Time.ToString();
 | |
|                 
 | |
|                 SizeF tmsize = g.MeasureString(tm,Style._mouseinfofont);
 | |
| 
 | |
|                 RectangleF rect = new RectangleF(Mouseinfo.Position.X + 5, Mouseinfo.Position.Y + 5, tmsize.Width+10, tmsize.Height+10);
 | |
|                 //g.FillRectangle(new SolidBrush(Color.FromArgb(140,Color.Green)), rect);
 | |
|                 g.DrawRectangle(Pens.Black, rect.Left, rect.Top, rect.Width, rect.Height);
 | |
|                 
 | |
|                 g.DrawString(tm, Style._mouseinfofont, new SolidBrush(Style.design_mouseinfocolor  ), rect.Left + (rect.Width - tmsize.Width) / 2, rect.Top + (rect.Height - tmsize.Height) / 2);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Draw_Grid(Graphics g,RectangleF crect)
 | |
|         {
 | |
|            
 | |
|             //가로(시간축)표시
 | |
|             //DrawString(g, GetDateTimeStr(endview, true), Style._xfont, Brushes.Black, new PointF(crect.Left + crect.Width, crect.Top + crect.Height + 5), EALIGN.CENTER);
 | |
|             DateTime SDate = DateTime.FromFileTime(startview);
 | |
|             DateTime EDate = DateTime.FromFileTime(endview);
 | |
|             TimeSpan TS = EDate - SDate;    //timespan
 | |
| 
 | |
|             //표시간견(10등분)
 | |
|             UInt32 tm =  (UInt32)(TS.TotalSeconds / 10);
 | |
|             for (DateTime SD = SDate; SD <= EDate; SD.AddSeconds(tm) )
 | |
|             {
 | |
| 
 | |
|             }
 | |
| 
 | |
|                 for (Int64 i = 0; i <= (endview - startview); i += tm)
 | |
|                 {
 | |
|                     Int64 NewDateNumber = startview + i;
 | |
|                     DateTime NewDate = DateTime.FromFileTime(NewDateNumber);
 | |
|                     if (SDate.Day != NewDate.Day)
 | |
|                     {
 | |
|                         //일자가 바귀엇으므로 해당 일즤 세로축을 표시
 | |
|                         DateTime LineDay = DateTime.Parse(NewDate.ToString("yyyy-MM-dd 00:00:00"));
 | |
|                         Single newx2 = GetXfromTime(LineDay.ToFileTime(), crect);
 | |
|                         g.DrawLine(new Pen(Color.FromArgb(50, Color.Black)), newx2, crect.Top, newx2, crect.Top + crect.Height);
 | |
|                         //Font newf = new Font("나눔고딕", 40, FontStyle.Bold);
 | |
|                         //DrawString(g, timestr2, newf, Brushes.Black, new PointF(newx2, ChartRect.Top + ChartRect.Height - 100), EALIGN.CENTER);
 | |
|                         SDate = NewDate;
 | |
|                     }
 | |
| 
 | |
|                     Single newx = GetXfromTime(NewDateNumber, crect);
 | |
|                     String timestr = "";
 | |
| 
 | |
|                     if (i == 0) timestr = GetDateTimeStr(NewDateNumber, true);
 | |
|                     else timestr = GetTimeStr(NewDateNumber, i == 0 ? true : false, false);
 | |
| 
 | |
|                     timestr = NewDate.ToString("yy-MM-dd") + "\n" + NewDate.ToString("HH:mm:ss");
 | |
| 
 | |
|                     // timestr += "\n" + disptime.ToString();
 | |
| 
 | |
|                     DrawString(g, timestr, Style._xfont, Brushes.Black, new PointF(newx, crect.Top + crect.Height + 5), EALIGN.CENTER);
 | |
| 
 | |
|                     if (i > 0) g.DrawLine(new Pen(Color.Gray), newx, crect.Top, newx, crect.Top + crect.Height);
 | |
|                 }
 | |
|             
 | |
|                         
 | |
|             //세로(VOLT)표시
 | |
|             //g.DrawString("start="+Style._startvolt.ToString(), this.Font, Brushes.Red, 100, 100);
 | |
|             //g.DrawString("end="+Style._endvolt.ToString(), this.Font, Brushes.Red, 100, 120);
 | |
| 
 | |
|             //g.DrawString("최소="+Style.최소값.ToString(), this.Font, Brushes.Red, 100, 140); 
 | |
|             //g.DrawString("최대="+Style.최대값.ToString(), this.Font, Brushes.Red, 100, 160);
 | |
| 
 | |
|            Single term = (Style._endvolt - Style._startvolt) / 10;
 | |
| 
 | |
|            for (Single i = Style._startvolt; i <= Style._endvolt; i += term)
 | |
|             {
 | |
|                 // 세로길이 = 10v : 
 | |
|                 Single newy = GetYfromVolt(i, crect);
 | |
|                 if (i != 0) g.DrawLine(new Pen(Color.Gray), crect.Left, newy, crect.Left + crect.Width, newy);
 | |
| 
 | |
|                 //소수점없는경우에눈금표시한다.
 | |
|                 DrawString(g, i.ToString("#0.00"), Style._yfont, Brushes.Black, new PointF(crect.Left - 2, newy), EALIGN.RIGHT, EALIGN.CENTER);
 | |
|                 
 | |
| 
 | |
|                 
 | |
|                 //int disptime = i + startview;
 | |
|                 //String timestr = GetTimeStr(disptime, i == 0 ? true : false);
 | |
| 
 | |
|                 //DrawString(g, timestr, Style._xfont, Brushes.Orange, new PointF(newx, ChartRect.Top + ChartRect.Height), EALIGN.CENTER);
 | |
| 
 | |
|                 //if (i > 0) g.DrawLine(new Pen(Color.FromArgb(100, Color.Red)), newx, ChartRect.Top, newx, ChartRect.Top + ChartRect.Height);
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         public void Draw_Debug(Graphics g)
 | |
|         {
 | |
|             if (!Style.디버그메세지) return;
 | |
| 
 | |
|             Single newy = 50;
 | |
|             String newstr = "";
 | |
|             SizeF fontsize;
 | |
| 
 | |
|             newstr = "Mouseinfo=" + this.Mouseinfo.Position.ToString() + " " + this.Mouseinfo.Showinfo.ToString() ;
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
| 
 | |
|             newstr = "Mouseinfo0=" + this.Mouseinfo.Position0.ToString()+ " idx=" + this.Mouseinfo.DragIndex.ToString();
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
| 
 | |
|             if (uc.Count > 0)
 | |
|             {
 | |
|                 newstr = "uc1=" + uc[0].Newx.ToString() + "," + uc[0].Time.ToString();
 | |
|                 fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|                 g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
|             }
 | |
| 
 | |
|             if (uc.Count > 1)
 | |
|             {
 | |
|                 newstr = "uc2=" + uc[1].Newx.ToString() + "," + uc[1].Time.ToString();
 | |
|                 fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|                 g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
|             }
 | |
|             
 | |
|             newstr = "Time=" + starttime.ToString() + "/" + endtime.ToString();
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
| 
 | |
|             newstr = "ViewTime=" + startview.ToString() + "/" + endview.ToString();
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
| 
 | |
|             newstr = "ViewTimeO=" + startviewo.ToString() + "/" + endviewo.ToString();
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
|             
 | |
|             newstr = "Drag=" + Mouseinfo.Drag.ToString() + " " + Mouseinfo.DragType.ToString();
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
| 
 | |
|             newstr = "DragStart=" + Mouseinfo.DragStart.ToString();
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
| 
 | |
|             newstr = "UserZoom=" + UserZoom.ToString();
 | |
|             fontsize = g.MeasureString(newstr, this.Font); newy += fontsize.Height;
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
|             newy += fontsize.Height;
 | |
| 
 | |
|             newstr = "CHinfo=" + chinfo.GetUpperBound(0);
 | |
|             for (int i =0;i<= chinfo.GetUpperBound(0);i++)            
 | |
|             {
 | |
|                 newstr += "\n" + i.ToString()  + "," + this.chinfo[i].idx + ",visible:" + chinfo[i].Show.ToString();
 | |
|             }
 | |
|             fontsize = g.MeasureString(newstr, this.Font); 
 | |
|             g.DrawString(newstr, this.Font, Brushes.Red, 100, newy);
 | |
|             newy += fontsize.Height;
 | |
|         }
 | |
|         
 | |
|         public void Draw_channel(Graphics g,RectangleF crect,RectangleF wrect)
 | |
|         {
 | |
| 
 | |
|             //각채널의 그래프를 그린다.
 | |
|             foreach (CChinfo c in chinfo)
 | |
|             {
 | |
|                 if (c == null) continue;
 | |
|                 if (!c.Show) continue;
 | |
|                 if (c.Value.Count < 1) continue;
 | |
|                 
 | |
|                 List<PointF> linearrya = new List<PointF>(0);
 | |
| 
 | |
|                 Single PreX = 0;
 | |
|                 Single PreY = 0;
 | |
| 
 | |
|                 Boolean fc1 = false, fc2 = false;
 | |
|                 for (int i = 0; i < c.Value.Count; i++) //가능한 셀값을 모두 확인한다.
 | |
|                 {
 | |
|                     Single time = c.Time[i];    //이셀의 시간
 | |
|                     Single volt = c.Value[i];   //이셀의 볼트
 | |
| 
 | |
|                     //if (volt == 0) continue;
 | |
| 
 | |
|                     Single newx = GetXfromTime(time, crect) - 1;
 | |
|                     Single newy = GetYfromVolt(volt, crect) - 1;
 | |
| 
 | |
|                     //너무가까운데이터는 그리지 않는다.
 | |
|                     if (Math.Abs(newx - PreX) < 0.2 || Math.Abs(newy - PreY) < 0.2) continue;
 | |
| 
 | |
|                     if (!c.Show)
 | |
|                     {
 | |
|                         c.C1value = "--";
 | |
|                         c.C2value = "--";
 | |
|                     } else if (uc.Count > 0 &&  time >= uc[0].Time && fc1 == false)    //셀의시간이 커서의시간을 넘는 순간의 값을 저장
 | |
|                     {
 | |
| 
 | |
|                         //g.DrawString(uc[0].Time.ToString() + "," + time.ToString() + " volt=" + volt.ToString(), this.Font, Brushes.Red, 200, 200);
 | |
| 
 | |
|                         if (volt > 60) c.C1value = "OVER";
 | |
|                         else c.C1value = volt.ToString();
 | |
| 
 | |
|                         fc1 = true;
 | |
|                     }
 | |
|                     if (uc.Count > 1 &&  time >= uc[1].Time && fc2 == false)
 | |
|                     {
 | |
|                         //g.DrawString(uc[1].Time.ToString() + "," + time.ToString() + " volt=" + volt.ToString(), this.Font, Brushes.Red, 200, 300);
 | |
| 
 | |
|                         if (volt > 60) c.C2value = "OVER";
 | |
|                         else c.C2value =  volt.ToString();
 | |
|                         
 | |
|                         fc2 = true;
 | |
|                     }
 | |
|                  
 | |
|                     // e.Graphics.DrawString(time.ToString() + " v=" + volt.ToString(), this.Font, Brushes.Black, newx, newy);
 | |
|                     if (newx >= wrect.Left && newx <= wrect.Left + wrect.Width && newy >= wrect.Top && newy <= wrect.Top + wrect.Height) 
 | |
|                         linearrya.Add(new PointF(newx, newy));
 | |
| 
 | |
|                     g.FillEllipse(new SolidBrush(c.color),  new RectangleF(newx-1, newy-1, 2, 2));
 | |
|                 }
 | |
| 
 | |
|                 try {
 | |
|                     g.DrawLines(new Pen(c.color, LineWidth), linearrya.ToArray()); 
 | |
|                 }
 | |
|                 catch { }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Draw_ZoomSelct(Graphics g)
 | |
|         {
 | |
|             //사용자줌영역표시
 | |
|             if (this.UserZoom.Width != 0)
 | |
|             {
 | |
|                 int x, y, w, h;
 | |
|                 if (UserZoom.Width > 0)
 | |
|                 {
 | |
|                     x = UserZoom.Left;
 | |
|                     w = UserZoom.Width;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     x = UserZoom.Width + UserZoom.Left;
 | |
|                     w = Math.Abs(UserZoom.Width);
 | |
|                 }
 | |
|                 if (UserZoom.Height > 0)
 | |
|                 {
 | |
|                     y = UserZoom.Top;
 | |
|                     h = UserZoom.Height;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     y = UserZoom.Height + UserZoom.Top;
 | |
|                     h = Math.Abs(UserZoom.Height);
 | |
|                 }
 | |
| 
 | |
|                 Rectangle rect = new Rectangle(x, y, w, h);
 | |
|                 int startx = (int)Math.Round(GetTimeFromX(rect.Left - this.ChartRect.Left, ChartRect), 1);
 | |
|                 int endx = (int)Math.Round(GetTimeFromX(rect.Left + rect.Width - ChartRect.Left, ChartRect), 1);
 | |
|                 Single starty =(Single)(Math.Round(GetVoltfromY(rect.Top - this.ChartRect.Top, ChartRect), 1));
 | |
|                 Single endy = (Single)Math.Round(GetVoltfromY(rect.Top + rect.Height - ChartRect.Top, ChartRect), 1);
 | |
| 
 | |
|                 //선택된 영역 Drawing
 | |
|                 if (endx - startx >= 5) g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Lime)), rect);
 | |
|                 else g.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Red)), rect);
 | |
| 
 | |
|                 g.DrawRectangle(Pens.Black, rect);
 | |
| 
 | |
|                 //시간정보 Display
 | |
|                 g.DrawString(GetTimeStr(startx + starttime, true,true) + "," + (Style.최대값 - starty).ToString("#0.0") + "v" , this.Font, Brushes.Black, rect.Left, rect.Top);
 | |
| 
 | |
|                 String fontstr = GetTimeStr(endx + starttime, true, true) + "," + (Style.최대값 - endy).ToString("#0.0") + "v";
 | |
|                 SizeF fontsize = g.MeasureString(fontstr, this.Font);
 | |
|                 g.DrawString(fontstr, this.Font, Brushes.Black, rect.Left - 5 + rect.Width - fontsize.Width, rect.Top + rect.Height - fontsize.Height);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 화면의 좌,우 측에 존재하는 이돈버튼(월을 움직이는 버튼이며 월 이동을위해서 이벤트를 발생한다)
 | |
|         /// </summary>
 | |
|         /// <param name="G"></param>
 | |
|         //public void Draw_NaviLR(Graphics G, RectangleF crect)
 | |
|         //{
 | |
|         //    return;
 | |
| 
 | |
|         //    //LEFT NAVI
 | |
|         //    Single x, y, xw = 30;
 | |
|         //    x = crect.Left - 3;
 | |
|         //    y = crect.Top + crect.Height / 2 - xw / 2;
 | |
| 
 | |
|         //    PointF[] aa = new PointF[4];
 | |
|         //    aa[0] = new PointF(x, y);
 | |
|         //    aa[1] = new PointF(x - xw, y + xw);
 | |
|         //    aa[2] = new PointF(x, y + xw + xw);
 | |
|         //    aa[3] = new PointF(x, y);
 | |
| 
 | |
|         //    PointF[] aa1 = new PointF[4];
 | |
|         //    aa1[0] = new PointF(x + 2, y + 2);
 | |
|         //    aa1[1] = new PointF(x + 2 - xw, y + xw + 2);
 | |
|         //    aa1[2] = new PointF(x + 2, y + xw + xw + 2);
 | |
|         //    aa1[3] = new PointF(x + 2, y + 2);
 | |
|         //    G.FillPolygon(Brushes.Black, aa1);
 | |
|         //    G.FillPolygon(Brushes.DarkRed, aa);
 | |
|         //    G.DrawPolygon(Pens.Black, aa);
 | |
| 
 | |
|         //    Buttons.Add(new RectangleF(x - xw, y, xw, xw*2));
 | |
|         //    Buttonstag.Add("LBUTTON");
 | |
|         //    Buttonstype.Add(EBUTTONTYPE.LEFTMON);
 | |
| 
 | |
|         //    //RIGHT NAVI
 | |
|         //    x = crect.Left + crect.Width + 3;
 | |
|         //    y = crect.Top + crect.Height / 2 - xw / 2;
 | |
| 
 | |
|         //    aa = new PointF[4];
 | |
|         //    aa[0] = new PointF(x, y);
 | |
|         //    aa[1] = new PointF(x + xw, y + xw);
 | |
|         //    aa[2] = new PointF(x, y + xw + xw);
 | |
|         //    aa[3] = new PointF(x, y);
 | |
| 
 | |
|         //    aa1 = new PointF[4];
 | |
|         //    aa1[0] = new PointF(x + 2, y + 2);
 | |
|         //    aa1[1] = new PointF(x + 2 + xw, y + xw + 2);
 | |
|         //    aa1[2] = new PointF(x + 2, y + xw + xw + 2);
 | |
|         //    aa1[3] = new PointF(x + 2, y + 2);
 | |
|         //    G.FillPolygon(Brushes.Black, aa1);
 | |
|         //    G.FillPolygon(Brushes.DarkRed, aa);
 | |
|         //    G.DrawPolygon(Pens.Black, aa);
 | |
|         //    Buttons.Add(new RectangleF(x, y, xw, xw*2));
 | |
|         //    Buttonstag.Add("RBUTTON");
 | |
|         //    Buttonstype.Add(EBUTTONTYPE.RIGHTMON);
 | |
|         //}
 | |
| 
 | |
| 
 | |
|         public String GetDateTimeStr(Int64 Filetime, Boolean linefeed)
 | |
|         {
 | |
|             DateTime TimeDate = DateTime.FromFileTime(Filetime);
 | |
|             String timestr = "";
 | |
|             if (linefeed) timestr = TimeDate.ToShortDateString() + "\n" + TimeDate.ToShortTimeString();  //' yymm + "-" + day.ToString("00") + "\n" + hour.ToString("00") + ":" + min.ToString("00") + ":" + sec.ToString("00");
 | |
|             else timestr = TimeDate.ToString();// yymm + "-" + day.ToString("00") + " " + hour.ToString("00") + ":" + min.ToString("00") + ":" + sec.ToString("00");
 | |
|                       
 | |
|             return timestr;
 | |
|         }
 | |
|         public String GetTimeStr(Int64 Filetime, Boolean withday, Boolean withseconed, Boolean nolf = false, Boolean showyear = false)
 | |
|         {
 | |
|             DateTime TimeDate = DateTime.FromFileTime(Filetime);
 | |
|             String timestr = "";
 | |
| 
 | |
|             if (TimeDate.Second == 0 || !withseconed)
 | |
|                 timestr = TimeDate.ToString("HH:mm");//  TimeDate.Hour.ToString("00") + ":" +  TimeDate.Minute.ToString("00");
 | |
|             else
 | |
|                 timestr = TimeDate.ToString("HH:mm:ss"); // hour.ToString("00") + ":" + min.ToString("00") + ":" + sec.ToString("00");
 | |
| 
 | |
|             if (withday)
 | |
|             {
 | |
|                 if (showyear)
 | |
|                 {
 | |
|                     timestr = TimeDate.ToString("yyMM-dd") + " " +  timestr;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (nolf) timestr = TimeDate.ToString("dd") + "일 " + timestr;
 | |
|                     else timestr = timestr + "\n" + TimeDate.ToString("dd") + "일";
 | |
|                 }               
 | |
|             } 
 | |
|             return timestr;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// (전체시간 * 현재X) / 전체너비
 | |
|         /// </summary>
 | |
|         /// <param name="t"></param>
 | |
|         /// <returns></returns>
 | |
|         private Single GetTimeFromX(Single t, RectangleF crect)
 | |
|         {
 | |
|             return ((endview - startview) * t) / crect.Width;
 | |
|         }
 | |
|         private Single GetXfromTime(Single t,RectangleF crect)
 | |
|         {
 | |
|             return (((crect.Width) * (t - startview)) / (endview - startview)) + crect.Left;
 | |
|         }
 | |
|         private Single GetVoltfromY(Single Y, RectangleF crect)
 | |
|         {
 | |
| 
 | |
|             return ((Style._endvolt - Style._startvolt) * Y) / crect.Height;
 | |
| 
 | |
|         }
 | |
|         private Single GetYfromVolt(Single volt, RectangleF crect)
 | |
|         {
 | |
|             //volt = (Style._endvolt - Style._startvolt) - volt;
 | |
|             return (crect.Height - ((crect.Height * (volt - Style._startvolt)) / (Style._endvolt - Style._startvolt))) + crect.Top;
 | |
|             //return (((crect.Height) * volt) / (Style.최대값)) + crect.Top;
 | |
|             
 | |
|         }
 | |
| 
 | |
|         private void DrawString(Graphics G, String str, Font font, Brush br, PointF ops, EALIGN XCenter = EALIGN.LEFT, EALIGN YCenter = EALIGN.LEFT)
 | |
|         {
 | |
|             SizeF fsize = G.MeasureString(str, font);
 | |
|             Single newx = ops.X;            
 | |
|             Single newy = ops.Y;
 | |
| 
 | |
|             if (XCenter == EALIGN.CENTER) newx = ops.X - fsize.Width / 2;
 | |
|             else if (XCenter == EALIGN.RIGHT) newx = ops.X - fsize.Width;
 | |
| 
 | |
|             if (YCenter == EALIGN.CENTER) newy = ops.Y - fsize.Height / 2;
 | |
|             else if (YCenter == EALIGN.RIGHT) newy = ops.Y - fsize.Height;
 | |
| 
 | |
|             G.DrawString(str, font, br, newx, newy);
 | |
|         }
 | |
| 
 | |
|         public Int64 Starttime
 | |
|         {
 | |
|             get { return this.starttime; }
 | |
|             set { this.starttime = value; startview = value; }
 | |
|         }
 | |
| 
 | |
|         public Int64 Endtime
 | |
|         {
 | |
|             get { return this.endtime; }
 | |
|             set { this.endtime = value; endview = value; }
 | |
|         }
 | |
| 
 | |
|         public Int64 Startview
 | |
|         {
 | |
|             get { return this.startview; }
 | |
|             set { this.startview = value; }
 | |
|         }
 | |
| 
 | |
|         public Int64 Endview
 | |
|         {
 | |
|             get { return this.endview; }
 | |
|             set { this.endview = value; }
 | |
|         }
 | |
| 
 | |
|         public Boolean INIT
 | |
|         {
 | |
|             get { return this.init; }
 | |
|             set { this.init = value; }
 | |
|         }
 | |
|         public CChinfo[] CHInfo
 | |
|         {
 | |
|             get { return this.chinfo; }
 | |
|             set { this.chinfo = value; }
 | |
|         }
 | |
|         protected override void OnResize(EventArgs e)
 | |
|         {
 | |
|             base.OnResize(e);            
 | |
|             this.WindowRect = new RectangleF(0, 0, this.Width, this.Height);
 | |
|             this.ChartRect = new RectangleF(Style.왼쪽여백, (Style.위쪽여백/2), this.Width - (Style.왼쪽여백 * 2), (Single)(this.Height - (Style.위쪽여백 * 1.5)));
 | |
|             Invalidate();
 | |
|         }
 | |
| 
 | |
|         private int check_userpoint(MouseEventArgs e)
 | |
|         {
 | |
|             if (this.uc.Count ==0 ) return -1;
 | |
|             for (int i = 0; i < this.uc.Count; i++)
 | |
|             {
 | |
|                 CUserCursor uuc = this.uc[i];
 | |
| 
 | |
|                 //현재위치가 해당 Rectagle 안이라면 속해있다.                    
 | |
|                 if ((int)this.Mouseinfo.Position.X >= (int)uuc.Newx - 2 && (int)this.Mouseinfo.Position.X <= (int)(uuc.Newx) + 2)
 | |
| 
 | |
|                  //   MessageBox.Show(i.ToString());
 | |
| 
 | |
|                     return i;
 | |
|             }
 | |
|             return -1;
 | |
|         }
 | |
| 
 | |
|         //private int check_buttons(MouseEventArgs e)
 | |
|         //{
 | |
|         //    if (this.Buttons == null) return -1;
 | |
|         //    for (int i = 0; i < this.Buttons.Count; i++)
 | |
|         //    {
 | |
|         //        RectangleF rect = this.Buttons[i];
 | |
| 
 | |
|         //        //현재위치가 해당 Rectagle 안이라면 속해있다.                    
 | |
|         //        if (e.X > rect.X && e.X < rect.X + rect.Width)
 | |
|         //        {
 | |
|         //            if (e.Y > rect.Y && e.Y < rect.Y + rect.Height) return i;
 | |
|         //        }
 | |
|         //    }
 | |
|         //    return -1;
 | |
|         //}
 | |
|             
 | |
|         private void InitializeComponent()
 | |
|         {
 | |
|             this.SuspendLayout();
 | |
|             // 
 | |
|             // TrendCtrl
 | |
|             // 
 | |
|             this.Name = "TrendCtrl";
 | |
|             this.Size = new System.Drawing.Size(287, 321);
 | |
|             this.Load += new System.EventHandler(this.DispCtrl_Load);
 | |
|             this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.TrendCtrl_MouseDoubleClick);
 | |
|             this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DispCtrl_MouseDown);
 | |
|             this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DispCtrl_MouseMove);
 | |
|             this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.TrendCtrl_MouseUp);
 | |
|             this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.TrendCtrl_MouseWhell);
 | |
|             this.ResumeLayout(false);
 | |
| 
 | |
|         }
 | |
| 
 | |
|     private void DispCtrl_MouseDown(object sender, MouseEventArgs e)
 | |
|     {
 | |
| 
 | |
|         //드래그판단을위한 위치값을 저장한다.
 | |
|         Mouseinfo.DragStart = new PointF(e.X - ChartRect.Left, e.Y - ChartRect.Top);
 | |
| 
 | |
|         //우측버튼은 줌의 초기화를 수행한다.
 | |
|         if (e.Button == System.Windows.Forms.MouseButtons.Right)
 | |
|         {
 | |
|             //startview = starttime;
 | |
|             //endview = endtime;
 | |
|             //Style._startvolt = Style.최소값;
 | |
|             //Style._endvolt = Style.최대값;
 | |
|             //Refresh();
 | |
|             //return;
 | |
|         }
 | |
|         else if (e.Button == System.Windows.Forms.MouseButtons.Left)
 | |
|         {
 | |
|             //현재마우스위치의 아이템을 찾ㄴ은다.
 | |
|             //int idx = check_buttons(e);
 | |
|             //if (idx != -1)
 | |
|             //{
 | |
|             //    Object tt = this.Buttonstag[idx];
 | |
|             //    EBUTTONTYPE BT = this.Buttonstype[idx];
 | |
| 
 | |
|             //    switch (BT)
 | |
|             //    {
 | |
|             //        case EBUTTONTYPE.LEFTMON:
 | |
|             //            OnClickLEFT();
 | |
|             //            break;
 | |
|             //        case EBUTTONTYPE.RIGHTMON:
 | |
|             //            OnClickRIGHT();
 | |
|             //            break;
 | |
|             //    }
 | |
|             //}
 | |
| 
 | |
|             int idx = check_userpoint(e);
 | |
|             if (idx != -1)
 | |
|             {
 | |
|                 Mouseinfo.DragType = EDRAGTYPE.UC;
 | |
|                 Mouseinfo.DragIndex = idx;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             //아무것도없는 빈공간이라면 화면이동(=줌시작)으로 대체한다.
 | |
|             //if (idx == -1 && e.X >= ChartRect.Left && e.X <= ChartRect.Left + ChartRect.Width && e.Y >= ChartRect.Top && e.Y <= ChartRect.Top + ChartRect.Height)
 | |
|             //{
 | |
|             //    if (endview - startview == (endtime - starttime))
 | |
|             //    {
 | |
|             //        Mouseinfo.DragType = EDRAGTYPE.ZOOM;                    
 | |
|             //        this.UserZoom = new Rectangle(e.X, e.Y, 0, 0);
 | |
|             //    }
 | |
|             //    else
 | |
|             //    {
 | |
|             //         Mouseinfo.DragType = EDRAGTYPE.SCREEN;
 | |
|             //         this.UserZoom = new Rectangle(0, 0, 0, 0);
 | |
|             //    }
 | |
|             //    return;
 | |
|             //}
 | |
| 
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void DispCtrl_MouseMove(object sender, MouseEventArgs e)
 | |
|     {
 | |
|         //마우스의 위치가 실시간 저장된다.
 | |
|         if (this.Mouseinfo == null) this.Mouseinfo = new CMouseinfo(new PointF(e.X - this.WindowRect.Left, e.Y - this.WindowRect.Top));
 | |
|         else                        this.Mouseinfo.Position = new PointF(e.X - this.WindowRect.Left, e.Y - this.WindowRect.Top);
 | |
|    
 | |
|         this.Mouseinfo.Time = GetTimeFromX(e.X - ChartRect.Left,ChartRect)+ this.startview;
 | |
|         this.Mouseinfo.Volt = this._Style._endvolt -  GetVoltfromY(e.Y - ChartRect.Top, ChartRect) ;
 | |
|         this.Mouseinfo.Showinfo = false;
 | |
|         
 | |
|         //MouseStatus initialize...
 | |
|         Mouseinfo.Hand = false;
 | |
|         Mouseinfo.Cross = false;
 | |
|         Mouseinfo.Move = false;
 | |
|         Mouseinfo.ChangePos = false;
 | |
| 
 | |
|         //
 | |
|         if (e.X >= ChartRect.X && e.X <= ChartRect.X + ChartRect.Width)
 | |
|             if (e.Y >= ChartRect.Top && e.Y <= ChartRect.Top + ChartRect.Height) Mouseinfo.Showinfo = true;
 | |
|             else Mouseinfo.Showinfo = false;                                                     
 | |
| 
 | |
| 
 | |
|         //이동중인데 마우스가 눌려있다면 DRAG다
 | |
|         if (e.Button == MouseButtons.Left) Mouseinfo.Drag = true;
 | |
|         else Mouseinfo.Drag = false;
 | |
| 
 | |
|         if (Mouseinfo.Drag) //드래그중이다
 | |
|         {
 | |
|            Mouseinfo.Move = true; //화면이동으로
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             if (e.X >= ChartRect.Left && e.X <= ChartRect.Left + ChartRect.Width)
 | |
|             {
 | |
|                 if (e.Y >= ChartRect.Top && e.Y <= ChartRect.Top + ChartRect.Height)
 | |
|                 {
 | |
|                     Mouseinfo.Cross = true; //화면내부라면 크로스
 | |
|                 }
 | |
|                 else Mouseinfo.Cross = false;
 | |
|             }
 | |
|             else Mouseinfo.Cross = false;
 | |
|         }
 | |
|                   
 | |
|         //버튼위라면 HAND를 활성화한다.
 | |
|         //int idx = this.check_buttons(e);
 | |
|         //if (idx != -1)
 | |
|         //{
 | |
|         //    Mouseinfo.Cross = false;
 | |
|         //    Mouseinfo.Hand = true;
 | |
|         //    Mouseinfo.Drag = false;
 | |
|         //    Mouseinfo.ChangePos = false;
 | |
|         //} 
 | |
| 
 | |
|         //사용자포인터위라면?
 | |
|         int idx = this.check_userpoint(e);
 | |
|         if (idx != -1)
 | |
|         {
 | |
|             Mouseinfo.Cross = false;
 | |
|             Mouseinfo.Hand = false;
 | |
|             Mouseinfo.Drag = false;
 | |
|             Mouseinfo.ChangePos = true;
 | |
|         } 
 | |
| 
 | |
|         //드래그중판단
 | |
|         if (Mouseinfo.Drag)
 | |
|         {
 | |
|             switch (Mouseinfo.DragType)
 | |
|             {
 | |
|                 case EDRAGTYPE.UC:
 | |
|                     Single newx = ( e.X);
 | |
|                     float newtime = GetTimeFromX(newx - ChartRect.Left, ChartRect) + startview;
 | |
|                     this.uc[Mouseinfo.DragIndex].Newx = newx;
 | |
|                     this.uc[Mouseinfo.DragIndex].Time = newtime;
 | |
|                     //OnUpdateUserCursor(Mouseinfo.DragIndex);
 | |
|                     break;
 | |
|                 case EDRAGTYPE.ZOOM:
 | |
|                     this.UserZoom.Width = (int)(e.X - Mouseinfo.DragStart.X - ChartRect.Left);
 | |
|                     this.UserZoom.Height = (int)(e.Y - Mouseinfo.DragStart.Y - ChartRect.Left);
 | |
|                     if (Mouseinfo.Cross) this.Cursor = Cursors.Cross;
 | |
|                     break;
 | |
|                 case EDRAGTYPE.SCREEN:
 | |
|                     if (Mouseinfo.Move)
 | |
|                     {
 | |
|                         this.Cursor = Cursors.NoMove2D;
 | |
|                         Mouseinfo.Showinfo = false;
 | |
|                     }
 | |
| 
 | |
| 
 | |
|                     //이동한pixcel을 시간정보로 변환한다.
 | |
|                     //현재마우스위치값 - 드래그시작마우스위치값을 뺸 픽셀을 초로환산한다.
 | |
| 
 | |
|                     Single term =  Mouseinfo.DragStart.X-Mouseinfo.Position.X; //양수라면 오른쪽으로 이동했다.
 | |
|                     Single termtime = GetTimeFromX(term, ChartRect);
 | |
| 
 | |
|                     Single termy = Mouseinfo.Position.Y- Mouseinfo.DragStart.Y- ChartRect.Top  ;
 | |
|                     Single termvolt = GetVoltfromY(termy, ChartRect);
 | |
| 
 | |
|                     Single mstime = termtime ; //((endview - startview) / 50);
 | |
|                     Single mvolt = termvolt;
 | |
|                     //if (Mouseinfo.Position.X < Mouseinfo.Position0.X)
 | |
|                     //{
 | |
|                     //    mstime = -1 * mstime;
 | |
|                     //}
 | |
|                     Int64 SD = startviewo +  (int)mstime;
 | |
|                     Int64 ED = endviewo + (int)mstime;
 | |
| 
 | |
|                     Single SV = Style._startvolto + mvolt;
 | |
|                     Single EV = Style._endvolto + mvolt;
 | |
| 
 | |
|                     if ((SD < starttime || ED > endtime))
 | |
|                     {
 | |
|                         //더이상 줌을 못한다..
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         startview = SD;
 | |
|                         endview = ED;
 | |
| 
 | |
|                         Style._startvolt = SV;
 | |
|                         Style._endvolt = EV;
 | |
| 
 | |
|                         //startviewo = startview;
 | |
|                         //endviewo = endview;
 | |
|                     }
 | |
|                  
 | |
|                     
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             if (Mouseinfo.Hand) this.Cursor = Cursors.Hand;
 | |
|             if (Mouseinfo.Cross) this.Cursor = Cursors.Cross;
 | |
|             if (Mouseinfo.ChangePos) this.Cursor = Cursors.SizeWE;
 | |
|         }
 | |
| 
 | |
|         this.Refresh();
 | |
|     }
 | |
| 
 | |
|     private void TrendCtrl_MouseWhell(object sender, MouseEventArgs e)
 | |
|     {
 | |
|         //MessageBox.Show(e.Delta.ToString());
 | |
|         //int news = 0, newe = 0;
 | |
| 
 | |
|         //news = startview;
 | |
|         //newe = endview;
 | |
| 
 | |
|         //if (e.Delta > 0)
 | |
|         //{
 | |
|         //    //up
 | |
|         //    news += (endview-startview)/10;
 | |
|         //    newe -= (endview - startview) / 10;
 | |
|         //}
 | |
|         //else
 | |
|         //{
 | |
|         //    //down
 | |
|         //    news -= (endview - startview) / 10;
 | |
|         //    newe += (endview - startview) / 10;
 | |
|         //}
 | |
| 
 | |
|         //if (news > endtime) news = endtime;
 | |
|         //if (news < starttime) news = starttime;
 | |
|         //if (newe > endtime) newe = endtime;
 | |
|         //if (newe < starttime) newe = starttime;
 | |
| 
 | |
|         //if (news < starttime || newe > endtime)
 | |
|         //{
 | |
|         //    //MessageBox.Show("데이터가 없으므로 줌을 사용할 수 없습니다");                
 | |
|         //}
 | |
|         //else
 | |
|         //{
 | |
|         //    startview = news; 
 | |
|         //    endview = newe;
 | |
|         //    startviewo = news;
 | |
|         //    endviewo = newe;            
 | |
|         //}
 | |
|         //this.Refresh();
 | |
|       
 | |
|     }
 | |
| 
 | |
|     private void TrendCtrl_MouseUp(object sender, MouseEventArgs e)
 | |
|     {
 | |
|         if (Mouseinfo.Drag && Mouseinfo.DragType == EDRAGTYPE.UC)
 | |
|         {
 | |
|             ////만약 화면 박을 넘어서면 삭제한다.
 | |
|             //if (uc[Mouseinfo.DragIndex].Newx <= ChartRect.Left || uc[Mouseinfo.DragIndex].Newx >= ChartRect.Left + ChartRect.Width)
 | |
|             //{
 | |
|             //    uc.Remove(uc[Mouseinfo.DragIndex]);
 | |
|             //    if (uc.Count == 1)
 | |
|             //    {
 | |
|             //        uc[0].Idx = 0;
 | |
|             //        foreach (CChinfo c in this.chinfo)
 | |
|             //        {
 | |
|             //            c.C2value = "";
 | |
|             //        }
 | |
|             //    }
 | |
|             //}
 | |
|             this.Refresh();
 | |
|             OnUpdateUserCursor(Mouseinfo.DragIndex);
 | |
|         }
 | |
| 
 | |
|         //startviewo = startview;
 | |
|         //endviewo = endview;
 | |
|         //Style._startvolto = Style._startvolt;
 | |
|         //Style._endvolto = Style._endvolt;
 | |
| 
 | |
|         //Mouseinfo.Drag = false;
 | |
|         //if (UserZoom.Width != 0) //줌영역이 있다면 줌을 활성화한다.
 | |
|         //{
 | |
|         //    int x1, x2,y1,y2;
 | |
|         //    x1 = UserZoom.Left;
 | |
|         //    x2 = UserZoom.Left + UserZoom.Width;
 | |
|         //    y1 = UserZoom.Top;
 | |
|         //    y2 = UserZoom.Top + UserZoom.Height;
 | |
| 
 | |
|         //    int startx = (int)Math.Round(GetTimeFromX(x1 - ChartRect.Left, ChartRect), 0);
 | |
|         //    int endx = (int)Math.Round(GetTimeFromX(x2 - ChartRect.Left, ChartRect), 0);
 | |
| 
 | |
|         //    Single starty =(Single) Math.Round(GetVoltfromY(y1 - ChartRect.Top, ChartRect), 1);
 | |
|         //    Single endy = (Single)Math.Round(GetVoltfromY(y2 - ChartRect.Top, ChartRect), 1);
 | |
| 
 | |
|         //    if (endx < startx)  //교환
 | |
|         //    {
 | |
|         //        int t = startx;
 | |
|         //        startx = endx;
 | |
|         //        endx = t;
 | |
|         //    }
 | |
| 
 | |
|         //    //if (endy < starty)  //교환
 | |
|         //    //{
 | |
|         //    //    Single t = starty;
 | |
|         //    //    starty = endy;
 | |
|         //    //    endy = t;
 | |
|         //    //}
 | |
| 
 | |
|         //    if (endx - startx >= 10) //보기영역이 5초는 넘어야 줌이 가능한다.
 | |
|         //    {
 | |
|         //        this.startview = startx + this.starttime ;
 | |
|         //        this.endview = endx + this.starttime;
 | |
| 
 | |
|         //        this.startviewo = this.startview;
 | |
|         //        this.endviewo = this.endview;
 | |
| 
 | |
| 
 | |
|         //        if (starty < endy)
 | |
|         //        {
 | |
|         //            this.Style._endvolt = Style.최대값 - starty;// +this.Style.최소값;
 | |
|         //            this.Style._startvolt = Style.최대값 - endy;// +this.Style.최대값;
 | |
|         //        }
 | |
|         //        else
 | |
|         //        {
 | |
|         //            this.Style._startvolt = Style.최대값 - starty;// +this.Style.최소값;
 | |
|         //            this.Style._endvolt = Style.최대값 - endy;// +this.Style.최대값;
 | |
|         //        }
 | |
|                 
 | |
|         //        ////////////
 | |
|         //        this.Style._startvolto = this.Style._startvolt;
 | |
|         //        this.Style._endvolto = this.Style._endvolt;
 | |
| 
 | |
|         //        //////////////
 | |
| 
 | |
|         //        UserZoom.Width = 0;
 | |
|         //        this.Refresh();
 | |
|         //    }
 | |
|         //    else
 | |
|         //    {
 | |
|         //        UserZoom.Width = 0;
 | |
|         //        this.Refresh();
 | |
|         //    }
 | |
|         //}
 | |
|     }
 | |
| 
 | |
|     private void TrendCtrl_MouseDoubleClick(object sender, MouseEventArgs e)
 | |
|     {
 | |
|         //마우스더블클릭
 | |
|         int idx = check_userpoint(e);
 | |
|         if (idx != -1)
 | |
|         {
 | |
|             //삭제한다.
 | |
|             uc.Remove(uc[Mouseinfo.DragIndex]);
 | |
|             if (uc.Count == 1)
 | |
|             {
 | |
|                 uc[0].Idx = 0;
 | |
|                 foreach (CChinfo c in this.chinfo)
 | |
|                 {
 | |
|                     c.C2value = "";
 | |
|                 }
 | |
|             }
 | |
|             this.Refresh();
 | |
|             OnUpdateUserCursor(Mouseinfo.DragIndex);
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         if (e.Button == System.Windows.Forms.MouseButtons.Left)
 | |
|         {
 | |
|             if (this.uc.Count < 2)
 | |
|             {
 | |
|                 Single newx = GetXfromTime(Mouseinfo.Time, ChartRect);
 | |
|                 this.uc.Add(new CUserCursor((short)this.uc.Count, Mouseinfo.Time, newx));
 | |
|                 this.Refresh();
 | |
|                 OnUpdateUserCursor(this.uc.Count);
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private void DispCtrl_Load(object sender, EventArgs e)
 | |
|     {
 | |
| 
 | |
|     }
 | |
| 
 | |
|     
 | |
| 
 | |
|     }       //end class
 | |
| 
 | |
| }   //end namespace | 
