Browse Source

添加新文件(主窗体与用户控件)

wb_han 5 years ago
parent
commit
c1896944bf

+ 72 - 0
HOZProject/Colors/TextColors.cs

@@ -0,0 +1,72 @@
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+
+namespace HOZProject
+{
+    /// <summary>
+    /// Class TextColor.
+    /// </summary>
+    public class TextColors
+    {
+        /// <summary>
+        /// The more light
+        /// </summary>
+        private static Color _MoreLight = ColorTranslator.FromHtml("#c0c4cc");
+
+        /// <summary>
+        /// Gets the more light.
+        /// </summary>
+        /// <value>The more light.</value>
+        public static Color MoreLight
+        {
+            get { return _MoreLight; }
+            internal set { _MoreLight = value; }
+        }
+        /// <summary>
+        /// The light
+        /// </summary>
+        private static Color _Light = ColorTranslator.FromHtml("#909399");
+
+        /// <summary>
+        /// Gets the light.
+        /// </summary>
+        /// <value>The light.</value>
+        public static Color Light
+        {
+            get { return _Light; }
+            internal set { _Light = value; }
+        }
+        /// <summary>
+        /// The dark
+        /// </summary>
+        private static Color _Dark = ColorTranslator.FromHtml("#606266");
+
+        /// <summary>
+        /// Gets the dark.
+        /// </summary>
+        /// <value>The dark.</value>
+        public static Color Dark
+        {
+            get { return _Dark; }
+            internal set { _Dark = value; }
+        }
+        /// <summary>
+        /// The more dark
+        /// </summary>
+        private static Color _MoreDark = ColorTranslator.FromHtml("#303133");
+
+        /// <summary>
+        /// Gets the more dark.
+        /// </summary>
+        /// <value>The more dark.</value>
+        public static Color MoreDark
+        {
+            get { return _MoreDark; }
+            internal set { _MoreDark = value; }
+        }
+    }
+}

+ 275 - 0
HOZProject/FormHOZMain.Designer.cs

@@ -0,0 +1,275 @@
+namespace HOZProject
+{
+    partial class FormHOZMain
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.plMain = new System.Windows.Forms.Panel();
+            this.plFill = new System.Windows.Forms.Panel();
+            this.plProcess = new System.Windows.Forms.Panel();
+            this.plLeft = new System.Windows.Forms.Panel();
+            this.label1 = new System.Windows.Forms.Label();
+            this.plLeftContent = new System.Windows.Forms.Panel();
+            this.plTop = new System.Windows.Forms.Panel();
+            this.pbMax = new System.Windows.Forms.PictureBox();
+            this.pbMin = new System.Windows.Forms.PictureBox();
+            this.pbClose = new System.Windows.Forms.PictureBox();
+            this.pbLog = new System.Windows.Forms.PictureBox();
+            this.pbInit = new System.Windows.Forms.PictureBox();
+            this.pbSave = new System.Windows.Forms.PictureBox();
+            this.pbOpen = new System.Windows.Forms.PictureBox();
+            this.plMain.SuspendLayout();
+            this.plFill.SuspendLayout();
+            this.plLeft.SuspendLayout();
+            this.plTop.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.pbMax)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbMin)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbClose)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbLog)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbInit)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbSave)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbOpen)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // plMain
+            // 
+            this.plMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.plMain.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+            this.plMain.Controls.Add(this.plFill);
+            this.plMain.Controls.Add(this.plLeft);
+            this.plMain.Controls.Add(this.plTop);
+            this.plMain.Location = new System.Drawing.Point(12, 12);
+            this.plMain.Name = "plMain";
+            this.plMain.Size = new System.Drawing.Size(1000, 744);
+            this.plMain.TabIndex = 1;
+            // 
+            // plFill
+            // 
+            this.plFill.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.plFill.BackColor = System.Drawing.Color.Black;
+            this.plFill.Controls.Add(this.plProcess);
+            this.plFill.Location = new System.Drawing.Point(106, 86);
+            this.plFill.Name = "plFill";
+            this.plFill.Size = new System.Drawing.Size(894, 658);
+            this.plFill.TabIndex = 5;
+            // 
+            // plProcess
+            // 
+            this.plProcess.BackColor = System.Drawing.Color.White;
+            this.plProcess.Location = new System.Drawing.Point(1, 1);
+            this.plProcess.Name = "plProcess";
+            this.plProcess.Size = new System.Drawing.Size(218, 100);
+            this.plProcess.TabIndex = 2;
+            this.plProcess.Visible = false;
+            // 
+            // plLeft
+            // 
+            this.plLeft.BackColor = System.Drawing.Color.Black;
+            this.plLeft.Controls.Add(this.label1);
+            this.plLeft.Controls.Add(this.plLeftContent);
+            this.plLeft.Dock = System.Windows.Forms.DockStyle.Left;
+            this.plLeft.Location = new System.Drawing.Point(0, 80);
+            this.plLeft.Name = "plLeft";
+            this.plLeft.Size = new System.Drawing.Size(100, 664);
+            this.plLeft.TabIndex = 4;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.BackColor = System.Drawing.Color.Transparent;
+            this.label1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label1.ForeColor = System.Drawing.Color.Gainsboro;
+            this.label1.Location = new System.Drawing.Point(15, 3);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(70, 12);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "切入点列表";
+            // 
+            // plLeftContent
+            // 
+            this.plLeftContent.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.plLeftContent.AutoScroll = true;
+            this.plLeftContent.Location = new System.Drawing.Point(5, 19);
+            this.plLeftContent.Name = "plLeftContent";
+            this.plLeftContent.Size = new System.Drawing.Size(90, 645);
+            this.plLeftContent.TabIndex = 0;
+            // 
+            // plTop
+            // 
+            this.plTop.BackColor = System.Drawing.Color.Black;
+            this.plTop.Controls.Add(this.pbMax);
+            this.plTop.Controls.Add(this.pbMin);
+            this.plTop.Controls.Add(this.pbClose);
+            this.plTop.Controls.Add(this.pbLog);
+            this.plTop.Controls.Add(this.pbInit);
+            this.plTop.Controls.Add(this.pbSave);
+            this.plTop.Controls.Add(this.pbOpen);
+            this.plTop.Dock = System.Windows.Forms.DockStyle.Top;
+            this.plTop.Location = new System.Drawing.Point(0, 0);
+            this.plTop.Name = "plTop";
+            this.plTop.Size = new System.Drawing.Size(1000, 80);
+            this.plTop.TabIndex = 3;
+            // 
+            // pbMax
+            // 
+            this.pbMax.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.pbMax.BackgroundImage = global::HOZProject.Properties.Resources.Min_Gray;
+            this.pbMax.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.pbMax.Location = new System.Drawing.Point(935, 0);
+            this.pbMax.Name = "pbMax";
+            this.pbMax.Size = new System.Drawing.Size(28, 31);
+            this.pbMax.TabIndex = 7;
+            this.pbMax.TabStop = false;
+            this.pbMax.Click += new System.EventHandler(this.pbMax_Click);
+            // 
+            // pbMin
+            // 
+            this.pbMin.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.pbMin.BackgroundImage = global::HOZProject.Properties.Resources.Min_Gray;
+            this.pbMin.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.pbMin.Location = new System.Drawing.Point(901, 0);
+            this.pbMin.Name = "pbMin";
+            this.pbMin.Size = new System.Drawing.Size(28, 31);
+            this.pbMin.TabIndex = 7;
+            this.pbMin.TabStop = false;
+            this.pbMin.Click += new System.EventHandler(this.pbMin_Click);
+            this.pbMin.MouseEnter += new System.EventHandler(this.pbMin_MouseEnter);
+            this.pbMin.MouseLeave += new System.EventHandler(this.pbMin_MouseLeave);
+            // 
+            // pbClose
+            // 
+            this.pbClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.pbClose.BackgroundImage = global::HOZProject.Properties.Resources.exit_Gray;
+            this.pbClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.pbClose.Location = new System.Drawing.Point(969, 0);
+            this.pbClose.Name = "pbClose";
+            this.pbClose.Size = new System.Drawing.Size(28, 31);
+            this.pbClose.TabIndex = 7;
+            this.pbClose.TabStop = false;
+            this.pbClose.Click += new System.EventHandler(this.pbClose_Click);
+            this.pbClose.MouseEnter += new System.EventHandler(this.pbClose_MouseEnter);
+            this.pbClose.MouseLeave += new System.EventHandler(this.pbClose_MouseLeave);
+            // 
+            // pbLog
+            // 
+            this.pbLog.BackgroundImage = global::HOZProject.Properties.Resources.Log;
+            this.pbLog.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.pbLog.Cursor = System.Windows.Forms.Cursors.Hand;
+            this.pbLog.Location = new System.Drawing.Point(228, 6);
+            this.pbLog.Name = "pbLog";
+            this.pbLog.Size = new System.Drawing.Size(68, 71);
+            this.pbLog.TabIndex = 6;
+            this.pbLog.TabStop = false;
+            this.pbLog.Click += new System.EventHandler(this.pbLog_Click);
+            // 
+            // pbInit
+            // 
+            this.pbInit.BackgroundImage = global::HOZProject.Properties.Resources.init;
+            this.pbInit.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.pbInit.Cursor = System.Windows.Forms.Cursors.Hand;
+            this.pbInit.Location = new System.Drawing.Point(154, 6);
+            this.pbInit.Name = "pbInit";
+            this.pbInit.Size = new System.Drawing.Size(68, 71);
+            this.pbInit.TabIndex = 5;
+            this.pbInit.TabStop = false;
+            this.pbInit.Click += new System.EventHandler(this.pbInit_Click);
+            // 
+            // pbSave
+            // 
+            this.pbSave.BackgroundImage = global::HOZProject.Properties.Resources.save;
+            this.pbSave.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.pbSave.Cursor = System.Windows.Forms.Cursors.Hand;
+            this.pbSave.Location = new System.Drawing.Point(80, 6);
+            this.pbSave.Name = "pbSave";
+            this.pbSave.Size = new System.Drawing.Size(68, 71);
+            this.pbSave.TabIndex = 4;
+            this.pbSave.TabStop = false;
+            // 
+            // pbOpen
+            // 
+            this.pbOpen.BackgroundImage = global::HOZProject.Properties.Resources.open;
+            this.pbOpen.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+            this.pbOpen.Cursor = System.Windows.Forms.Cursors.Hand;
+            this.pbOpen.Location = new System.Drawing.Point(6, 6);
+            this.pbOpen.Name = "pbOpen";
+            this.pbOpen.Size = new System.Drawing.Size(68, 71);
+            this.pbOpen.TabIndex = 3;
+            this.pbOpen.TabStop = false;
+            // 
+            // FormHOZMain
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.SystemColors.WindowFrame;
+            this.ClientSize = new System.Drawing.Size(1024, 768);
+            this.ControlBox = false;
+            this.Controls.Add(this.plMain);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+            this.Name = "FormHOZMain";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "FormHOZMain";
+            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+            this.Load += new System.EventHandler(this.FormHOZMain_Load);
+            this.plMain.ResumeLayout(false);
+            this.plFill.ResumeLayout(false);
+            this.plLeft.ResumeLayout(false);
+            this.plLeft.PerformLayout();
+            this.plTop.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.pbMax)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbMin)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbClose)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbLog)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbInit)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbSave)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pbOpen)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+        private System.Windows.Forms.Panel plMain;
+        public System.Windows.Forms.Panel plProcess;
+        private System.Windows.Forms.Panel plLeft;
+        public System.Windows.Forms.Panel plTop;
+        public System.Windows.Forms.Panel plFill;
+        public System.Windows.Forms.Panel plLeftContent;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.PictureBox pbOpen;
+        private System.Windows.Forms.PictureBox pbLog;
+        private System.Windows.Forms.PictureBox pbInit;
+        private System.Windows.Forms.PictureBox pbSave;
+        private System.Windows.Forms.PictureBox pbMin;
+        private System.Windows.Forms.PictureBox pbClose;
+        private System.Windows.Forms.PictureBox pbMax;
+    }
+}

+ 120 - 0
HOZProject/FormHOZMain.cs

@@ -0,0 +1,120 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    public partial class FormHOZMain : Form
+    {
+        public FormHOZMain()
+        {
+            InitializeComponent();
+        }
+        
+        private void FormHOZMain_Load(object sender, EventArgs e)
+        {
+            CreateCutHoleList();
+            //加载控件的点击事件
+            this.Click += new EventHandler(FormHOZMain_Click);
+            plFill.Click += new EventHandler(FormHOZMain_Click);
+            plTop.Click += new EventHandler(FormHOZMain_Click);
+            plLeft.Click += new EventHandler(FormHOZMain_Click);
+            plLeftContent.Click += new EventHandler(FormHOZMain_Click);
+        }
+
+        public void CreateCutHoleList()
+        {
+            for (int i = 0; i < 5; i++)
+            {
+                UControl_CutHole ucCutHole = new UControl_CutHole(this);
+                ucCutHole.Dock = DockStyle.Top;
+                ucCutHole.CutHoleName = "切孔" + (i + 1);
+                plLeftContent.Controls.Add(ucCutHole);
+            }
+        }
+
+        private void FormHOZMain_Click(object sender, EventArgs e)
+        {
+            if (plProcess.Visible)
+            {
+                plProcess.Visible = false;
+            }
+        }
+
+        private void pbInit_Click(object sender, EventArgs e)
+        {
+            Form form = new Form();
+            form.StartPosition = FormStartPosition.CenterScreen;
+            UControl_Init uControl_Init = new UControl_Init();
+            form.FormBorderStyle = FormBorderStyle.None;
+            form.Width = uControl_Init.Width;
+            form.Height = uControl_Init.Height;
+            form.Controls.Add(uControl_Init);
+            form.ShowDialog();
+        }
+
+        private void pbLog_Click(object sender, EventArgs e)
+        {
+            Form form = new Form();
+            form.StartPosition = FormStartPosition.CenterScreen;
+            UControl_Log uControl_Log = new UControl_Log();
+            form.FormBorderStyle = FormBorderStyle.None;
+            form.Width = uControl_Log.Width;
+            form.Height = uControl_Log.Height;
+            form.Controls.Add(uControl_Log);
+            form.ShowDialog();
+        }
+
+        #region 窗体 最大化 最小化 关闭 按钮事件
+        private void pbMin_MouseEnter(object sender, EventArgs e)
+        {
+            this.pbMin.BackgroundImage = global::HOZProject.Properties.Resources.Min_Blue;
+        }
+
+        private void pbMin_MouseLeave(object sender, EventArgs e)
+        {
+            this.pbMin.BackgroundImage = global::HOZProject.Properties.Resources.Min_Gray;
+        }
+
+        private void pbClose_MouseEnter(object sender, EventArgs e)
+        {
+            this.pbClose.BackgroundImage = global::HOZProject.Properties.Resources.exit_Red;
+        }
+
+        private void pbClose_MouseLeave(object sender, EventArgs e)
+        {
+            this.pbClose.BackgroundImage = global::HOZProject.Properties.Resources.exit_Gray;
+        }
+
+        private void pbClose_Click(object sender, EventArgs e)
+        {
+            this.Close();
+        }
+
+        private void pbMin_Click(object sender, EventArgs e)
+        {
+            this.WindowState = FormWindowState.Minimized;
+        }
+
+        private void pbMax_Click(object sender, EventArgs e)
+        {
+            if (this.WindowState == FormWindowState.Maximized)
+            {
+                this.WindowState = FormWindowState.Normal;
+            }
+            else
+            {
+                this.WindowState = FormWindowState.Maximized;
+            }
+            //窗体据中
+            this.StartPosition = FormStartPosition.CenterScreen;
+        } 
+        #endregion
+    }
+}

+ 120 - 0
HOZProject/FormHOZMain.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 1135 - 0
HOZProject/Helpers/ControlHelper.cs

@@ -0,0 +1,1135 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    /// <summary>
+    /// Class ControlHelper.
+    /// </summary>
+    public static class ControlHelper
+    {
+        #region 设置控件Enabled,切不改变控件颜色
+        /// <summary>
+        /// 功能描述:设置控件Enabled,切不改变控件颜色
+        /// 作  者:HZH
+        /// 创建日期:2019-03-04 13:43:32
+        /// 任务编号:POS
+        /// </summary>
+        /// <param name="c">c</param>
+        /// <param name="enabled">enabled</param>
+        public static void SetControlEnabled(this Control c, bool enabled)
+        {
+            if (!c.IsDisposed)
+            {
+                if (enabled)
+                {
+                    ControlHelper.SetWindowLong(c.Handle, -16, -134217729 & ControlHelper.GetWindowLong(c.Handle, -16));
+                }
+                else
+                {
+                    ControlHelper.SetWindowLong(c.Handle, -16, 134217728 + ControlHelper.GetWindowLong(c.Handle, -16));
+                }
+            }
+        }
+
+        /// <summary>
+        /// 功能描述:设置控件Enabled,切不改变控件颜色
+        /// 作  者:HZH
+        /// 创建日期:2019-03-04 13:43:32
+        /// 任务编号:POS
+        /// </summary>
+        /// <param name="cs">cs</param>
+        /// <param name="enabled">enabled</param>
+        public static void SetControlEnableds(Control[] cs, bool enabled)
+        {
+            for (int i = 0; i < cs.Length; i++)
+            {
+                Control c = cs[i];
+                SetControlEnabled(c, enabled);
+            }
+        }
+        #endregion
+        /// <summary>
+        /// Sets the window long.
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <param name="nIndex">Index of the n.</param>
+        /// <param name="wndproc">The wndproc.</param>
+        /// <returns>System.Int32.</returns>
+        [DllImport("user32.dll ")]
+        public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int wndproc);
+
+        /// <summary>
+        /// Gets the window long.
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <param name="nIndex">Index of the n.</param>
+        /// <returns>System.Int32.</returns>
+        [DllImport("user32.dll ")]
+        public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
+
+        /// <summary>
+        /// Gets the foreground window.
+        /// </summary>
+        /// <returns>IntPtr.</returns>
+        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
+        public static extern IntPtr GetForegroundWindow();
+
+        /// <summary>
+        /// Threads the base call back.
+        /// </summary>
+        /// <param name="parent">The parent.</param>
+        /// <param name="obj">The object.</param>
+        private static void ThreadBaseCallBack(Control parent, object obj)
+        {
+            if (obj is Exception)
+            {
+                if (parent != null)
+                {
+                    ThreadInvokerControl(parent, delegate
+                    {
+                        Exception ex = obj as Exception;
+                    });
+                }
+            }
+        }
+        /// <summary>
+        /// 委托调用主线程控件
+        /// </summary>
+        /// <param name="parent">主线程控件</param>
+        /// <param name="action">修改控件方法</param>
+        public static void ThreadInvokerControl(Control parent, Action action)
+        {
+            if (parent != null)
+            {
+                if (parent.InvokeRequired)
+                {
+                    parent.BeginInvoke(action);
+                }
+                else
+                {
+                    action();
+                    SetForegroundWindow(parent.Handle);
+                }
+            }
+        }
+      
+        /// <summary>
+        /// Sets the foreground window.
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
+        [DllImport("user32.dll")]
+        public static extern bool SetForegroundWindow(IntPtr hWnd);
+
+        /// <summary>
+        /// Closes the process panel.
+        /// </summary>
+        /// <param name="parent">The parent.</param>
+        public static void CloseProcessPanel(Control parent)
+        {
+            if (parent.InvokeRequired)
+            {
+                parent.BeginInvoke(new MethodInvoker(delegate
+                {
+                    CloseProcessPanel(parent);
+                }));
+            }
+            else if (parent != null)
+            {
+                Control control = HaveProcessPanelControl(parent);
+                if (control != null)
+                {
+                    Form frm = control.Tag as Form;
+                    if (frm != null && !frm.IsDisposed && frm.Visible)
+                    {
+                        if (frm.InvokeRequired)
+                        {
+                            frm.BeginInvoke(new MethodInvoker(delegate
+                            {
+                                frm.Hide();
+                            }));
+                        }
+                        else
+                        {
+                            frm.Hide();
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// Haves the process panel control.
+        /// </summary>
+        /// <param name="parent">The parent.</param>
+        /// <returns>Control.</returns>
+        public static Control HaveProcessPanelControl(Control parent)
+        {
+            Control[] array = parent.Controls.Find("myprogressPanelext", false);
+            Control result;
+            if (array.Length > 0)
+            {
+                result = array[0];
+            }
+            else
+            {
+                result = null;
+            }
+            return result;
+        }
+
+      
+
+        /// <summary>
+        /// Converts to array.
+        /// </summary>
+        /// <param name="controls">The controls.</param>
+        /// <returns>Control[].</returns>
+        public static Control[] ToArray(this System.Windows.Forms.Control.ControlCollection controls)
+        {
+            if (controls == null || controls.Count <= 0)
+                return new Control[0];
+            List<Control> lst = new List<Control>();
+            foreach (Control item in controls)
+            {
+                lst.Add(item);
+            }
+            return lst.ToArray();
+        }
+
+
+        #region 根据控件宽度截取字符串
+        /// <summary>
+        /// 功能描述:根据控件宽度截取字符串
+        /// 作  者:HZH
+        /// 创建日期:2019-06-27 10:49:10
+        /// 任务编号:POS
+        /// </summary>
+        /// <param name="strSource">字符串</param>
+        /// <param name="fltControlWidth">控件宽度</param>
+        /// <param name="g">Graphics</param>
+        /// <param name="font">字体</param>
+        /// <returns>截取后的字符串</returns>
+        public static string GetSubString(
+            string strSource,
+            float fltControlWidth,
+            System.Drawing.Graphics g,
+            System.Drawing.Font font)
+        {
+            try
+            {
+                fltControlWidth = fltControlWidth - 20;
+                strSource = strSource.Trim();
+                while (true)
+                {
+
+                    System.Drawing.SizeF sizeF = g.MeasureString(strSource.Replace(" ", "A"), font);
+                    if (sizeF.Width > fltControlWidth)
+                    {
+                        strSource = strSource.TrimEnd('…');
+                        if (strSource.Length <= 1)
+                            return "";
+                        strSource = strSource.Substring(0, strSource.Length - 1).Trim() + "…";
+                    }
+                    else
+                    {
+                        return strSource;
+                    }
+                }
+            }
+            finally
+            {
+                g.Dispose();
+            }
+        }
+        #endregion
+
+        #region 获取字符串宽度
+        /// <summary>
+        /// 功能描述:获取字符串宽度
+        /// 作  者:HZH
+        /// 创建日期:2019-06-27 11:54:50
+        /// 任务编号:POS
+        /// </summary>
+        /// <param name="strSource">strSource</param>
+        /// <param name="g">g</param>
+        /// <param name="font">font</param>
+        /// <returns>返回值</returns>
+        public static int GetStringWidth(
+           string strSource,
+           System.Drawing.Graphics g,
+           System.Drawing.Font font)
+        {
+            string[] strs = strSource.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
+            float fltWidth = 0;
+            foreach (var item in strs)
+            {
+                System.Drawing.SizeF sizeF = g.MeasureString(strSource.Replace(" ", "A"), font);
+                if (sizeF.Width > fltWidth)
+                    fltWidth = sizeF.Width;
+            }
+
+            return (int)fltWidth;
+        }
+        #endregion
+
+        #region 动画特效
+        /// <summary>
+        /// Animates the window.
+        /// </summary>
+        /// <param name="whnd">The WHND.</param>
+        /// <param name="dwtime">The dwtime.</param>
+        /// <param name="dwflag">The dwflag.</param>
+        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
+        [DllImport("user32.dll")]
+        public static extern bool AnimateWindow(IntPtr whnd, int dwtime, int dwflag);
+        //dwflag的取值如下
+        /// <summary>
+        /// The aw hor positive
+        /// </summary>
+        public const Int32 AW_HOR_POSITIVE = 0x00000001;
+        //从左到右显示
+        /// <summary>
+        /// The aw hor negative
+        /// </summary>
+        public const Int32 AW_HOR_NEGATIVE = 0x00000002;
+        //从右到左显示
+        /// <summary>
+        /// The aw ver positive
+        /// </summary>
+        public const Int32 AW_VER_POSITIVE = 0x00000004;
+        //从上到下显示
+        /// <summary>
+        /// The aw ver negative
+        /// </summary>
+        public const Int32 AW_VER_NEGATIVE = 0x00000008;
+        //从下到上显示
+        /// <summary>
+        /// The aw center
+        /// </summary>
+        public const Int32 AW_CENTER = 0x00000010;
+        //若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;否则使窗口向外扩展,即展开窗口
+        /// <summary>
+        /// The aw hide
+        /// </summary>
+        public const Int32 AW_HIDE = 0x00010000;
+        //隐藏窗口,缺省则显示窗口
+        /// <summary>
+        /// The aw activate
+        /// </summary>
+        public const Int32 AW_ACTIVATE = 0x00020000;
+        //激活窗口。在使用了AW_HIDE标志后不能使用这个标志
+        /// <summary>
+        /// The aw slide
+        /// </summary>
+        public const Int32 AW_SLIDE = 0x00040000;
+        //使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略
+        /// <summary>
+        /// The aw blend
+        /// </summary>
+        public const Int32 AW_BLEND = 0x00080000;
+        //透明度从高到低
+        #endregion
+            
+        #region 冻结控件
+        /// <summary>
+        /// The m LST freeze control
+        /// </summary>
+        static Dictionary<Control, bool> m_lstFreezeControl = new Dictionary<Control, bool>();
+        /// <summary>
+        /// 功能描述:停止更新控件
+        /// 作  者:HZH
+        /// 创建日期:2019-07-13 11:11:32
+        /// 任务编号:POS
+        /// </summary>
+        /// <param name="control">control</param>
+        /// <param name="blnToFreeze">是否停止更新</param>
+        public static void FreezeControl(Control control, bool blnToFreeze)
+        {
+            if (blnToFreeze && control.IsHandleCreated && control.Visible && !control.IsDisposed && (!m_lstFreezeControl.ContainsKey(control) || (m_lstFreezeControl.ContainsKey(control) && m_lstFreezeControl[control] == false)))
+            {
+                m_lstFreezeControl[control] = true;
+                control.Disposed += control_Disposed;
+                NativeMethods.SendMessage(control.Handle, 11, 0, 0);
+            }
+            else if (!blnToFreeze && !control.IsDisposed && m_lstFreezeControl.ContainsKey(control) && m_lstFreezeControl[control] == true)
+            {
+                m_lstFreezeControl.Remove(control);
+                NativeMethods.SendMessage(control.Handle, 11, 1, 0);
+                control.Invalidate(true);
+            }
+        }
+
+        /// <summary>
+        /// Handles the Disposed event of the control control.
+        /// </summary>
+        /// <param name="sender">The source of the event.</param>
+        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
+        static void control_Disposed(object sender, EventArgs e)
+        {
+            try
+            {
+                if (m_lstFreezeControl.ContainsKey((Control)sender))
+                    m_lstFreezeControl.Remove((Control)sender);
+            }
+            catch { }
+        }
+        #endregion
+
+        /// <summary>
+        /// 设置GDI高质量模式抗锯齿
+        /// </summary>
+        /// <param name="g">The g.</param>
+        public static void SetGDIHigh(this Graphics g)
+        {
+            g.SmoothingMode = SmoothingMode.AntiAlias;  //使绘图质量最高,即消除锯齿
+            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
+            g.CompositingQuality = CompositingQuality.HighQuality;
+        }
+
+        /// <summary>
+        /// 根据矩形和圆得到一个圆角矩形Path
+        /// </summary>
+        /// <param name="rect">The rect.</param>
+        /// <param name="cornerRadius">The corner radius.</param>
+        /// <returns>GraphicsPath.</returns>
+        public static GraphicsPath CreateRoundedRectanglePath(this Rectangle rect, int cornerRadius)
+        {
+            GraphicsPath roundedRect = new GraphicsPath();
+            roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
+            roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);
+            roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);
+            roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);
+            roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);
+            roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom);
+            roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
+            roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);
+            roundedRect.CloseFigure();
+            return roundedRect;
+        }
+
+        /// <summary>
+        /// Creates the rounded rectangle path.
+        /// </summary>
+        /// <param name="rect">The rect.</param>
+        /// <param name="cornerRadius">The corner radius.</param>
+        /// <returns>GraphicsPath.</returns>
+        public static GraphicsPath CreateRoundedRectanglePath(this RectangleF rect, int cornerRadius)
+        {
+            GraphicsPath roundedRect = new GraphicsPath();
+            roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
+            roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);
+            roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);
+            roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);
+            roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);
+            roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom);
+            roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
+            roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);
+            roundedRect.CloseFigure();
+            return roundedRect;
+        }
+        /// <summary>
+        /// Gets the colors.
+        /// </summary>
+        /// <value>The colors.</value>
+        public static Color[] Colors { get; private set; }
+
+        static ControlHelper()
+        {
+            List<Color> list = new List<Color>();
+            list.Add(Color.FromArgb(55, 162, 218));
+            list.Add(Color.FromArgb(50, 197, 233));
+            list.Add(Color.FromArgb(103, 224, 227));
+            list.Add(Color.FromArgb(159, 230, 184));
+            list.Add(Color.FromArgb(255, 219, 92));
+            list.Add(Color.FromArgb(255, 159, 127));
+            list.Add(Color.FromArgb(251, 114, 147));
+            list.Add(Color.FromArgb(224, 98, 174));
+            list.Add(Color.FromArgb(230, 144, 209));
+            list.Add(Color.FromArgb(231, 188, 243));
+            list.Add(Color.FromArgb(157, 150, 245));
+            list.Add(Color.FromArgb(131, 120, 234));
+            list.Add(Color.FromArgb(150, 191, 255));
+
+            list.Add(Color.FromArgb(243, 67, 54));
+            list.Add(Color.FromArgb(156, 39, 176));
+            list.Add(Color.FromArgb(103, 58, 183));
+            list.Add(Color.FromArgb(63, 81, 181));
+            list.Add(Color.FromArgb(33, 150, 243));
+            list.Add(Color.FromArgb(0, 188, 211));
+            list.Add(Color.FromArgb(3, 169, 244));
+            list.Add(Color.FromArgb(0, 150, 136));
+            list.Add(Color.FromArgb(139, 195, 74));
+            list.Add(Color.FromArgb(76, 175, 80));
+            list.Add(Color.FromArgb(204, 219, 57));
+            list.Add(Color.FromArgb(233, 30, 99));
+            list.Add(Color.FromArgb(254, 234, 59));
+            list.Add(Color.FromArgb(254, 192, 7));
+            list.Add(Color.FromArgb(254, 152, 0));
+            list.Add(Color.FromArgb(255, 87, 34));
+            list.Add(Color.FromArgb(121, 85, 72));
+            list.Add(Color.FromArgb(158, 158, 158));
+            list.Add(Color.FromArgb(96, 125, 139));
+            list.Add(Color.FromArgb(252, 117, 85));
+            list.Add(Color.FromArgb(172, 113, 191));
+            list.Add(Color.FromArgb(115, 131, 253));
+            list.Add(Color.FromArgb(78, 206, 255));
+            list.Add(Color.FromArgb(121, 195, 82));
+            list.Add(Color.FromArgb(255, 163, 28));
+            list.Add(Color.FromArgb(255, 185, 15));
+            list.Add(Color.FromArgb(255, 181, 197));
+            list.Add(Color.FromArgb(255, 110, 180));
+            list.Add(Color.FromArgb(255, 69, 0));
+            list.Add(Color.FromArgb(255, 48, 48));
+            list.Add(Color.FromArgb(154, 205, 50));
+            list.Add(Color.FromArgb(155, 205, 155));
+            list.Add(Color.FromArgb(154, 50, 205));
+            list.Add(Color.FromArgb(131, 111, 255));
+            list.Add(Color.FromArgb(124, 205, 124));
+            list.Add(Color.FromArgb(0, 206, 209));
+            list.Add(Color.FromArgb(0, 178, 238));
+            list.Add(Color.FromArgb(56, 142, 142));
+
+            Type typeFromHandle = typeof(Color);
+            PropertyInfo[] properties = typeFromHandle.GetProperties();
+            PropertyInfo[] array = properties;
+            for (int i = 0; i < array.Length; i++)
+            {
+                PropertyInfo propertyInfo = array[i];
+                if (propertyInfo.PropertyType == typeof(Color) && (propertyInfo.Name.StartsWith("Dark") || propertyInfo.Name.StartsWith("Medium")))
+                {
+                    object value = propertyInfo.GetValue(null, null);
+                    list.Add((Color)value);
+                }
+            }
+            Colors = list.ToArray();
+        }
+        /// <summary>
+        /// Draws the string.
+        /// </summary>
+        /// <param name="g">The g.</param>
+        /// <param name="s">The s.</param>
+        /// <param name="font">The font.</param>
+        /// <param name="brush">The brush.</param>
+        /// <param name="point">The point.</param>
+        /// <param name="format">The format.</param>
+        /// <param name="angle">The angle.</param>
+        public static void DrawString(Graphics g, string s, Font font, Brush brush, PointF point, StringFormat format, float angle)
+        {
+            Matrix transform = g.Transform;
+            Matrix transform2 = g.Transform;
+            transform2.RotateAt(angle, point);
+            g.Transform = transform2;
+            g.DrawString(s, font, brush, point, format);
+            g.Transform = transform;
+        }
+
+        /// <summary>
+        /// Gets the rhombus from rectangle.
+        /// </summary>
+        /// <param name="rect">The rect.</param>
+        /// <returns>Point[].</returns>
+        public static Point[] GetRhombusFromRectangle(Rectangle rect)
+        {
+            return new Point[5]
+            {
+                new Point(rect.X, rect.Y + rect.Height / 2),
+                new Point(rect.X + rect.Width / 2, rect.Y + rect.Height - 1),
+                new Point(rect.X + rect.Width - 1, rect.Y + rect.Height / 2),
+                new Point(rect.X + rect.Width / 2, rect.Y),
+                new Point(rect.X, rect.Y + rect.Height / 2)
+            };
+        }
+
+        /// <summary>
+        /// Computes the paint location y.
+        /// </summary>
+        /// <param name="max">The maximum.</param>
+        /// <param name="min">The minimum.</param>
+        /// <param name="height">The height.</param>
+        /// <param name="value">The value.</param>
+        /// <returns>System.Single.</returns>
+        public static float ComputePaintLocationY(int max, int min, int height, int value)
+        {
+            if ((float)(max - min) == 0f)
+            {
+                return height;
+            }
+            return (float)height - (float)(value - min) * 1f / (float)(max - min) * (float)height;
+        }
+
+        /// <summary>
+        /// Computes the paint location y.
+        /// </summary>
+        /// <param name="max">The maximum.</param>
+        /// <param name="min">The minimum.</param>
+        /// <param name="height">The height.</param>
+        /// <param name="value">The value.</param>
+        /// <returns>System.Single.</returns>
+        public static float ComputePaintLocationY(float max, float min, float height, float value)
+        {
+            if (max - min == 0f)
+            {
+                return height;
+            }
+            return height - (value - min) / (max - min) * height;
+        }
+
+
+        /// <summary>
+        /// Paints the coordinate divide.
+        /// </summary>
+        /// <param name="g">The g.</param>
+        /// <param name="penLine">The pen line.</param>
+        /// <param name="penDash">The pen dash.</param>
+        /// <param name="font">The font.</param>
+        /// <param name="brush">The brush.</param>
+        /// <param name="sf">The sf.</param>
+        /// <param name="degree">The degree.</param>
+        /// <param name="max">The maximum.</param>
+        /// <param name="min">The minimum.</param>
+        /// <param name="width">The width.</param>
+        /// <param name="height">The height.</param>
+        /// <param name="left">The left.</param>
+        /// <param name="right">The right.</param>
+        /// <param name="up">Up.</param>
+        /// <param name="down">Down.</param>
+        public static void PaintCoordinateDivide(Graphics g, System.Drawing.Pen penLine, System.Drawing.Pen penDash, Font font, System.Drawing.Brush brush, StringFormat sf, int degree, int max, int min, int width, int height, int left = 60, int right = 8, int up = 8, int down = 8)
+        {
+            for (int i = 0; i <= degree; i++)
+            {
+                int value = (max - min) * i / degree + min;
+                int num = (int)ComputePaintLocationY(max, min, height - up - down, value) + up + 1;
+                g.DrawLine(penLine, left - 1, num, left - 4, num);
+                if (i != 0)
+                {
+                    g.DrawLine(penDash, left, num, width - right, num);
+                }
+                g.DrawString(value.ToString(), font, brush, new Rectangle(-5, num - font.Height / 2, left, font.Height), sf);
+            }
+        }
+        
+        /// <summary>
+        /// Adds the array data.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="array">The array.</param>
+        /// <param name="data">The data.</param>
+        /// <param name="max">The maximum.</param>
+        public static void AddArrayData<T>(ref T[] array, T[] data, int max)
+        {
+            if (data == null || data.Length == 0)
+            {
+                return;
+            }
+            if (array.Length == max)
+            {
+                Array.Copy(array, data.Length, array, 0, array.Length - data.Length);
+                Array.Copy(data, 0, array, array.Length - data.Length, data.Length);
+            }
+            else if (array.Length + data.Length > max)
+            {
+                T[] array2 = new T[max];
+                for (int i = 0; i < max - data.Length; i++)
+                {
+                    array2[i] = array[i + (array.Length - max + data.Length)];
+                }
+                for (int j = 0; j < data.Length; j++)
+                {
+                    array2[array2.Length - data.Length + j] = data[j];
+                }
+                array = array2;
+            }
+            else
+            {
+                T[] array3 = new T[array.Length + data.Length];
+                for (int k = 0; k < array.Length; k++)
+                {
+                    array3[k] = array[k];
+                }
+                for (int l = 0; l < data.Length; l++)
+                {
+                    array3[array3.Length - data.Length + l] = data[l];
+                }
+                array = array3;
+            }
+        }
+
+        /// <summary>
+        /// Converts the size.
+        /// </summary>
+        /// <param name="size">The size.</param>
+        /// <param name="angle">The angle.</param>
+        /// <returns>SizeF.</returns>
+        public static SizeF ConvertSize(SizeF size, float angle)
+        {
+            System.Drawing.Drawing2D.Matrix matrix = new System.Drawing.Drawing2D.Matrix();
+            matrix.Rotate(angle);
+            PointF[] array = new PointF[4];
+            array[0].X = (0f - size.Width) / 2f;
+            array[0].Y = (0f - size.Height) / 2f;
+            array[1].X = (0f - size.Width) / 2f;
+            array[1].Y = size.Height / 2f;
+            array[2].X = size.Width / 2f;
+            array[2].Y = size.Height / 2f;
+            array[3].X = size.Width / 2f;
+            array[3].Y = (0f - size.Height) / 2f;
+            matrix.TransformPoints(array);
+            float num = float.MaxValue;
+            float num2 = float.MinValue;
+            float num3 = float.MaxValue;
+            float num4 = float.MinValue;
+            PointF[] array2 = array;
+            for (int i = 0; i < array2.Length; i++)
+            {
+                PointF pointF = array2[i];
+                if (pointF.X < num)
+                {
+                    num = pointF.X;
+                }
+                if (pointF.X > num2)
+                {
+                    num2 = pointF.X;
+                }
+                if (pointF.Y < num3)
+                {
+                    num3 = pointF.Y;
+                }
+                if (pointF.Y > num4)
+                {
+                    num4 = pointF.Y;
+                }
+            }
+            return new SizeF(num2 - num, num4 - num3);
+        }
+
+
+
+        /// <summary>
+        /// Gets the pow.
+        /// </summary>
+        /// <param name="digit">The digit.</param>
+        /// <returns>System.Int32.</returns>
+        private static int GetPow(int digit)
+        {
+            int num = 1;
+            for (int i = 0; i < digit; i++)
+            {
+                num *= 10;
+            }
+            return num;
+        }
+
+        /// <summary>
+        /// Calculates the maximum section from.
+        /// </summary>
+        /// <param name="values">The values.</param>
+        /// <returns>System.Int32.</returns>
+        public static double CalculateMaxSectionFrom(double[] values)
+        {
+            double num = values.Max();
+            return CalculateMaxSection(num);
+        }
+
+        public static double CalculateMaxSectionFrom(double[][] values)
+        {
+            double num = values.Max(p => p.Max());
+            return CalculateMaxSection(num);
+        }
+
+        private static double CalculateMaxSection(double num)
+        {
+            if (num <= 5)
+            {
+                return 5;
+            }
+            if (num <= 10)
+            {
+                return 10;
+            }
+            int digit = num.ToString().Length - 2;
+            int num2 = int.Parse(num.ToString().Substring(0, 2));
+            if (num2 < 12)
+            {
+                return 12 * GetPow(digit);
+            }
+            if (num2 < 14)
+            {
+                return 14 * GetPow(digit);
+            }
+            if (num2 < 16)
+            {
+                return 16 * GetPow(digit);
+            }
+            if (num2 < 18)
+            {
+                return 18 * GetPow(digit);
+            }
+            if (num2 < 20)
+            {
+                return 20 * GetPow(digit);
+            }
+            if (num2 < 22)
+            {
+                return 22 * GetPow(digit);
+            }
+            if (num2 < 24)
+            {
+                return 24 * GetPow(digit);
+            }
+            if (num2 < 26)
+            {
+                return 26 * GetPow(digit);
+            }
+            if (num2 < 28)
+            {
+                return 28 * GetPow(digit);
+            }
+            if (num2 < 30)
+            {
+                return 30 * GetPow(digit);
+            }
+            if (num2 < 40)
+            {
+                return 40 * GetPow(digit);
+            }
+            if (num2 < 50)
+            {
+                return 50 * GetPow(digit);
+            }
+            if (num2 < 60)
+            {
+                return 60 * GetPow(digit);
+            }
+            if (num2 < 80)
+            {
+                return 80 * GetPow(digit);
+            }
+            return 100 * GetPow(digit);
+        }
+
+        /// <summary>
+        /// Gets the color light.
+        /// </summary>
+        /// <param name="color">The color.</param>
+        /// <returns>System.Drawing.Color.</returns>
+        public static System.Drawing.Color GetColorLight(System.Drawing.Color color)
+        {
+            return System.Drawing.Color.FromArgb(color.R + (255 - color.R) * 40 / 100, color.G + (255 - color.G) * 40 / 100, color.B + (255 - color.B) * 40 / 100);
+        }
+
+        /// <summary>
+        /// Gets the color light five.
+        /// </summary>
+        /// <param name="color">The color.</param>
+        /// <returns>System.Drawing.Color.</returns>
+        public static System.Drawing.Color GetColorLightFive(System.Drawing.Color color)
+        {
+            return System.Drawing.Color.FromArgb(color.R + (255 - color.R) * 50 / 100, color.G + (255 - color.G) * 50 / 100, color.B + (255 - color.B) * 50 / 100);
+        }
+
+        /// <summary>
+        /// Gets the points from.
+        /// </summary>
+        /// <param name="points">The points.</param>
+        /// <param name="soureWidth">Width of the soure.</param>
+        /// <param name="sourceHeight">Height of the source.</param>
+        /// <param name="width">The width.</param>
+        /// <param name="height">The height.</param>
+        /// <param name="dx">The dx.</param>
+        /// <param name="dy">The dy.</param>
+        /// <returns>PointF[].</returns>
+        public static PointF[] GetPointsFrom(string points, float soureWidth, float sourceHeight, float width, float height, float dx = 0f, float dy = 0f)
+        {
+            string[] array = points.Split(new char[1]
+            {
+                ' '
+            }, StringSplitOptions.RemoveEmptyEntries);
+            PointF[] array2 = new PointF[array.Length];
+            for (int i = 0; i < array.Length; i++)
+            {
+                int num = array[i].IndexOf(',');
+                float num2 = Convert.ToSingle(array[i].Substring(0, num));
+                float num3 = Convert.ToSingle(array[i].Substring(num + 1));
+                array2[i] = new PointF(width * (num2 + dx) / soureWidth, height * (num3 + dy) / sourceHeight);
+            }
+            return array2;
+        }
+
+        public static bool IsDesignMode()
+        {
+            bool returnFlag = false;
+
+            if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
+            {
+                returnFlag = true;
+            }
+            else if (Process.GetCurrentProcess().ProcessName == "devenv")
+            {
+                returnFlag = true;
+            }
+
+            return returnFlag;
+        }
+
+        #region 滚动条    English:scroll bar
+        static uint SB_HORZ = 0x0;
+        static uint SB_VERT = 0x1;
+        static uint SB_CTL = 0x2;
+        static uint SB_BOTH = 0x3;
+        [DllImport("user32.dll", SetLastError = true, EntryPoint = "GetScrollInfo")]
+        private static extern int GetScrollInfo(IntPtr hWnd, uint fnBar, ref SCROLLINFO psbi);
+        [DllImport("user32.dll")]//[return: MarshalAs(UnmanagedType.Bool)]
+        private static extern int SetScrollInfo(IntPtr handle, uint fnBar, ref SCROLLINFO si, bool fRedraw);
+
+        [DllImport("user32.dll", EntryPoint = "PostMessage")]
+        private static extern bool PostMessage(IntPtr handle, int msg, uint wParam, uint lParam);
+        [DllImport("User32.dll", EntryPoint = "SendMessage")]
+        private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
+        /// <summary>
+        /// ShowScrollBar
+        /// </summary>
+        /// <param name="hWnd">hWnd</param>
+        /// <param name="wBar">0:horizontal,1:vertical,3:both</param>
+        /// <param name="bShow">bShow</param>
+        /// <returns></returns>
+        [DllImport("user32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        public static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);
+        /// <summary>
+        ///获取水平滚动条信息
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <returns>Scrollbarinfo.</returns>
+        public static SCROLLINFO GetHScrollBarInfo(IntPtr hWnd)
+        {
+            SCROLLINFO info = new SCROLLINFO();
+            info.cbSize = (int)Marshal.SizeOf(info);
+            info.fMask = (int)ScrollInfoMask.SIF_DISABLENOSCROLL | (int)ScrollInfoMask.SIF_ALL;
+            int intRef = GetScrollInfo(hWnd, SB_HORZ, ref info);
+            return info;
+        }
+        /// <summary>
+        /// 获取垂直滚动条信息
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <returns>Scrollbarinfo.</returns>
+        public static SCROLLINFO GetVScrollBarInfo(IntPtr hWnd)
+        {
+            SCROLLINFO info = new SCROLLINFO();
+            info.cbSize = (int)Marshal.SizeOf(info);
+            info.fMask = (int)ScrollInfoMask.SIF_DISABLENOSCROLL | (int)ScrollInfoMask.SIF_ALL;
+            int intRef = GetScrollInfo(hWnd, SB_VERT, ref info);
+            return info;
+        }
+        public struct SCROLLINFO
+        {
+            public int cbSize;
+            public int fMask;
+            public int nMin;
+            public int nMax;
+            public int nPage;
+            public int nPos;
+            public int nTrackPos;
+            public int ScrollMax { get { return nMax + 1 - nPage; } }
+        }
+        public enum ScrollInfoMask : uint
+        {
+            SIF_RANGE = 0x1,
+            SIF_PAGE = 0x2,
+            SIF_POS = 0x4,
+            SIF_DISABLENOSCROLL = 0x8,
+            SIF_TRACKPOS = 0x10,
+            SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS),
+            SB_THUMBTRACK = 5,
+            WM_HSCROLL = 0x0114,
+            WM_VSCROLL = 0x0115,
+            SB_LINEUP = 0,
+            SB_LINEDOWN = 1,
+            SB_LINELEFT = 0,
+            SB_LINERIGHT = 1,
+        }
+
+        public static void SetVScrollValue(IntPtr handle, int value)
+        {
+            var info = GetVScrollBarInfo(handle);
+            info.nPos = value;
+            SetScrollInfo(handle, SB_VERT, ref info, true);
+            PostMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, MakeLong((short)ScrollInfoMask.SB_THUMBTRACK, highPart: (short)info.nPos), 0);
+        }
+        public static void SetHScrollValue(IntPtr handle, int value)
+        {
+            var info = GetHScrollBarInfo(handle);
+            info.nPos = value;
+            SetScrollInfo(handle, SB_HORZ, ref info, true);
+            PostMessage(handle, (int)ScrollInfoMask.WM_HSCROLL, MakeLong((short)ScrollInfoMask.SB_THUMBTRACK, highPart: (short)info.nPos), 0);
+        }
+        private static uint MakeLong(short lowPart, short highPart)
+        {
+            return (ushort)lowPart | (uint)(highPart << 16);
+        }
+        /// <summary>
+        /// 控件向上滚动一个单位
+        /// </summary>
+        /// <param name="handle">控件句柄</param>
+        public static void ScrollUp(IntPtr handle)
+        {
+            SendMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, (int)ScrollInfoMask.SB_LINEUP, 0);
+        }
+
+        /// <summary>
+        /// 控件向下滚动一个单位
+        /// </summary>
+        /// <param name="handle">控件句柄</param>
+        public static void ScrollDown(IntPtr handle)
+        {
+            SendMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, (int)ScrollInfoMask.SB_LINEDOWN, 0);
+        }
+        /// <summary>
+        /// 控件向左滚动一个单位
+        /// </summary>
+        /// <param name="handle">控件句柄</param>
+        public static void ScrollLeft(IntPtr handle)
+        {
+            SendMessage(handle, (int)ScrollInfoMask.WM_HSCROLL, (int)ScrollInfoMask.SB_LINELEFT, 0);
+        }
+
+        /// <summary>
+        /// 控件向右滚动一个单位
+        /// </summary>
+        /// <param name="handle">控件句柄</param>
+        public static void ScrollRight(IntPtr handle)
+        {
+            SendMessage(handle, (int)ScrollInfoMask.WM_VSCROLL, (int)ScrollInfoMask.SB_LINERIGHT, 0);
+        }
+        #endregion
+
+
+        /// <summary>
+        /// 返回指定图片中的非透明区域;
+        /// </summary>
+        /// <param name="img">位图</param>
+        /// <returns></returns>
+        public static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap, Color? colorTransparent = null)
+        {
+            // Create GraphicsPath for our bitmap calculation 
+            //创建 GraphicsPath
+            GraphicsPath graphicsPath = new GraphicsPath();
+            // Use the top left pixel as our transparent color 
+            //使用左上角的一点的颜色作为我们透明色
+
+            Color _colorTransparent = bitmap.GetPixel(0, 0);
+            if (colorTransparent != null && colorTransparent != Color.Transparent && colorTransparent != Color.Empty)
+                _colorTransparent = colorTransparent.Value;
+            // This is to store the column value where an opaque pixel is first found. 
+            // This value will determine where we start scanning for trailing opaque pixels.
+            //第一个找到点的X
+            int colOpaquePixel = 0;
+            // Go through all rows (Y axis) 
+            // 偏历所有行(Y方向)
+            for (int row = 0; row < bitmap.Height; row++)
+            {
+                // Reset value 
+                //重设
+                colOpaquePixel = 0;
+                // Go through all columns (X axis) 
+                //偏历所有列(X方向)
+                for (int col = 0; col < bitmap.Width; col++)
+                {
+                    // If this is an opaque pixel, mark it and search for anymore trailing behind 
+                    //如果是不需要透明处理的点则标记,然后继续偏历
+                    if (bitmap.GetPixel(col, row) != _colorTransparent)
+                    {
+                        // Opaque pixel found, mark current position
+                        //记录当前
+                        colOpaquePixel = col;
+                        // Create another variable to set the current pixel position 
+                        //建立新变量来记录当前点
+                        int colNext = col;
+                        // Starting from current found opaque pixel, search for anymore opaque pixels 
+                        // trailing behind, until a transparent   pixel is found or minimum width is reached 
+                        ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度 
+                        for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
+                            if (bitmap.GetPixel(colNext, row) == _colorTransparent)
+                                break;
+                        // Form a rectangle for line of opaque   pixels found and add it to our graphics path 
+                        //将不透明点加到graphics path
+                        graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
+                        // No need to scan the line of opaque pixels just found 
+                        col = colNext;
+                    }
+                }
+            }
+            // Return calculated graphics path 
+            return graphicsPath;
+        }
+
+        /// <summary>
+        /// 颜色加深
+        /// </summary>
+        /// <param name="color"></param>
+        /// <param name="correctionFactor">-1.0f <= correctionFactor <= 1.0f</param>
+        /// <returns></returns>
+        public static Color ChangeColor(this Color color, float correctionFactor)
+        {
+            float red = (float)color.R;
+            float green = (float)color.G;
+            float blue = (float)color.B;
+
+            if (correctionFactor < 0)
+            {
+                correctionFactor = 1 + correctionFactor;
+                red *= correctionFactor;
+                green *= correctionFactor;
+                blue *= correctionFactor;
+            }
+            else
+            {
+                red = (255 - red) * correctionFactor + red;
+                green = (255 - green) * correctionFactor + green;
+                blue = (255 - blue) * correctionFactor + blue;
+            }
+
+            if (red < 0) red = 0;
+
+            if (red > 255) red = 255;
+
+            if (green < 0) green = 0;
+
+            if (green > 255) green = 255;
+
+            if (blue < 0) blue = 0;
+
+            if (blue > 255) blue = 255;
+
+
+
+            return Color.FromArgb(color.A, (int)red, (int)green, (int)blue);
+        }
+        
+        
+        /// <summary>
+        /// 相对于屏幕显示的位置
+        /// </summary>
+        /// <param name="screen">窗体需要显示的屏幕</param>
+        /// <param name="left">left</param>
+        /// <param name="top">top</param>
+        /// <returns></returns>
+        public static Point GetScreenLocation(Screen screen,int left,int top)
+        {
+            return new Point(screen.Bounds.Left + left, screen.Bounds.Top + top);
+        }
+    }
+}

+ 312 - 0
HOZProject/Helpers/NativeMethods.cs

@@ -0,0 +1,312 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace HOZProject
+{
+    /// <summary>
+    /// Class NativeMethods.
+    /// </summary>
+    internal class NativeMethods
+    {
+        /// <summary>
+        /// Enum ComboBoxButtonState
+        /// </summary>
+        public enum ComboBoxButtonState
+        {
+            /// <summary>
+            /// The state system none
+            /// </summary>
+            STATE_SYSTEM_NONE,
+            /// <summary>
+            /// The state system invisible
+            /// </summary>
+            STATE_SYSTEM_INVISIBLE = 32768,
+            /// <summary>
+            /// The state system pressed
+            /// </summary>
+            STATE_SYSTEM_PRESSED = 8
+        }
+
+        /// <summary>
+        /// Struct RECT
+        /// </summary>
+        public struct RECT
+        {
+            /// <summary>
+            /// The left
+            /// </summary>
+            public int Left;
+
+            /// <summary>
+            /// The top
+            /// </summary>
+            public int Top;
+
+            /// <summary>
+            /// The right
+            /// </summary>
+            public int Right;
+
+            /// <summary>
+            /// The bottom
+            /// </summary>
+            public int Bottom;
+
+            /// <summary>
+            /// Gets the rect.
+            /// </summary>
+            /// <value>The rect.</value>
+            public Rectangle Rect
+            {
+                get
+                {
+                    return new Rectangle(this.Left, this.Top, this.Right - this.Left, this.Bottom - this.Top);
+                }
+            }
+
+            /// <summary>
+            /// Gets the size.
+            /// </summary>
+            /// <value>The size.</value>
+            public Size Size
+            {
+                get
+                {
+                    return new Size(this.Right - this.Left, this.Bottom - this.Top);
+                }
+            }
+
+            /// <summary>
+            /// Initializes a new instance of the <see cref="RECT" /> struct.
+            /// </summary>
+            /// <param name="left">The left.</param>
+            /// <param name="top">The top.</param>
+            /// <param name="right">The right.</param>
+            /// <param name="bottom">The bottom.</param>
+            public RECT(int left, int top, int right, int bottom)
+            {
+                this.Left = left;
+                this.Top = top;
+                this.Right = right;
+                this.Bottom = bottom;
+            }
+
+            /// <summary>
+            /// Initializes a new instance of the <see cref="RECT" /> struct.
+            /// </summary>
+            /// <param name="rect">The rect.</param>
+            public RECT(Rectangle rect)
+            {
+                this.Left = rect.Left;
+                this.Top = rect.Top;
+                this.Right = rect.Right;
+                this.Bottom = rect.Bottom;
+            }
+
+            /// <summary>
+            /// Froms the xywh.
+            /// </summary>
+            /// <param name="x">The x.</param>
+            /// <param name="y">The y.</param>
+            /// <param name="width">The width.</param>
+            /// <param name="height">The height.</param>
+            /// <returns>NativeMethods.RECT.</returns>
+            public static NativeMethods.RECT FromXYWH(int x, int y, int width, int height)
+            {
+                return new NativeMethods.RECT(x, y, x + width, y + height);
+            }
+
+            /// <summary>
+            /// Froms the rectangle.
+            /// </summary>
+            /// <param name="rect">The rect.</param>
+            /// <returns>NativeMethods.RECT.</returns>
+            public static NativeMethods.RECT FromRectangle(Rectangle rect)
+            {
+                return new NativeMethods.RECT(rect.Left, rect.Top, rect.Right, rect.Bottom);
+            }
+        }
+
+        /// <summary>
+        /// Struct PAINTSTRUCT
+        /// </summary>
+        public struct PAINTSTRUCT
+        {
+            /// <summary>
+            /// The HDC
+            /// </summary>
+            public IntPtr hdc;
+
+            /// <summary>
+            /// The f erase
+            /// </summary>
+            public int fErase;
+
+            /// <summary>
+            /// The rc paint
+            /// </summary>
+            public NativeMethods.RECT rcPaint;
+
+            /// <summary>
+            /// The f restore
+            /// </summary>
+            public int fRestore;
+
+            /// <summary>
+            /// The f inc update
+            /// </summary>
+            public int fIncUpdate;
+
+            /// <summary>
+            /// The reserved1
+            /// </summary>
+            public int Reserved1;
+
+            /// <summary>
+            /// The reserved2
+            /// </summary>
+            public int Reserved2;
+
+            /// <summary>
+            /// The reserved3
+            /// </summary>
+            public int Reserved3;
+
+            /// <summary>
+            /// The reserved4
+            /// </summary>
+            public int Reserved4;
+
+            /// <summary>
+            /// The reserved5
+            /// </summary>
+            public int Reserved5;
+
+            /// <summary>
+            /// The reserved6
+            /// </summary>
+            public int Reserved6;
+
+            /// <summary>
+            /// The reserved7
+            /// </summary>
+            public int Reserved7;
+
+            /// <summary>
+            /// The reserved8
+            /// </summary>
+            public int Reserved8;
+        }
+
+        /// <summary>
+        /// Struct ComboBoxInfo
+        /// </summary>
+        public struct ComboBoxInfo
+        {
+            /// <summary>
+            /// The cb size
+            /// </summary>
+            public int cbSize;
+
+            /// <summary>
+            /// The rc item
+            /// </summary>
+            public NativeMethods.RECT rcItem;
+
+            /// <summary>
+            /// The rc button
+            /// </summary>
+            public NativeMethods.RECT rcButton;
+
+            /// <summary>
+            /// The state button
+            /// </summary>
+            public NativeMethods.ComboBoxButtonState stateButton;
+
+            /// <summary>
+            /// The HWND combo
+            /// </summary>
+            public IntPtr hwndCombo;
+
+            /// <summary>
+            /// The HWND edit
+            /// </summary>
+            public IntPtr hwndEdit;
+
+            /// <summary>
+            /// The HWND list
+            /// </summary>
+            public IntPtr hwndList;
+        }
+
+        /// <summary>
+        /// The wm paint
+        /// </summary>
+        public const int WM_PAINT = 15;
+
+        /// <summary>
+        /// The wm setredraw
+        /// </summary>
+        public const int WM_SETREDRAW = 11;
+
+        /// <summary>
+        /// The false
+        /// </summary>
+        public static readonly IntPtr FALSE = IntPtr.Zero;
+
+        /// <summary>
+        /// The true
+        /// </summary>
+        public static readonly IntPtr TRUE = new IntPtr(1);
+
+        /// <summary>
+        /// Gets the ComboBox information.
+        /// </summary>
+        /// <param name="hwndCombo">The HWND combo.</param>
+        /// <param name="info">The information.</param>
+        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
+        [DllImport("user32.dll")]
+        public static extern bool GetComboBoxInfo(IntPtr hwndCombo, ref NativeMethods.ComboBoxInfo info);
+
+        /// <summary>
+        /// Gets the window rect.
+        /// </summary>
+        /// <param name="hwnd">The HWND.</param>
+        /// <param name="lpRect">The lp rect.</param>
+        /// <returns>System.Int32.</returns>
+        [DllImport("user32.dll")]
+        public static extern int GetWindowRect(IntPtr hwnd, ref NativeMethods.RECT lpRect);
+
+        /// <summary>
+        /// Begins the paint.
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <param name="ps">The ps.</param>
+        /// <returns>IntPtr.</returns>
+        [DllImport("user32.dll")]
+        public static extern IntPtr BeginPaint(IntPtr hWnd, ref NativeMethods.PAINTSTRUCT ps);
+
+        /// <summary>
+        /// Ends the paint.
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <param name="ps">The ps.</param>
+        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
+        [DllImport("user32.dll")]
+        public static extern bool EndPaint(IntPtr hWnd, ref NativeMethods.PAINTSTRUCT ps);
+
+        /// <summary>
+        /// Sends the message.
+        /// </summary>
+        /// <param name="hWnd">The h WND.</param>
+        /// <param name="msg">The MSG.</param>
+        /// <param name="wParam">The w parameter.</param>
+        /// <param name="lParam">The l parameter.</param>
+        [DllImport("user32.dll")]
+        public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
+    }
+}

BIN
HOZProject/Resources/Log.png


BIN
HOZProject/Resources/init.png


BIN
HOZProject/Resources/open.png


BIN
HOZProject/Resources/save.png


+ 269 - 0
HOZProject/UserControls/UCTimeLine.cs

@@ -0,0 +1,269 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    /// <summary>
+    /// Class UCTimeLine.
+    /// Implements the <see cref="System.Windows.Forms.UserControl" />
+    /// </summary>
+    /// <seealso cref="System.Windows.Forms.UserControl" />
+    public partial class UCTimeLine : UserControl
+    {
+        /// <summary>
+        /// The line color
+        /// </summary>
+        private Color lineColor = TextColors.Light;
+
+        /// <summary>
+        /// Gets or sets the color of the line.
+        /// </summary>
+        /// <value>The color of the line.</value>
+        [Description("连接线颜色"), Category("自定义")]
+        public Color LineColor
+        {
+            get { return lineColor; }
+            set
+            {
+                lineColor = value;
+                Invalidate();
+            }
+        }
+        /// <summary>
+        /// The title font
+        /// </summary>
+        private Font titleFont = new Font("微软雅黑", 14f);
+
+        /// <summary>
+        /// Gets or sets the title font.
+        /// </summary>
+        /// <value>The title font.</value>
+        [Description("标题字体"), Category("自定义")]
+        public Font TitleFont
+        {
+            get { return titleFont; }
+            set
+            {
+                titleFont = value;
+                ReloadItems();
+            }
+        }
+
+        /// <summary>
+        /// The title forcolor
+        /// </summary>
+        private Color titleForcolor = TextColors.MoreDark;
+
+        /// <summary>
+        /// Gets or sets the title forcolor.
+        /// </summary>
+        /// <value>The title forcolor.</value>
+        [Description("标题颜色"), Category("自定义")]
+        public Color TitleForcolor
+        {
+            get { return titleForcolor; }
+            set
+            {
+                titleForcolor = value;
+                ReloadItems();
+            }
+        }
+
+        /// <summary>
+        /// The details font
+        /// </summary>
+        private Font detailsFont = new Font("微软雅黑", 10);
+
+        /// <summary>
+        /// Gets or sets the details font.
+        /// </summary>
+        /// <value>The details font.</value>
+        [Description("详情字体"), Category("自定义")]
+        public Font DetailsFont
+        {
+            get { return detailsFont; }
+            set
+            {
+                detailsFont = value;
+                ReloadItems();
+            }
+        }
+
+        /// <summary>
+        /// The details forcolor
+        /// </summary>
+        private Color detailsForcolor = TextColors.Light;
+
+        /// <summary>
+        /// Gets or sets the details forcolor.
+        /// </summary>
+        /// <value>The details forcolor.</value>
+        [Description("详情颜色"), Category("自定义")]
+        public Color DetailsForcolor
+        {
+            get { return detailsForcolor; }
+            set
+            {
+                detailsForcolor = value;
+                ReloadItems();
+            }
+        }
+
+        /// <summary>
+        /// The items
+        /// </summary>
+        TimeLineItem[] items;
+
+        /// <summary>
+        /// Gets or sets the items.
+        /// </summary>
+        /// <value>The items.</value>
+        [Description("项列表"), Category("自定义")]
+        public TimeLineItem[] Items
+        {
+            get { return items; }
+            set
+            {
+                items = value;
+                ReloadItems();
+            }
+        }
+        /// <summary>
+        /// Initializes a new instance of the <see cref="UCTimeLine"/> class.
+        /// </summary>
+        public UCTimeLine()
+        {
+            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            this.SetStyle(ControlStyles.DoubleBuffer, true);
+            this.SetStyle(ControlStyles.ResizeRedraw, true);
+            this.SetStyle(ControlStyles.Selectable, true);
+            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
+            this.SetStyle(ControlStyles.UserPaint, true);
+            InitializeComponent();
+            items = new TimeLineItem[4];
+            for (int i = 0; i < 4; i++)
+            {
+                items[i] = new TimeLineItem()
+                {
+                    Title = DateTime.Now.AddMonths(-1 * (3 - i)).ToString("yyyy年MM月"),
+                    Details = DateTime.Now.AddMonths(-1 * (3 - i)).ToString("yyyy年MM月")
+                };
+            }
+            ReloadItems();
+
+        }
+
+        /// <summary>
+        /// Reloads the items.
+        /// </summary>
+        private void ReloadItems()
+        {
+            try
+            {
+                ControlHelper.FreezeControl(this, true);
+                this.Controls.Clear();
+                if (items != null)
+                {
+
+                    foreach (var item in items)
+                    {
+                        FlowLayoutPanel panelTitle = new FlowLayoutPanel();
+                        panelTitle.Dock = DockStyle.Top;
+                        panelTitle.AutoScroll = false;
+                        panelTitle.Padding = new System.Windows.Forms.Padding(5);
+                        panelTitle.Name = "title_" + Guid.NewGuid().ToString();
+                        //panelTitle.BackColor = Color.Yellow;
+                        Label lblTitle = new Label();
+                        lblTitle.Dock = DockStyle.Top;
+                        lblTitle.AutoSize = true;
+                        lblTitle.Font = titleFont;
+                        lblTitle.ForeColor = titleForcolor;
+                        lblTitle.Text = item.Title;
+                        lblTitle.SizeChanged += item_SizeChanged;
+                        panelTitle.Controls.Add(lblTitle);
+                        this.Controls.Add(panelTitle);
+                        panelTitle.BringToFront();
+
+
+                        FlowLayoutPanel panelDetails = new FlowLayoutPanel();
+                        panelDetails.Dock = DockStyle.Top;
+                        panelDetails.AutoScroll = false;
+                        panelDetails.Padding = new System.Windows.Forms.Padding(5);
+                        panelDetails.Name = "details_" + Guid.NewGuid().ToString();
+                        panelDetails.BackColor = Color.Black;
+                        Label lblDetails = new Label();
+                        lblDetails.AutoSize = true;
+                        lblDetails.Dock = DockStyle.Top;
+                        lblDetails.Font = detailsFont;
+                        lblDetails.ForeColor = detailsForcolor;
+                        lblDetails.Text = item.Details;
+                        lblDetails.SizeChanged += item_SizeChanged;
+                        panelDetails.Controls.Add(lblDetails);
+                        this.Controls.Add(panelDetails);
+                        panelDetails.BringToFront();
+                    }
+                }
+            }
+            finally
+            {
+                ControlHelper.FreezeControl(this, false);
+            }
+        }
+
+        /// <summary>
+        /// Handles the SizeChanged event of the item control.
+        /// </summary>
+        /// <param name="sender">The source of the event.</param>
+        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
+        void item_SizeChanged(object sender, EventArgs e)
+        {
+            Label lbl = (Label)sender;
+            lbl.Parent.Height = lbl.Height + 10;
+        }
+
+        /// <summary>
+        /// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
+        /// </summary>
+        /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" />。</param>
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            base.OnPaint(e);
+            var g = e.Graphics;
+            g.SetGDIHigh();
+            var lst = this.Controls.ToArray().Where(p => p.Name.StartsWith("title_")).ToList();
+            for (int i = 0; i < lst.Count; i++)
+            {
+                //画圆
+                g.DrawEllipse(new Pen(new SolidBrush(lineColor)), new Rectangle(7, lst[i].Location.Y + 10, 16, 16));
+                //划线
+                if (i != lst.Count - 1)
+                {
+                    g.DrawLine(new Pen(new SolidBrush(lineColor)), new Point(7 + 8, lst[i].Location.Y + 10 - 2), new Point(7 + 8, lst[i + 1].Location.Y + 10 + 16 + 2));
+                }
+            }
+        }
+    }
+
+    /// <summary>
+    /// Class TimeLineItem.
+    /// </summary>
+    public class TimeLineItem
+    {
+        /// <summary>
+        /// Gets or sets the title.
+        /// </summary>
+        /// <value>The title.</value>
+        public string Title { get; set; }
+        /// <summary>
+        /// Gets or sets the details.
+        /// </summary>
+        /// <value>The details.</value>
+        public string Details { get; set; }
+    }
+}

+ 60 - 0
HOZProject/UserControls/UCTimeLine.designer.cs

@@ -0,0 +1,60 @@
+namespace HOZProject
+{
+    partial class UCTimeLine
+    {
+        /// <summary> 
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 组件设计器生成的代码
+
+        /// <summary> 
+        /// 设计器支持所需的方法 - 不要
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.button1 = new System.Windows.Forms.Button();
+            this.SuspendLayout();
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(580, 12);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 0;
+            this.button1.Text = "button1";
+            this.button1.UseVisualStyleBackColor = true;
+            // 
+            // UCTimeLine
+            // 
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            this.AutoScroll = true;
+            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.Controls.Add(this.button1);
+            this.Name = "UCTimeLine";
+            this.Padding = new System.Windows.Forms.Padding(30, 0, 0, 0);
+            this.Size = new System.Drawing.Size(671, 375);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button button1;
+    }
+}

+ 120 - 0
HOZProject/UserControls/UCTimeLine.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 93 - 0
HOZProject/UserControls/UControl_CutHole.Designer.cs

@@ -0,0 +1,93 @@
+namespace HOZProject
+{
+    partial class UControl_CutHole
+    {
+        /// <summary> 
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 组件设计器生成的代码
+
+        /// <summary> 
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.cMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.tsShowParaInfo = new System.Windows.Forms.ToolStripMenuItem();
+            this.tsShowProcess = new System.Windows.Forms.ToolStripMenuItem();
+            this.btnCutHole = new System.Windows.Forms.Button();
+            this.cMenu.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // cMenu
+            // 
+            this.cMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.tsShowParaInfo,
+            this.tsShowProcess});
+            this.cMenu.Name = "cMenu";
+            this.cMenu.Size = new System.Drawing.Size(181, 70);
+            // 
+            // tsShowParaInfo
+            // 
+            this.tsShowParaInfo.Name = "tsShowParaInfo";
+            this.tsShowParaInfo.Size = new System.Drawing.Size(180, 22);
+            this.tsShowParaInfo.Text = "查看切孔属性";
+            this.tsShowParaInfo.Click += new System.EventHandler(this.tsShowParaInfo_Click);
+            // 
+            // tsShowProcess
+            // 
+            this.tsShowProcess.Name = "tsShowProcess";
+            this.tsShowProcess.Size = new System.Drawing.Size(180, 22);
+            this.tsShowProcess.Text = "查看操作流程";
+            this.tsShowProcess.Click += new System.EventHandler(this.tsShowProcess_Click);
+            // 
+            // btnCutHole
+            // 
+            this.btnCutHole.BackColor = System.Drawing.Color.White;
+            this.btnCutHole.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.btnCutHole.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.btnCutHole.Location = new System.Drawing.Point(0, 0);
+            this.btnCutHole.Name = "btnCutHole";
+            this.btnCutHole.Size = new System.Drawing.Size(80, 80);
+            this.btnCutHole.TabIndex = 1;
+            this.btnCutHole.UseVisualStyleBackColor = false;
+            // 
+            // UControl_CutHole
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.SystemColors.ControlDark;
+            this.ContextMenuStrip = this.cMenu;
+            this.Controls.Add(this.btnCutHole);
+            this.Name = "UControl_CutHole";
+            this.Size = new System.Drawing.Size(80, 80);
+            this.Load += new System.EventHandler(this.UContrl_CutHole_Load);
+            this.cMenu.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+        private System.Windows.Forms.ContextMenuStrip cMenu;
+        private System.Windows.Forms.ToolStripMenuItem tsShowParaInfo;
+        private System.Windows.Forms.ToolStripMenuItem tsShowProcess;
+        private System.Windows.Forms.Button btnCutHole;
+    }
+}

+ 84 - 0
HOZProject/UserControls/UControl_CutHole.cs

@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    public partial class UControl_CutHole : UserControl
+    {
+        private string cutHoleName;
+        public string CutHoleName { get => cutHoleName; set => cutHoleName = value; }
+        private int cutHoleState;
+        public int CutHoleState { get => cutHoleState; set => cutHoleState = value; }
+
+        private FormHOZMain formHOZMain;
+        public FormHOZMain FormHOZMainObject { get => formHOZMain; set => formHOZMain = value; }
+
+        public UControl_CutHole(FormHOZMain formHOZ)
+        {
+            InitializeComponent();
+            FormHOZMainObject = formHOZ;
+        }
+
+        private void UContrl_CutHole_Load(object sender, EventArgs e)
+        {
+            btnCutHole.Text = CutHoleName;
+        }
+
+        private void tsShowProcess_Click(object sender, EventArgs e)
+        {
+            ClearProcessControls();
+            //显示检测过程信息
+            UControl_Process uControl_Process = new UControl_Process(FormHOZMainObject);
+            //UCTimeLine uControl_Process = new UCTimeLine();
+            FormHOZMainObject.plProcess.Width = uControl_Process.Width;
+            FormHOZMainObject.plProcess.Height = uControl_Process.Height;
+            if ((this.Location.Y + uControl_Process.Height) > FormHOZMainObject.Height)
+            {
+                uControl_Process.Location = new Point(this.Left, this.Bottom- this.Top);
+            }
+            else
+            {
+                uControl_Process.Location = new Point(this.Location.X, this.Location.Y);
+            }
+            uControl_Process.Dock = DockStyle.Fill;
+            FormHOZMainObject.plProcess.Location = uControl_Process.Location;
+            FormHOZMainObject.plProcess.Controls.Add(uControl_Process);
+            FormHOZMainObject.plProcess.Visible = true;
+        }
+
+        private void tsShowParaInfo_Click(object sender, EventArgs e)
+        {
+            ClearProcessControls();
+            //显示切入点参数信息
+            UControl_ParaInfo uControl_ParaInfo = new UControl_ParaInfo(FormHOZMainObject);
+            //UCTimeLine uControl_Process = new UCTimeLine();
+            FormHOZMainObject.plProcess.Width = uControl_ParaInfo.Width;
+            FormHOZMainObject.plProcess.Height = uControl_ParaInfo.Height;
+            if ((this.Location.Y + uControl_ParaInfo.Height) > FormHOZMainObject.Height)
+            {
+                uControl_ParaInfo.Location = new Point(this.Left, this.Bottom - this.Top);
+            }
+            else
+            {
+                uControl_ParaInfo.Location = new Point(this.Location.X, this.Location.Y);
+            }
+            uControl_ParaInfo.Dock = DockStyle.Fill;
+            FormHOZMainObject.plProcess.Location = uControl_ParaInfo.Location;
+            FormHOZMainObject.plProcess.Controls.Add(uControl_ParaInfo);
+            FormHOZMainObject.plProcess.Visible = true;
+        }
+
+        private void ClearProcessControls()
+        {
+            //清空处理层中的控件
+            FormHOZMainObject.plProcess.Controls.Clear();
+        }
+    }
+}

+ 123 - 0
HOZProject/UserControls/UControl_CutHole.resx

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="cMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>

+ 222 - 0
HOZProject/UserControls/UControl_Init.Designer.cs

@@ -0,0 +1,222 @@
+namespace HOZProject
+{
+    partial class UControl_Init
+    {
+        /// <summary> 
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 组件设计器生成的代码
+
+        /// <summary> 
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.btnClose = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.textBox1 = new System.Windows.Forms.TextBox();
+            this.textBox2 = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.pictureBox2 = new System.Windows.Forms.PictureBox();
+            this.pictureBox1 = new System.Windows.Forms.PictureBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.textBox3 = new System.Windows.Forms.TextBox();
+            this.checkBox1 = new System.Windows.Forms.CheckBox();
+            this.label5 = new System.Windows.Forms.Label();
+            this.panel1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // btnClose
+            // 
+            this.btnClose.Dock = System.Windows.Forms.DockStyle.Right;
+            this.btnClose.Location = new System.Drawing.Point(357, 0);
+            this.btnClose.Name = "btnClose";
+            this.btnClose.Size = new System.Drawing.Size(30, 30);
+            this.btnClose.TabIndex = 3;
+            this.btnClose.Text = "X";
+            this.btnClose.UseVisualStyleBackColor = true;
+            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("宋体", 10F);
+            this.label1.ForeColor = System.Drawing.Color.Black;
+            this.label1.Location = new System.Drawing.Point(13, 8);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(77, 14);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "初始化设置";
+            // 
+            // panel1
+            // 
+            this.panel1.BackColor = System.Drawing.Color.White;
+            this.panel1.Controls.Add(this.btnClose);
+            this.panel1.Controls.Add(this.label1);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel1.Location = new System.Drawing.Point(0, 0);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(387, 30);
+            this.panel1.TabIndex = 3;
+            // 
+            // textBox1
+            // 
+            this.textBox1.Font = new System.Drawing.Font("宋体", 20F);
+            this.textBox1.Location = new System.Drawing.Point(16, 51);
+            this.textBox1.Name = "textBox1";
+            this.textBox1.Size = new System.Drawing.Size(276, 38);
+            this.textBox1.TabIndex = 5;
+            // 
+            // textBox2
+            // 
+            this.textBox2.Font = new System.Drawing.Font("宋体", 20F);
+            this.textBox2.Location = new System.Drawing.Point(15, 146);
+            this.textBox2.Name = "textBox2";
+            this.textBox2.Size = new System.Drawing.Size(276, 38);
+            this.textBox2.TabIndex = 7;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("宋体", 20F);
+            this.label2.ForeColor = System.Drawing.Color.LightGray;
+            this.label2.Location = new System.Drawing.Point(26, 104);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(242, 27);
+            this.label2.TabIndex = 8;
+            this.label2.Text = "成功导入0个切入点";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Font = new System.Drawing.Font("宋体", 20F);
+            this.label3.ForeColor = System.Drawing.Color.LightGray;
+            this.label3.Location = new System.Drawing.Point(26, 199);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(204, 27);
+            this.label3.TabIndex = 9;
+            this.label3.Text = "当前模板:XXXXX";
+            // 
+            // pictureBox2
+            // 
+            this.pictureBox2.BackColor = System.Drawing.Color.LightGray;
+            this.pictureBox2.Location = new System.Drawing.Point(297, 146);
+            this.pictureBox2.Name = "pictureBox2";
+            this.pictureBox2.Size = new System.Drawing.Size(77, 39);
+            this.pictureBox2.TabIndex = 6;
+            this.pictureBox2.TabStop = false;
+            // 
+            // pictureBox1
+            // 
+            this.pictureBox1.BackColor = System.Drawing.Color.LightGray;
+            this.pictureBox1.Location = new System.Drawing.Point(298, 51);
+            this.pictureBox1.Name = "pictureBox1";
+            this.pictureBox1.Size = new System.Drawing.Size(77, 39);
+            this.pictureBox1.TabIndex = 4;
+            this.pictureBox1.TabStop = false;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Font = new System.Drawing.Font("宋体", 20F);
+            this.label4.ForeColor = System.Drawing.Color.LightGray;
+            this.label4.Location = new System.Drawing.Point(11, 247);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(93, 27);
+            this.label4.TabIndex = 10;
+            this.label4.Text = "样品名";
+            // 
+            // textBox3
+            // 
+            this.textBox3.Font = new System.Drawing.Font("宋体", 20F);
+            this.textBox3.Location = new System.Drawing.Point(99, 241);
+            this.textBox3.Name = "textBox3";
+            this.textBox3.Size = new System.Drawing.Size(276, 38);
+            this.textBox3.TabIndex = 11;
+            // 
+            // checkBox1
+            // 
+            this.checkBox1.AutoSize = true;
+            this.checkBox1.Font = new System.Drawing.Font("宋体", 9F);
+            this.checkBox1.Location = new System.Drawing.Point(16, 299);
+            this.checkBox1.Name = "checkBox1";
+            this.checkBox1.Size = new System.Drawing.Size(15, 14);
+            this.checkBox1.TabIndex = 12;
+            this.checkBox1.UseVisualStyleBackColor = true;
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Font = new System.Drawing.Font("宋体", 20F);
+            this.label5.ForeColor = System.Drawing.Color.LightGray;
+            this.label5.Location = new System.Drawing.Point(37, 293);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(148, 27);
+            this.label5.TabIndex = 13;
+            this.label5.Text = "是否使用PT";
+            // 
+            // UControl_Init
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.Color.Black;
+            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.checkBox1);
+            this.Controls.Add(this.textBox3);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.textBox2);
+            this.Controls.Add(this.pictureBox2);
+            this.Controls.Add(this.textBox1);
+            this.Controls.Add(this.pictureBox1);
+            this.Controls.Add(this.panel1);
+            this.Name = "UControl_Init";
+            this.Size = new System.Drawing.Size(387, 329);
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button btnClose;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.PictureBox pictureBox1;
+        private System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.TextBox textBox2;
+        private System.Windows.Forms.PictureBox pictureBox2;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.TextBox textBox3;
+        private System.Windows.Forms.CheckBox checkBox1;
+        private System.Windows.Forms.Label label5;
+    }
+}

+ 26 - 0
HOZProject/UserControls/UControl_Init.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    public partial class UControl_Init : UserControl
+    {
+        public UControl_Init()
+        {
+            InitializeComponent();
+        }
+
+        private void btnClose_Click(object sender, EventArgs e)
+        {
+            Form fParent = this.ParentForm;
+            fParent.Close();
+        }
+    }
+}

+ 120 - 0
HOZProject/UserControls/UControl_Init.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 159 - 0
HOZProject/UserControls/UControl_Log.Designer.cs

@@ -0,0 +1,159 @@
+namespace HOZProject
+{
+    partial class UControl_Log
+    {
+        /// <summary> 
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 组件设计器生成的代码
+
+        /// <summary> 
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.btnClose = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.dataGridView1 = new System.Windows.Forms.DataGridView();
+            this.ColCutHoleName = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColStep = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColTime = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.ColState = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.panel1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // btnClose
+            // 
+            this.btnClose.Dock = System.Windows.Forms.DockStyle.Right;
+            this.btnClose.Location = new System.Drawing.Point(690, 0);
+            this.btnClose.Name = "btnClose";
+            this.btnClose.Size = new System.Drawing.Size(28, 30);
+            this.btnClose.TabIndex = 3;
+            this.btnClose.Text = "X";
+            this.btnClose.UseVisualStyleBackColor = true;
+            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("宋体", 10F);
+            this.label1.ForeColor = System.Drawing.Color.Black;
+            this.label1.Location = new System.Drawing.Point(13, 8);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(63, 14);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "查看日志";
+            // 
+            // panel1
+            // 
+            this.panel1.BackColor = System.Drawing.Color.White;
+            this.panel1.Controls.Add(this.btnClose);
+            this.panel1.Controls.Add(this.label1);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel1.Location = new System.Drawing.Point(0, 0);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(718, 30);
+            this.panel1.TabIndex = 3;
+            // 
+            // dataGridView1
+            // 
+            this.dataGridView1.AllowUserToAddRows = false;
+            this.dataGridView1.AllowUserToDeleteRows = false;
+            this.dataGridView1.AllowUserToResizeColumns = false;
+            this.dataGridView1.AllowUserToResizeRows = false;
+            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.ColCutHoleName,
+            this.ColStep,
+            this.ColTime,
+            this.ColState});
+            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.dataGridView1.Location = new System.Drawing.Point(0, 30);
+            this.dataGridView1.MultiSelect = false;
+            this.dataGridView1.Name = "dataGridView1";
+            this.dataGridView1.ReadOnly = true;
+            this.dataGridView1.RowHeadersVisible = false;
+            this.dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing;
+            this.dataGridView1.RowTemplate.Height = 23;
+            this.dataGridView1.ShowCellErrors = false;
+            this.dataGridView1.ShowCellToolTips = false;
+            this.dataGridView1.ShowEditingIcon = false;
+            this.dataGridView1.ShowRowErrors = false;
+            this.dataGridView1.Size = new System.Drawing.Size(718, 368);
+            this.dataGridView1.TabIndex = 4;
+            // 
+            // ColCutHoleName
+            // 
+            this.ColCutHoleName.HeaderText = "切入点名称";
+            this.ColCutHoleName.Name = "ColCutHoleName";
+            this.ColCutHoleName.ReadOnly = true;
+            this.ColCutHoleName.Width = 180;
+            // 
+            // ColStep
+            // 
+            this.ColStep.HeaderText = "步骤名称";
+            this.ColStep.Name = "ColStep";
+            this.ColStep.ReadOnly = true;
+            this.ColStep.Width = 180;
+            // 
+            // ColTime
+            // 
+            this.ColTime.HeaderText = "完成时间";
+            this.ColTime.Name = "ColTime";
+            this.ColTime.ReadOnly = true;
+            this.ColTime.Width = 180;
+            // 
+            // ColState
+            // 
+            this.ColState.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+            this.ColState.HeaderText = "状态";
+            this.ColState.Name = "ColState";
+            this.ColState.ReadOnly = true;
+            // 
+            // UControl_Log
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.Color.Black;
+            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.Controls.Add(this.dataGridView1);
+            this.Controls.Add(this.panel1);
+            this.Name = "UControl_Log";
+            this.Size = new System.Drawing.Size(718, 398);
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button btnClose;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.DataGridView dataGridView1;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColCutHoleName;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColStep;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColTime;
+        private System.Windows.Forms.DataGridViewTextBoxColumn ColState;
+    }
+}

+ 26 - 0
HOZProject/UserControls/UControl_Log.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    public partial class UControl_Log : UserControl
+    {
+        public UControl_Log()
+        {
+            InitializeComponent();
+        }
+
+        private void btnClose_Click(object sender, EventArgs e)
+        {
+            Form fParent = this.ParentForm;
+            fParent.Close();
+        }
+    }
+}

+ 147 - 0
HOZProject/UserControls/UControl_Log.resx

@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="btnClose.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="label1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="panel1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="dataGridView1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColCutHoleName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColStep.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColTime.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="ColState.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>

+ 229 - 0
HOZProject/UserControls/UControl_ParaInfo.Designer.cs

@@ -0,0 +1,229 @@
+namespace HOZProject
+{
+    partial class UControl_ParaInfo
+    {
+        /// <summary> 
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 组件设计器生成的代码
+
+        /// <summary> 
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.lblLocation = new System.Windows.Forms.Label();
+            this.lblStartTime = new System.Windows.Forms.Label();
+            this.lblEndTime = new System.Windows.Forms.Label();
+            this.lblState = new System.Windows.Forms.Label();
+            this.checkBox1 = new System.Windows.Forms.CheckBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.btnClose = new System.Windows.Forms.Button();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.panel1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // lblLocation
+            // 
+            this.lblLocation.AutoSize = true;
+            this.lblLocation.Font = new System.Drawing.Font("宋体", 10F);
+            this.lblLocation.ForeColor = System.Drawing.Color.LightGray;
+            this.lblLocation.Location = new System.Drawing.Point(8, 44);
+            this.lblLocation.Name = "lblLocation";
+            this.lblLocation.Size = new System.Drawing.Size(63, 14);
+            this.lblLocation.TabIndex = 0;
+            this.lblLocation.Text = "检测位置";
+            // 
+            // lblStartTime
+            // 
+            this.lblStartTime.AutoSize = true;
+            this.lblStartTime.Font = new System.Drawing.Font("宋体", 10F);
+            this.lblStartTime.ForeColor = System.Drawing.Color.LightGray;
+            this.lblStartTime.Location = new System.Drawing.Point(8, 89);
+            this.lblStartTime.Name = "lblStartTime";
+            this.lblStartTime.Size = new System.Drawing.Size(63, 14);
+            this.lblStartTime.TabIndex = 0;
+            this.lblStartTime.Text = "开始时间";
+            // 
+            // lblEndTime
+            // 
+            this.lblEndTime.AutoSize = true;
+            this.lblEndTime.Font = new System.Drawing.Font("宋体", 10F);
+            this.lblEndTime.ForeColor = System.Drawing.Color.LightGray;
+            this.lblEndTime.Location = new System.Drawing.Point(8, 120);
+            this.lblEndTime.Name = "lblEndTime";
+            this.lblEndTime.Size = new System.Drawing.Size(63, 14);
+            this.lblEndTime.TabIndex = 0;
+            this.lblEndTime.Text = "结束时间";
+            // 
+            // lblState
+            // 
+            this.lblState.AutoSize = true;
+            this.lblState.Font = new System.Drawing.Font("宋体", 10F);
+            this.lblState.ForeColor = System.Drawing.Color.LightGray;
+            this.lblState.Location = new System.Drawing.Point(8, 151);
+            this.lblState.Name = "lblState";
+            this.lblState.Size = new System.Drawing.Size(63, 14);
+            this.lblState.TabIndex = 0;
+            this.lblState.Text = "检测结果";
+            // 
+            // checkBox1
+            // 
+            this.checkBox1.AutoSize = true;
+            this.checkBox1.Location = new System.Drawing.Point(9, 9);
+            this.checkBox1.Name = "checkBox1";
+            this.checkBox1.Size = new System.Drawing.Size(15, 14);
+            this.checkBox1.TabIndex = 1;
+            this.checkBox1.UseVisualStyleBackColor = true;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("宋体", 10F);
+            this.label1.ForeColor = System.Drawing.Color.Black;
+            this.label1.Location = new System.Drawing.Point(26, 9);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(77, 14);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "切入点名称";
+            // 
+            // panel1
+            // 
+            this.panel1.BackColor = System.Drawing.Color.White;
+            this.panel1.Controls.Add(this.btnClose);
+            this.panel1.Controls.Add(this.label1);
+            this.panel1.Controls.Add(this.checkBox1);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel1.Location = new System.Drawing.Point(0, 0);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(312, 30);
+            this.panel1.TabIndex = 2;
+            // 
+            // btnClose
+            // 
+            this.btnClose.Dock = System.Windows.Forms.DockStyle.Right;
+            this.btnClose.Location = new System.Drawing.Point(284, 0);
+            this.btnClose.Name = "btnClose";
+            this.btnClose.Size = new System.Drawing.Size(28, 30);
+            this.btnClose.TabIndex = 3;
+            this.btnClose.Text = "X";
+            this.btnClose.UseVisualStyleBackColor = true;
+            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("宋体", 10F);
+            this.label2.ForeColor = System.Drawing.Color.LightGray;
+            this.label2.Location = new System.Drawing.Point(80, 43);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(147, 14);
+            this.label2.TabIndex = 3;
+            this.label2.Text = "X:65000 Y:50000 Z:20";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Font = new System.Drawing.Font("宋体", 10F);
+            this.label3.ForeColor = System.Drawing.Color.LightGray;
+            this.label3.Location = new System.Drawing.Point(80, 89);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(119, 14);
+            this.label3.TabIndex = 3;
+            this.label3.Text = "2020-09-02 12:00";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Font = new System.Drawing.Font("宋体", 10F);
+            this.label4.ForeColor = System.Drawing.Color.LightGray;
+            this.label4.Location = new System.Drawing.Point(80, 120);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(119, 14);
+            this.label4.TabIndex = 3;
+            this.label4.Text = "2020-09-02 12:35";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Font = new System.Drawing.Font("宋体", 10F);
+            this.label5.ForeColor = System.Drawing.Color.LightGray;
+            this.label5.Location = new System.Drawing.Point(80, 151);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(35, 14);
+            this.label5.TabIndex = 3;
+            this.label5.Text = "完成";
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Font = new System.Drawing.Font("宋体", 10F);
+            this.label6.ForeColor = System.Drawing.Color.LightGray;
+            this.label6.Location = new System.Drawing.Point(80, 66);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(105, 14);
+            this.label6.TabIndex = 3;
+            this.label6.Text = "T:50 M:50 R:20";
+            // 
+            // UControl_ParaInfo
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.Color.Black;
+            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.Controls.Add(this.label5);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label6);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.panel1);
+            this.Controls.Add(this.lblState);
+            this.Controls.Add(this.lblEndTime);
+            this.Controls.Add(this.lblStartTime);
+            this.Controls.Add(this.lblLocation);
+            this.Name = "UControl_ParaInfo";
+            this.Size = new System.Drawing.Size(312, 178);
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+        private System.Windows.Forms.Label lblLocation;
+        private System.Windows.Forms.Label lblStartTime;
+        private System.Windows.Forms.Label lblEndTime;
+        private System.Windows.Forms.Label lblState;
+        private System.Windows.Forms.CheckBox checkBox1;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.Button btnClose;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.Label label6;
+    }
+}

+ 43 - 0
HOZProject/UserControls/UControl_ParaInfo.cs

@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    public partial class UControl_ParaInfo : UserControl
+    {
+        private FormHOZMain formHOZMain;
+        public FormHOZMain FormHOZMainObject { get => formHOZMain; set => formHOZMain = value; }
+        public UControl_ParaInfo(FormHOZMain formHOZ)
+        {
+            InitializeComponent();
+            FormHOZMainObject = formHOZ;
+        }
+
+        private void btnClose_Click(object sender, EventArgs e)
+        {
+            foreach (Control item in FormHOZMainObject.plFill.Controls)
+            {
+                if (item is Panel)
+                {
+                    foreach (Control itemControl in item.Controls)
+                    {
+                        if (itemControl.Name == this.Name)
+                        {
+                            item.Controls.Remove(this);
+                            this.Dispose();
+                            item.Visible = false;
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 120 - 0
HOZProject/UserControls/UControl_ParaInfo.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 202 - 0
HOZProject/UserControls/UControl_Process.Designer.cs

@@ -0,0 +1,202 @@
+namespace HOZProject
+{
+    partial class UControl_Process
+    {
+        /// <summary> 
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 组件设计器生成的代码
+
+        /// <summary> 
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UControl_Process));
+            System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem(new string[] {
+            "aaa",
+            "aaa",
+            "Time"}, 0, System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))));
+            System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(new string[] {
+            "bbb"}, 1, System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))));
+            System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem(new string[] {
+            "ccc"}, 2, System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))));
+            System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem(new string[] {
+            "ddd"}, 3, System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))));
+            System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(new string[] {
+            "eee"}, 4, System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))));
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.label1 = new System.Windows.Forms.Label();
+            this.progressBar1 = new System.Windows.Forms.ProgressBar();
+            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+            this.btnClose = new System.Windows.Forms.Button();
+            this.listView1 = new System.Windows.Forms.ListView();
+            this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.panel2 = new System.Windows.Forms.Panel();
+            this.label2 = new System.Windows.Forms.Label();
+            this.panel1.SuspendLayout();
+            this.panel2.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // panel1
+            // 
+            this.panel1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
+            this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.panel1.Controls.Add(this.label1);
+            this.panel1.Controls.Add(this.progressBar1);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panel1.Location = new System.Drawing.Point(0, 385);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(280, 46);
+            this.panel1.TabIndex = 0;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("宋体", 10F);
+            this.label1.ForeColor = System.Drawing.Color.LightGray;
+            this.label1.Location = new System.Drawing.Point(5, 16);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(77, 14);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "检测总进度";
+            // 
+            // progressBar1
+            // 
+            this.progressBar1.Location = new System.Drawing.Point(88, 16);
+            this.progressBar1.Name = "progressBar1";
+            this.progressBar1.Size = new System.Drawing.Size(183, 14);
+            this.progressBar1.TabIndex = 0;
+            // 
+            // imageList1
+            // 
+            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
+            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
+            this.imageList1.Images.SetKeyName(0, "Reset32.png");
+            this.imageList1.Images.SetKeyName(1, "Ruler32.png");
+            this.imageList1.Images.SetKeyName(2, "set32.png");
+            this.imageList1.Images.SetKeyName(3, "start32.png");
+            this.imageList1.Images.SetKeyName(4, "stop32.png");
+            // 
+            // btnClose
+            // 
+            this.btnClose.Dock = System.Windows.Forms.DockStyle.Right;
+            this.btnClose.Location = new System.Drawing.Point(250, 0);
+            this.btnClose.Name = "btnClose";
+            this.btnClose.Size = new System.Drawing.Size(28, 28);
+            this.btnClose.TabIndex = 2;
+            this.btnClose.Text = "X";
+            this.btnClose.UseVisualStyleBackColor = true;
+            this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
+            // 
+            // listView1
+            // 
+            this.listView1.Activation = System.Windows.Forms.ItemActivation.OneClick;
+            this.listView1.AllowColumnReorder = true;
+            this.listView1.AllowDrop = true;
+            this.listView1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
+            this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1,
+            this.columnHeader2,
+            this.columnHeader3});
+            this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.listView1.ForeColor = System.Drawing.Color.LightGray;
+            this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+            this.listView1.HotTracking = true;
+            this.listView1.HoverSelection = true;
+            listViewItem1.StateImageIndex = 0;
+            listViewItem2.StateImageIndex = 0;
+            listViewItem3.StateImageIndex = 0;
+            listViewItem4.StateImageIndex = 0;
+            listViewItem5.StateImageIndex = 0;
+            this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
+            listViewItem1,
+            listViewItem2,
+            listViewItem3,
+            listViewItem4,
+            listViewItem5});
+            this.listView1.LabelWrap = false;
+            this.listView1.Location = new System.Drawing.Point(0, 30);
+            this.listView1.MultiSelect = false;
+            this.listView1.Name = "listView1";
+            this.listView1.ShowGroups = false;
+            this.listView1.Size = new System.Drawing.Size(280, 355);
+            this.listView1.SmallImageList = this.imageList1;
+            this.listView1.TabIndex = 4;
+            this.listView1.TabStop = false;
+            this.listView1.UseCompatibleStateImageBehavior = false;
+            this.listView1.View = System.Windows.Forms.View.List;
+            // 
+            // panel2
+            // 
+            this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.panel2.Controls.Add(this.label2);
+            this.panel2.Controls.Add(this.btnClose);
+            this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel2.Location = new System.Drawing.Point(0, 0);
+            this.panel2.Name = "panel2";
+            this.panel2.Size = new System.Drawing.Size(280, 30);
+            this.panel2.TabIndex = 3;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("宋体", 10F);
+            this.label2.Location = new System.Drawing.Point(5, 7);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(35, 14);
+            this.label2.TabIndex = 3;
+            this.label2.Text = "XXXX";
+            // 
+            // UControl_Process
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.listView1);
+            this.Controls.Add(this.panel2);
+            this.Controls.Add(this.panel1);
+            this.Name = "UControl_Process";
+            this.Size = new System.Drawing.Size(280, 431);
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            this.panel2.ResumeLayout(false);
+            this.panel2.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ProgressBar progressBar1;
+        private System.Windows.Forms.ImageList imageList1;
+        private System.Windows.Forms.Button btnClose;
+        private System.Windows.Forms.ListView listView1;
+        private System.Windows.Forms.ColumnHeader columnHeader1;
+        private System.Windows.Forms.ColumnHeader columnHeader2;
+        private System.Windows.Forms.ColumnHeader columnHeader3;
+        private System.Windows.Forms.Panel panel2;
+        private System.Windows.Forms.Label label2;
+    }
+}

+ 45 - 0
HOZProject/UserControls/UControl_Process.cs

@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HOZProject
+{
+    public partial class UControl_Process : UserControl
+    {
+        private string cutHoleName;
+        public string CutHoleName { get => cutHoleName; set => cutHoleName = value; }
+        private FormHOZMain formHOZMain;
+        public FormHOZMain FormHOZMainObject { get => formHOZMain; set => formHOZMain = value; }
+        public UControl_Process(FormHOZMain formHOZ)
+        {
+            InitializeComponent();
+            FormHOZMainObject = formHOZ;
+        }
+
+        private void btnClose_Click(object sender, EventArgs e)
+        {
+            foreach (Control item in FormHOZMainObject.plFill.Controls)
+            {
+                if (item is Panel)
+                {
+                    foreach (Control itemControl in item.Controls)
+                    {
+                        if (itemControl.Name == this.Name)
+                        {
+                            item.Controls.Remove(this);
+                            this.Dispose();
+                            item.Visible = false;
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 233 - 0
HOZProject/UserControls/UControl_Process.resx

@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS
+        GAAAAk1TRnQBSQFMAgEBBQEAARgBAAEYAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABgAMAAUADAAEBAQABCAYAASAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8AjQAB/wH0AfMBGgG9
+        AhoBGwHzAfQB/3MAAf8B8wG8AewBbgREAeoBbQHtAbwB8wH/cAAB9AEaAW4CRQFGAmkCRgHpAiMB6gHt
+        AfEB9G4AAfQBBwJEAmgBRQTpA0UBRAERAW0B8AH0bAAB9AEHAUUCRgFAAkUBRgFFAUYERQFGAUUBPwFo
+        AQcB9GoAAf8BvAFEAW8BRgJAAUYHRQEkAQECRgE+AW4B8gH/aQAB8wFFAW8BRQFAAUYBFwFGAXQBvQEb
+        ARoBvAEcARICRQHpAkYBRQHsAfNoAAH/AZMBbgFFAukCQAFGAZMBvQH2AfQC9gEHAW4BRQFGAekBRgFF
+        ARMB8AH/ZwAB9AFuAW8BRQFGAUwCRQFGAUwBlAG9AfQB3gH0Af8BvAFuAkUB6QFGAUQB7QH0ZwAB8AJv
+        AUUDRgIkAUYBbwGTAd4B/wH0Af8B9gEaAUUBRgHpAUYBRAFtAfNnAAGTA28BbgGUAY4BaAFFAekBRgFp
+        AZQC8wH2AvMBcwFuAekBRgJFAfFnAAFvAZMBdAGTAW4CvQGTAUYBJAHpAUYBaQGTAvQC8wEaAUUBRgFA
+        AW8BRAHwZwABRQGUAW8BkwFuAb0B9AHzAZMCRQHpAUYBbwEWAb0C9gG9AUUBaQFFAWkBRAG8ZwABbgGU
+        AXQBkwFuAfQB8wH/Ab0BlAFGA0UBaQGTARsB9AG9AUQBaQHpAW8BRAHwZwABkgOTAXQB9AEbAv8B8wGT
+        A0UBRgFpAZQCvQFFAUYBRQFvAUQB8WcAAbwDkwF0AbwB9AH2Af8B9AG9AZMCRgHpAUYBbwGUAZMBaAFG
+        AkUBSwHzZwAB8wFzAZQBkwGOAZMB9gP/AfQB9gGTAW4BbwFGAWkBbwFpAW8BRQFvAUQBcwH0ZwAB/wGT
+        AZQDkwEHBP8B9AEaAZMEbwIWAWkBbwFEAbwB/2gAAfECkwGUAZMB7QG8AvQD9gG9AZMDbwHjAUYBFgJu
+        AfNpAAH/AQcBvQGTAbcBkwHsAZMBGgHzARsC8wGUAW8BFgJvARYBbgFFARsB/2oAAfQBtgG3ApMBBwKO
+        AZMDjgJvAXQCbwGTAW4B7wH0bAAB8wGTAbcCkwKUBpMBbwEWAXQBSwGTAfRuAAH0AQcBkwG8AbcDkwGU
+        BJMB7AFuAbwB9HAAAf8B8QHvApMBvQG2ApQBkwFzAW4BBwHzAf9zAAH/AfMBvAHtAesCbgHvAbwB9AH/
+        /wD/AP8A/wB7AAL/AfQD/xYAAfcBEwsAAewBbTMAAf8B9AHxAQcBtQGuAfcBBwHxAfQB/xQAAf8B8gEH
+        AVABTwJJAXIB7QG8AfQTAAG8AQ4BEQHqARID6gFtARIBEwFtARIBEwEUAQ8B7BUAAfEB8AMHFgAB/wHy
+        AbUBzwKtAbQCrQKLAa4BBwHzAf8RAAH/AQcBEgFtAVAEcgFJARMB9wHxAgAB8gHzDQAB6wHxAW0B7ALy
+        AfMB8gHzAfAD8wHyAfEBBwFDAbwB7AG8DgAB8AMHAfABBwHtAewC6wGSAQcB8BIAAfQBBwGRAbQB1ga0
+        Ac8BrgGLAa4B8AH0DwAB8wFQAU8BcgFQAVUCTwNVAU8CSQGYAQcBSQHtDAAB7wERAf8B8wHrC/8B7QG8
+        Af8B6wHtAe8MAAGSAuwB6wHsAu8C6wHsAW0B7ALvAQcBvA8AAfQBtQG0AtUBtALVAbMC1AGtAtUBzwGt
+        AYsBuwH0DQAB8wFzAnIBUAFPAy4BTwEuAU8BlwFPAkkB6gESAewB/wsAAe8BkgEHAewPrgLtAe8MAAPs
+        Am0B7AHrAW0B7AHrARIB7ALvAvcBBwHxDAAB9AH3BLQC1QKzAdQC1QHOAc8CtAKLAQcB9AsAAf8B7wFy
+        AZgBlwZPAy4CVQFPAZcBSQFyAf8JAAH3ARMB8AHzAhIBzwG1AbQHtQK7AgkB7QH3DgAD7AJtAuoBbQHs
+        AusBbQPsAesB7AHvAfEKAAH/AQkBtALVAbMB1QGzAbQBswK0AbMD1ALOAdUBrQGLARkB/woAAf8B6gSY
+        AXgClwJVAk8BLgEtAVUBTwGXAU8B6gH/CAABBwETARAB6gHvAWYBhgfWBAkD3QHtAZIKAAHwAe8BkgH3
+        AW0B7ALrAm0BEgFtAuwEbQTsAQcKAAHyAbQD1QGzArQB3AHVArMB1QHUAs4B1AGtAbMBtAGLAbQB9AoA
+        AfAB7AEIAZgB7QFyAZIC7AH3AnIHTwFyAf8IAAHvAfABFAEHAe8BZgGGAdYBtAHVAdYBtQTWBQkBtQH3
+        CgAB9wHtBuwB6gISAewBvAEHAe8B7AJtAesD7AHvCQAB/wG1BdUBtAGzARkBCQG7A7QE1AHOAdQBrQGL
+        AfEB/wkAAfcBCAGSAfAB8wH0Af8CAAH2AfABUAFJBk8BcgsAARIB/wHwAWYBpwHVAeYD1QXWBAkBtQH3
+        CQAB8AHsApIB7AHtA+8B7AFtAesBBwHxAfIBvARtAesC7AHvCQAB9AG0AtUC1AHVAbQBrQMZAQkBtAGz
+        AtQBzgHUAc4BswG0AYsBtQH0CQAB6wHyAfMB/wcAAQcBcgGXAnIBTwJyAW0B/woAARQB/wHxAWYBhgHm
+        Ac8C5gHPAtUE1gG1AdYBCQGuAfcJAAG8ApIB7QLsAQcBvAEHAe8BkgHvAfIC8QG8AesBbQHrBOwB7wkA
+        AfABtAHVA9QDtAEZA/QBCQG0Aa0CswGtAc4BrQGzAYsBtAH0CQAB9wH0CAAB8QG8A5gBlwF4AZgBSQGS
+        Af8KAAESAf8B8AFlAaYDpwOtAuYB1QTWAQkBzwG1CQABvAGSBOwB7wEHAbwC8QHyAfMB8gHzAfIBvAGS
+        Ae8CBwGSAewBBwkAAbsCtAHUAtUDtAEZA/8B9AEZAbUBtAHVAdQCrQGzAbQBrgHzCQAB9AH/AfQD/wH0
+        Av8B9AFJAnIBUARyAUkB8wsAARMB/wHwAWUBpgKnAccBpwLHAqcBrQHmAbQBtQHWAbUBtAG1CQABvAHs
+        Ae0DkgHvAbwE8QHzAfQB/wHyAfAC8QHwAQcB7QHsAbwJAAGRA7QB1QHbAdUCtAEZAv8C9AH/ARkBuwG0
+        AdUDrQG0AYsBGQkAAfQB7AFyAewEcgHsAe8B8ALzAvQC8wL0Af8LAAETAf8B8AFlAaYCpwHHAacBxwGn
+        AscCpwGtA9UBzwG1CQABvAHvAgcB7wEHAfACvAHwAewBbQHsAe8C9AHzAfIBvAHvAewB6wHsAfAJAAGu
+        AboE2wHVArQBGQH0Bf8BGQHcA9UBrQG0AYsBGQkAARIESQIoAUkBEAHsCAAC9AsAARMB/wHxAWUBpgKn
+        BMcFpwGtAc8B1QHPAbUKAAL3AQcB8QHwAbwC8QHsARQBFQETARIB7wH0AbwB8AG8AfcCbQHsAfAJAAGR
+        AbsC3ALbAdUBtQG0ARkB9AP/AfQBGQEJAbQB1QG0AdsCtAGuAfMJAAFJAZgBlwFyAZcBUAGXAXIB7AH0
+        BwAB9ALvAf8KAAESAf8B8AFlAaYCpwnHAqcBzgHPAbUKAAG8AfcB7QHvAvEB8AHxAe0BFAEVAuoB9wH0
+        AfEB8AG8Ae8BkgHtAewBBwkAAQcBuwLcAtsB1QG1AbQBGQL0Av8BGQG7A7QC2wO0AfMJAAFyAZgFTwFJ
+        AXIB9AP/AQAC/wHwAe0BSQHvCwABEgH/AbwBZQGmAacFxwFCAscByASnAYYBtQoAAbwCkgHvAfMC8gH0
+        AbwBkgFtAesBkgEHAfECvAIHAe8BBwGSCgAB8QG0AdwB2wLcAbsBtQG0ARkC9AIZAbsCtALVAtsB1QGR
+        AbUB9AgAAf8BcgGYAXgBUAJPAS4BJwFJAnIBmAHzAfABBwFyAUkBcgFJAfAB/woAARMB/wHwAWYBpgOn
+        A8cDyAWnAYYBtQoAAQcB7wHxAvMB8QHyAfMB8gHzAbwBBwHwAfECBwHvAe0CkgH3Ae8KAAH0AbQF3AEJ
+        AbQDGQEJA7UB3AHbAdUC2wHcAYsBCQH0CQAB6gEIAZgBlwJPAVABcgFPAUkCJwFJA08CcgFJAfILAAET
+        Af8BvAFmAaYEpwTHAacBxwSnAYYBtQsAAQcBvAHwAQcCvALzAfEB8wHxAbwB8AIHAe0B6wEHAQAB8QsA
+        Af8BuwG1A9wBuwHcAbQCGQHcAQkBtQTVAtsB3AG0AZEB8wH/CQABSQHCApgClwNPBJcCUAFPAZcBTwFy
+        Af8JAAG8AfEBEgHxAbwBZgEEDacBpgGGAbULAAHxAwcB8AHvAvMB8AG8Au8BvAIHAe8BbQHvDgAB8wG0
+        BNwBCQG0AQkB3AG7AbUBuwLcAtUB3AHbAdUBrgEJAfQKAAHsAQgBeAOYApcBcgZPAVABcgFJAbwKAAHt
+        ARIBEQESAe8BZgGmDqcBhgG1EAAB7wG8AvAFBwG8AQcB7AG8DgAB/wG8AbUBCQPcAdYK3AK0AbUB8wH/
+        CgABEgJyAVAEmASXAVABTwGXAVABTwEIAf8LAAHsAQ8BBwHwAWYPZQERAZIQAAEHAbwBBwLvAgAB8AEH
+        Au8BBxAAAfQBCQG0AbUM3AHVArQBGQH0CwABEwEHAfQB8wHvAe0BCAeYAnIB8QH/EAAQhgHsEgAB8AEH
+        AfAFAAHwEwAB9AEJArUCCQTcAwkBuwG1AZEBuwHzAfQMAAHzAf8CAAH0AfAB7AEIBJgCcgGYAfQB/1EA
+        AfQB3QK1BtwBuwO1AQkB8wH0FAAB8gEHAZIB7wHwAfMB/1UAAf8B9AG8AfcBtAK1ArQBtQHvAQcB8QH0
+        Af8ZAAH/WQAB/wL0ARkB3QEJARkB8wL0Af//AIsAAUIBTQE+BwABPgMAASgDAAGAAwABQAMAAQEBAAEB
+        BgABBBYAA/8BAAT/DAAE/wwABP8MAAH/AeABAwH/DAAB/wGAAQAB/wwAAf8CAAF/DAAB/gIAAT8MAAH8
+        AgABHwwAAfgCAAEPDAAB+AIAAQ8MAAHwAgABBwwAAfACAAEHDAAB8AIAAQcMAAHwAgABBwwAAfACAAEH
+        DAAB8AIAAQcMAAHwAgABBwwAAfACAAEHDAAB8AIAAQcMAAHwAgABBwwAAfACAAEHDAAB+AIAAQ8MAAH4
+        AgABDwwAAfwCAAEfDAAB/gIAAT8MAAH/AgABfwwAAf8BgAEAAf8MAAH/AeABAwH/DAAE/wwABP8MAAT/
+        DAAE/wwAQf8B+AEfAv8BnwH8Bv8B4AEDAv8BwAEHAv8CAAF/Af8B/AEfAv8BgAEAAv8BgAEDAT8B/gIA
+        AR8B/wGAAQMC/wIAAX8B/wIAAT8B/AIAAQ8B/wIAAf8B/gIAAT8B/gIAAR8B/AIAAQ8B/wIAAT8B/AIA
+        AR8B/AIAAR8B8AIAAT8B/wIAAR8B+AIAAQ8B/AIAAR8B4AIAAT8B8AIAAR8B+AIAAQ8B/AIAAR8B4AIA
+        AT8B8AIAAR8B8AIAAQcB/AEGAQABPwH4AgABPwHgAgABHwHwAgABBwH8AT8BgAEfAfgCAAE/AeACAAEf
+        AfACAAEHAfwB/wEAAR8B+AIAAT8B4AIAAR8B8AIAAQcB/AIAAT8B+AIAAT8B4AIAAR8B8AIAAQcB/AIA
+        AT8B+AIAAT8B4AIAAR8B8AIAAQcB/AEAAf8BPwH4AgABPwHwAgABHwHwAgABBwH8AQAB/gEfAfgCAAE/
+        AfACAAEfAfACAAEHAfwBAAEQAT8B+AIAAT8B8AIAAT8B8AIAAQcB+AIAAR8B+AIAAT8B8AIAAT8B8AIA
+        AQcB/AIAAT8B+AIAAT8B+AEAAQEBfwHwAgABBwH8AgABPwHgAgABPwH4AQABAQH/AfgCAAEPAfwCAAF/
+        AeACAAE/Af8BwAEBAf8B+AIAAQ8B/AIAAX8B8AIAAT8B/wHBAYMB/wH8AgABHwH8AgAC/wIAAX8B/wHj
+        Ae8B/wH+AgABPwH8AcABAQr/AgABfwH/AfgBDwr/AYABAAP/Ab8K/wHgAQMx/ws=
+</value>
+  </data>
+</root>