1、优化LOG显示与引用

2、添加PMA工具,工具内容待完善
3、修复流程树显示
4、添加开源项目,优化UI空间
5、其他BUG更改
This commit is contained in:
liu.wenjie
2021-11-23 15:51:37 +08:00
parent 47f77f5e64
commit a24dda2525
474 changed files with 91916 additions and 6429 deletions

Binary file not shown.

View File

@@ -110,57 +110,22 @@ namespace CaliperTool
}
set { _resultCol = value; }
}
public HObject inputImage { get; set; } = null;
public ToolRunStatu toolRunStatu { get; set; } = ToolRunStatu.Not_Run;
public SoftwareRunState softwareRunState { get; set; } = SoftwareRunState.Debug;
public string runMessage
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string runTime
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public void DispImage()
public override void DispImage()
{
if (inputImage != null)
{
FormCaliper.Instance.myHwindow.HobjectToHimage(inputImage);
FormCaliper.Instance.myHwindow.HalconWindow.DispObj(inputImage);
}
}
internal void DrawExpectLine(HWindow_Final myHwindow)
internal void DrawExpectLine(HWindow myHwindow)
{
if (inputImage != null)
{
try
{
myHwindow.DrawModel = true;
myHwindow.Focus();
HOperatorSet.SetColor(myHwindow.hWindowControl.HalconWindow, new HTuple("green"));
HOperatorSet.DrawRectangle2Mod(myHwindow.hWindowControl.HalconWindow, expectRecStartRow, expectRecStartColumn, expectAngle, length1, length2,
HOperatorSet.SetColor(myHwindow, new HTuple("green"));
HOperatorSet.DrawRectangle2Mod(myHwindow, expectRecStartRow, expectRecStartColumn, expectAngle, length1, length2,
out expectRecStartRow, out expectRecStartColumn, out expectAngle, out length1, out length2);
if (inputPose != null)
@@ -177,29 +142,27 @@ namespace CaliperTool
FormCaliper.Instance.tbx_caliperLength1.Text = length1.TupleString("10.3f");
FormCaliper.Instance.tbx_caliperLength2.Text = length2.TupleString("10.3f");
myHwindow.DrawModel = false;
// Run();
}
catch (Exception ex)
{
FormCaliper.Instance.TextBoxMessageDisp(ex.Message, System.Drawing.Color.Red);
FormCaliper.Instance.SetToolStatus(ex.Message, ToolRunStatu.Tool_Run_Error);
}
}
else
{
FormCaliper.Instance.TextBoxMessageDisp("图像为空", System.Drawing.Color.Red);
FormCaliper.Instance.SetToolStatus("图像为空", ToolRunStatu.Not_Asign_Input_Image);
}
}
public void UpdateImage()
{
FormCaliper.Instance.myHwindow.ClearWindow();
FormCaliper.Instance.myHwindow.HalconWindow.ClearWindow();
DispImage();
}
public void Run(SoftwareRunState softwareRunState)
public override void Run(SoftwareRunState softwareRunState)
{
HTuple HMeasureHandle = new HTuple();
HTuple resultRow, resultCol;
@@ -207,7 +170,7 @@ namespace CaliperTool
{
if(softwareRunState == SoftwareRunState.Debug)
{
FormCaliper.Instance.TextBoxMessageDisp("图像为空", System.Drawing.Color.Red);
FormCaliper.Instance.SetToolStatus("图像为空", ToolRunStatu.Not_Asign_Input_Image);
}
toolRunStatu = ToolRunStatu.Not_Input_Image;
return;
@@ -248,10 +211,10 @@ namespace CaliperTool
HOperatorSet.GenCrossContourXld(out crossDisp, ResulttRow, ResultCol, new HTuple(80), new HTuple(0));
if(softwareRunState == SoftwareRunState.Debug)
{
DispMainWindow(FormCaliper.Instance.myHwindow);
DispMainWindow(FormCaliper.Instance.myHwindow.HalconWindow);
FormCaliper.Instance.tbx_resultStartRow.Text = ResulttRow.ToString();
FormCaliper.Instance.tbx_resultStartCol.Text = ResultCol.ToString();
FormCaliper.Instance.TextBoxMessageDisp("运行成功", System.Drawing.Color.Green);
FormCaliper.Instance.SetToolStatus("运行成功", ToolRunStatu.Succeed);
}
// 参数传递
ParamsTrans();
@@ -262,7 +225,7 @@ namespace CaliperTool
toolRunStatu = ToolRunStatu.Not_Succeed;
if (softwareRunState == SoftwareRunState.Debug)
{
FormCaliper.Instance.TextBoxMessageDisp("工具运行异常" + ex.Message, System.Drawing.Color.Red);
FormCaliper.Instance.SetToolStatus("工具运行异常" + ex.Message, ToolRunStatu.Tool_Run_Error);
}
}
finally
@@ -287,20 +250,36 @@ namespace CaliperTool
}
public void DispMainWindow(HWindow_Final window)
public override void DispMainWindow(HWindow window)
{
// 显示矩形
if (dispRec)
if (dispRec && contoursDisp != null)
{
window.DispObj(contoursDisp, "blue");
window.SetColor("blue");
window.DispObj(contoursDisp);
}
// 显示交点
if (dispCross)
if (dispCross && crossDisp != null)
{
window.DispObj(crossDisp, "green");
window.SetColor("green");
window.DispObj(crossDisp);
}
//显示找到的线
// window.DispObj(LineDisp, "green");
}
public void SetToolStatusDisp()
{
FormCaliper.Instance.lb_RunStatus.Text = toolRunStatu == ToolRunStatu.Succeed ? "工具运行成功!" : $"工具运行异常, 异常原因:{runMessage}";
FormCaliper.Instance.lb_RunTime.Text = runTime;
if (toolRunStatu == ToolRunStatu.Succeed)
{
FormCaliper.Instance.statusStrip.BackColor = System.Drawing.Color.LimeGreen;
}
else
{
FormCaliper.Instance.statusStrip.BackColor = System.Drawing.Color.Red;
}
}
}
}

View File

@@ -45,7 +45,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CaliperTool.cs" />
<Compile Include="Caliper.cs" />
<Compile Include="CaliperToolRun.cs" />
<Compile Include="FormCaliper.cs">
<SubType>Form</SubType>
@@ -76,12 +76,8 @@
<Project>{7CD50B44-BF56-4E8E-8FA1-05F6968C1835}</Project>
<Name>ToolBase</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\LogForm\LogForm.csproj">
<Project>{6b38d68f-e77b-4761-bde5-a261ea8925dd}</Project>
<Name>LogForm</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\Logger\Logger.csproj">
<Project>{d4e052b9-e541-4b67-a1f9-273073ef1d4b}</Project>
<Project>{D4E052B9-E541-4B67-A1F9-273073EF1D4B}</Project>
<Name>Logger</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.VisionJob\ToolLib.VisionJob.csproj">

View File

@@ -15,6 +15,7 @@ using CommonMethods;
using CommonMethods.Interface;
using FormLib;
using HalconDotNet;
using Logger;
using System;
using System.Collections.Generic;
using System.Drawing;
@@ -38,7 +39,7 @@ namespace CaliperTool
if (L_toolList[toolIndex].toolInput[j].IOName == "InputImage" && L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null)
{
selectNode.ForeColor = Color.Red;
Logger.LoggerClass.WriteLog($"{L_toolList[toolIndex].toolName} 无输入图像");
LoggerClass.WriteLog($"{L_toolList[toolIndex].toolName} 无输入图像");
break;
}
else
@@ -46,9 +47,9 @@ namespace CaliperTool
if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value != null)
{
string sourceFrom = L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value.ToString();
string sourceToolName = Regex.Split(sourceFrom, " . ")[0];
sourceToolName = sourceToolName.Substring(3, Regex.Split(sourceFrom, " . ")[0].Length - 3);
string toolItem = Regex.Split(sourceFrom, " . ")[1];
string sourceToolName = Regex.Split(sourceFrom, "->")[0];
sourceToolName = sourceToolName.Substring(3, Regex.Split(sourceFrom, "->")[0].Length - 3);
string toolItem = Regex.Split(sourceFrom, "->")[1];
if (L_toolList[toolIndex].toolInput[j].IOName == "InputImage")
{
myCaliper.inputImage = myJob.GetToolInfoByToolName(sourceToolName).GetOutput(toolItem).value as HObject;
@@ -72,7 +73,7 @@ namespace CaliperTool
myCaliper.Run(SoftwareRunState.Release);
if (myCaliper.toolRunStatu == ToolRunStatu.Succeed)
{
myCaliper.DispMainWindow(FormImageWindow.Instance.myHWindow);
myCaliper.DispMainWindow(FormImageWindow.Instance.myHWindow.DispHWindow);
myJob.FormLogDisp(L_toolList[toolIndex].toolName + " 运行成功", Color.Green, selectNode);
}
else

View File

@@ -45,7 +45,6 @@
this.btn_moveCliperRegion = new System.Windows.Forms.Button();
this.cbx_edgeSelect = new System.Windows.Forms.ComboBox();
this.tbx_resultStartCol = new System.Windows.Forms.TextBox();
this.txbLog = new System.Windows.Forms.TextBox();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.panel1 = new System.Windows.Forms.Panel();
this.groupBox4 = new System.Windows.Forms.GroupBox();
@@ -63,6 +62,11 @@
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.label7 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.panel2 = new System.Windows.Forms.Panel();
this.statusStrip = new System.Windows.Forms.StatusStrip();
this.lb_RunStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.lb_Split = new System.Windows.Forms.ToolStripStatusLabel();
this.lb_RunTime = new System.Windows.Forms.ToolStripStatusLabel();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
@@ -71,6 +75,7 @@
this.groupBox3.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.statusStrip.SuspendLayout();
this.SuspendLayout();
//
// tbx_resultStartRow
@@ -242,16 +247,6 @@
this.tbx_resultStartCol.Size = new System.Drawing.Size(71, 21);
this.tbx_resultStartCol.TabIndex = 104;
//
// txbLog
//
this.txbLog.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txbLog.Location = new System.Drawing.Point(1, 487);
this.txbLog.Name = "txbLog";
this.txbLog.ReadOnly = true;
this.txbLog.Size = new System.Drawing.Size(1127, 21);
this.txbLog.TabIndex = 276;
//
// splitContainer1
//
this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
@@ -267,6 +262,7 @@
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.BackColor = System.Drawing.Color.White;
this.splitContainer1.Panel2.Controls.Add(this.panel2);
this.splitContainer1.Panel2.Controls.Add(this.groupBox4);
this.splitContainer1.Panel2.Controls.Add(this.groupBox3);
this.splitContainer1.Panel2.Controls.Add(this.groupBox1);
@@ -452,12 +448,49 @@
this.label9.TabIndex = 105;
this.label9.Text = "中心列坐标:";
//
// panel2
//
this.panel2.Location = new System.Drawing.Point(-566, 485);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(1127, 25);
this.panel2.TabIndex = 276;
//
// statusStrip
//
this.statusStrip.BackColor = System.Drawing.Color.White;
this.statusStrip.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lb_RunStatus,
this.lb_Split,
this.lb_RunTime});
this.statusStrip.Location = new System.Drawing.Point(0, 485);
this.statusStrip.Name = "statusStrip";
this.statusStrip.Size = new System.Drawing.Size(1132, 24);
this.statusStrip.TabIndex = 276;
this.statusStrip.Text = "statusStrip1";
//
// lb_RunStatus
//
this.lb_RunStatus.Name = "lb_RunStatus";
this.lb_RunStatus.Size = new System.Drawing.Size(0, 19);
//
// lb_Split
//
this.lb_Split.Name = "lb_Split";
this.lb_Split.Size = new System.Drawing.Size(189, 19);
this.lb_Split.Text = " ";
//
// lb_RunTime
//
this.lb_RunTime.Name = "lb_RunTime";
this.lb_RunTime.Size = new System.Drawing.Size(0, 19);
//
// FormCaliper
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1132, 509);
this.Controls.Add(this.txbLog);
this.Controls.Add(this.statusStrip);
this.Controls.Add(this.splitContainer1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormCaliper";
@@ -475,6 +508,8 @@
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.statusStrip.ResumeLayout(false);
this.statusStrip.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@@ -497,7 +532,6 @@
private System.Windows.Forms.Button btn_moveCliperRegion;
public System.Windows.Forms.ComboBox cbx_edgeSelect;
public System.Windows.Forms.TextBox tbx_resultStartCol;
public System.Windows.Forms.TextBox txbLog;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.GroupBox groupBox3;
@@ -515,5 +549,10 @@
private System.Windows.Forms.Label label9;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.CheckBox chBDispCaliperROI;
private System.Windows.Forms.Panel panel2;
public System.Windows.Forms.StatusStrip statusStrip;
public System.Windows.Forms.ToolStripStatusLabel lb_RunStatus;
private System.Windows.Forms.ToolStripStatusLabel lb_Split;
public System.Windows.Forms.ToolStripStatusLabel lb_RunTime;
}
}

View File

@@ -9,6 +9,7 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using CommonMethods;
using ChoiceTech.Halcon.Control;
using HalconDotNet;
namespace CaliperTool
{
@@ -17,32 +18,43 @@ namespace CaliperTool
public Caliper myCaliper = null;
public IToolInfo myToolInfo = null;
public HWindow_Final myHwindow = new HWindow_Final();
public HSmartWindowControl myHwindow = new HSmartWindowControl();
private static FormCaliper _instance = null;
private static FormCaliper _instance;
public FormCaliper(ref object caliper)
{
InitializeComponent();
myToolInfo = (IToolInfo)caliper;
myCaliper = (Caliper)myToolInfo.tool;
_instance = this;
myCaliper.DispImage();
if (caliper.GetType().FullName != "System.Object")
{
myToolInfo = (IToolInfo)caliper;
myCaliper = (Caliper)myToolInfo.tool;
myCaliper.DispImage();
}
}
public static FormCaliper Instance
{
get
{
if(_instance!= null)
if (_instance != null)
{
return _instance;
lock (_instance)
{
if (_instance == null)
{
object calib = new object();
_instance = new FormCaliper(ref calib);
}
return _instance;
}
}
else
{
object caliper = new object();
_instance = new FormCaliper(ref caliper);
object line = new object();
_instance = new FormCaliper(ref line);
return _instance;
}
}
}
@@ -78,16 +90,7 @@ namespace CaliperTool
private void btn_moveCliperRegion_Click(object sender, EventArgs e)
{
myCaliper.UpdateImage();
myCaliper.DrawExpectLine(myHwindow);
}
public void TextBoxMessageDisp(string mes, Color setColor)
{
txbLog.BackColor = setColor;
txbLog.Text = mes;
txbLog.Font = new Font("微软雅黑", 10, FontStyle.Bold);
//CommonMethods.CommonMethods.Delay(2000);
txbLog.BackColor = Color.White;
myCaliper.DrawExpectLine(myHwindow.HalconWindow);
}
private void btn_runCaliperool_Click(object sender, EventArgs e)
@@ -105,5 +108,29 @@ namespace CaliperTool
myCaliper.sigma = Convert.ToDouble(tbx_Sigma.Text.Trim());
myCaliper.Run(SoftwareRunState.Debug);
}
/// <summary>
/// 设定工具运行状态
/// </summary>
/// <param name="msg">运行中的信息</param>
/// <param name="status">运行状态</param>
public void SetToolStatus(string msg, ToolRunStatu status)
{
if (myCaliper != null)
{
myCaliper.runMessage = msg;
myCaliper.toolRunStatu = status;
lb_RunStatus.Text = myCaliper.toolRunStatu == ToolRunStatu.Succeed ? "工具运行成功!" : $"工具运行异常, 异常原因:{myCaliper.runMessage}";
lb_RunTime.Text = myCaliper.runTime;
if (myCaliper.toolRunStatu == ToolRunStatu.Succeed)
{
statusStrip.BackColor = Color.LimeGreen;
}
else
{
statusStrip.BackColor = Color.Red;
}
}
}
}
}

View File

@@ -117,6 +117,9 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>

View File

@@ -32,6 +32,9 @@ G:\VisionEdit\VisionEdit\CaliperTool\obj\Debug\CaliperTool.FormCaliper.resources
G:\VisionEdit\VisionEdit\CaliperTool\obj\Debug\CaliperTool.csproj.GenerateResource.Cache
G:\VisionEdit\VisionEdit\CaliperTool\obj\Debug\CaliperTool.dll
G:\VisionEdit\VisionEdit\CaliperTool\obj\Debug\CaliperTool.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.FormCaliper.resources
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\log4net.config
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\CaliperTool.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\CaliperTool.pdb
@@ -40,7 +43,6 @@ F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\DataStruct.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\FormLib.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\halcondotnet.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\HWindow_Tool.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\LogForm.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\Logger.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\ToolBase.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\ToolLib.VisionJob.dll
@@ -52,15 +54,11 @@ F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\CommonMethods.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\DataStruct.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\FormLib.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\ToolBase.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\LogForm.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\Logger.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\ToolLib.VisionJob.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\HWindow_Tool.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\halcondotnet.xml
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\WeifenLuo.WinFormsUI.Docking.pdb
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\Newtonsoft.Json.xml
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\bin\Debug\DevComponents.DotNetBar2.xml
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.FormCaliper.resources
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.dll
F:\GitHubClone\最新克隆\VisionEdit\CaliperTool\obj\Debug\CaliperTool.pdb

View File

@@ -33,8 +33,9 @@
<Reference Include="halcondotnet">
<HintPath>C:\Program Files\MVTec\HALCON-19.05-Progress\bin\dotnet20\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>G:\2D程序最新版本\G3\UMP_BandOnly_2D_V2.5.4\UMP_BandOnly_S3\bin\x64\Debug\Newtonsoft.Json.dll</HintPath>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -58,6 +59,9 @@
<Compile Include="Serialize.cs" />
<Compile Include="VisionToolAttribute.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -40,7 +40,9 @@ namespace CommonMethods
Logic,
Output,
CreateLine,
PMAlignTool,
None
}
public enum DataType
@@ -119,4 +121,13 @@ namespace CommonMethods
FormDevice,
FormLocal
}
public enum ShapeMode
{
RECTANGLE1 = 0,
RECTANGLE2 = 1,
CIRCLE = 2,
ELLIPSE = 3,
Other = 4
}
}

View File

@@ -9,6 +9,7 @@ F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\bin\Debug\CommonMethods.pdb
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\bin\Debug\halcondotnet.dll
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\bin\Debug\Newtonsoft.Json.dll
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\bin\Debug\halcondotnet.xml
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\obj\Debug\CommonHelper.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\bin\Debug\Newtonsoft.Json.xml
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\obj\Debug\CommonMethods.dll
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\obj\Debug\CommonMethods.pdb
F:\GitHubClone\最新克隆\VisionEdit\CommonMethods\obj\Debug\CommonHelper.csprojResolveAssemblyReference.cache

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net452" />
</packages>

View File

@@ -31,6 +31,150 @@ namespace DataStruct
return X.ToString() + " | " + Y.ToString() + " | " + U.ToString();
}
}
/// <summary>
/// XYU结果
/// </summary>
[Serializable]
public class XYU
{
internal XYU()
{
_point = new XY();
}
internal XYU(double x, double y, double u)
{
_point = new XY();
_point.X = x;
_point.Y = y;
_u = u;
}
private XY _point;
public XY Point
{
get { return _point; }
set { _point = value; }
}
private double _u;
public double U
{
get
{
return Math.Round(_u, 3);
}
set { _u = value; }
}
/// <summary>
/// 将XYU类型转化成格式化字符串
/// </summary>
/// <returns></returns>
internal string ToFormatStr()
{
return (Point.X >= 0 ? "+" + Point.X.ToString("000.000") : Point.X.ToString("000.000")) + (Point.Y >= 0 ? "+" + Point.Y.ToString("000.000") : Point.Y.ToString("000.000")) + (U >= 0 ? "+" + U.ToString("000.000") : U.ToString("000.000"));
// return (X >= 0 ? "+" + X.ToString("000.000") : X.ToString("000.000")) + ";" + (Y >= 0 ? "+" + Y.ToString("000.000") : Y.ToString("000.000")) + ";" + (U >= 0 ? "+" + U.ToString("000.000") : U.ToString("000.000"));
}
/// <summary>
/// 将XYU类型转化成格式化字符串
/// </summary>
/// <returns></returns>
internal string ToFormatStrTwoSpace()
{
return (Point.X >= 0 ? "+" + Point.X.ToString("000.000") : Point.X.ToString("000.000")) + (Point.Y >= 0 ? " +" + Point.Y.ToString("000.000") : Point.Y.ToString("000.000")) + (U >= 0 ? " +" + U.ToString("000.000") : U.ToString("000.000"));
// return (X >= 0 ? "+" + X.ToString("000.000") : X.ToString("000.000")) + ";" + (Y >= 0 ? "+" + Y.ToString("000.000") : Y.ToString("000.000")) + ";" + (U >= 0 ? "+" + U.ToString("000.000") : U.ToString("000.000"));
}
internal string ToShowTip()
{
return Point.X.ToString() + " | " + Point.Y.ToString() + " | " + U.ToString();
}
/// <summary>
/// 重写 -
/// </summary>
/// <param name="p1">点1</param>
/// <param name="p2">点2</param>
/// <returns></returns>
public static XYU operator -(XYU p1, XYU p2)
{
return new XYU(p1.Point.X - p2.Point.X, p1.Point.Y - p2.Point.Y, p1.U - p2.U);
}
/// <summary>
/// 重写 +
/// </summary>
/// <param name="p1">点1</param>
/// <param name="p2">点2</param>
/// <returns></returns>
public static XYU operator +(XYU p1, XYU p2)
{
return new XYU(p1.Point.X + p2.Point.X, p1.Point.Y + p2.Point.Y, p1.U + p2.U);
}
}
[Serializable]
public class XY
{
internal XY() { }
internal XY(double x, double y)
{
this.X = x;
this.Y = y;
}
private double _x;
public double X
{
get
{
return Math.Round(_x, 3);
}
set { _x = value; }
}
private double _y;
public double Y
{
get
{
return Math.Round(_y, 3);
}
set { _y = value; }
}
/// <summary>
/// 重写 -
/// </summary>
/// <param name="p1">点1</param>
/// <param name="p2">点2</param>
/// <returns></returns>
public static XY operator -(XY p1, XY p2)
{
return new XY(p1.X - p2.X, p1.Y - p2.Y);
}
/// <summary>
/// 重写 +
/// </summary>
/// <param name="p1">点1</param>
/// <param name="p2">点2</param>
/// <returns></returns>
public static XY operator +(XY p1, XY p2)
{
return new XY(p1.X + p2.X, p1.Y + p2.Y);
}
/// <summary>
/// 获得点矢量长度
/// </summary>
internal double GetDistance
{
get
{
return Math.Sqrt(X * X + Y * Y);
}
}
internal string ToShowTip()
{
return X.ToString() + " | " + Y.ToString();
}
}
[Serializable]
public class Line

View File

@@ -61,71 +61,6 @@ namespace FindCircle
}
}
public SoftwareRunState softwareRunState
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public ToolRunStatu toolRunStatu
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string runMessage
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string runTime
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
HObject IToolBase.inputImage
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
/// <summary>
/// 起始角度
/// </summary>
@@ -159,10 +94,6 @@ namespace FindCircle
/// </summary>
internal int cliperNum = 20;
/// <summary>
/// 输入图像
/// </summary>
internal HObject inputImage;
/// <summary>
/// 新的跟随姿态变化后的预期圆信息
/// </summary>
HTuple newExpecCircleRow = new HTuple(200), newExpectCircleCol = new HTuple(200), newExpectCircleRadius = new HTuple(200);
@@ -171,12 +102,17 @@ namespace FindCircle
/// </summary>
internal PosXYU templatePose = new PosXYU();
public void Run(SoftwareRunState softwareRunState)
public override void Run(SoftwareRunState softwareRunState)
{
throw new NotImplementedException();
}
public void DispImage()
public override void DispImage()
{
}
public override void DispMainWindow(HWindow window)
{
throw new NotImplementedException();
}

View File

@@ -24,6 +24,9 @@ G:\VisionEdit\VisionEdit\FindCircle\obj\Debug\FindCircle.FormFindCircle.resource
G:\VisionEdit\VisionEdit\FindCircle\obj\Debug\FindCircleTool.csproj.GenerateResource.Cache
G:\VisionEdit\VisionEdit\FindCircle\obj\Debug\FindCircleTool.dll
G:\VisionEdit\VisionEdit\FindCircle\obj\Debug\FindCircleTool.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircleTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircle.FormFindCircle.resources
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircleTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\FindCircleTool.dll
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\FindCircleTool.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\CommonMethods.dll
@@ -37,8 +40,6 @@ F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\DataStruct.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\ToolBase.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\HWindow_Tool.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\halcondotnet.xml
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircleTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircle.FormFindCircle.resources
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircleTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\bin\Debug\Newtonsoft.Json.xml
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircleTool.dll
F:\GitHubClone\最新克隆\VisionEdit\FindCircle\obj\Debug\FindCircleTool.pdb

View File

@@ -22,10 +22,6 @@ namespace FindLineTool
/// </summary>
public PosXYU templatePose = new PosXYU();
/// <summary>
/// 期望线起点行坐标
/// </summary>
public HTuple expectLineStartRow = 200;
/// <summary>
/// 卡尺
/// </summary>
public HObject contoursDisp = null;
@@ -38,6 +34,10 @@ namespace FindLineTool
/// </summary>
public HObject crossDisp = null;
/// <summary>
/// 期望线起点行坐标
/// </summary>
public HTuple expectLineStartRow = 200;
/// <summary>
/// 期望线起点列坐标
/// </summary>
public HTuple expectLineStartCol = 200;
@@ -50,6 +50,21 @@ namespace FindLineTool
/// </summary>
public HTuple expectLineEndCol = 600;
/// <summary>
/// 新的跟随姿态变化后的预期线信息
/// </summary>
HTuple newExpectLineStartRow = new HTuple(200), newExpectLineStartCol = new HTuple(200), newExpectLineEndRow = new HTuple(200), newExpectLineEndCol = new HTuple(600);
///// <summary>
///// 区域中心行坐标
///// </summary>
//public HTuple recCenterRow = 200;
///// <summary>
///// 区域中心列坐标
///// </summary>
//public HTuple recCenterCol = 200;
//public HTuple recAngle = 0;
//public HTuple recWidth = 100;
//public HTuple recLength = 200;
/// <summary>
/// 找边极性,从明到暗或从暗到明
/// </summary>
public string polarity = "negative";
@@ -89,14 +104,6 @@ namespace FindLineTool
/// 交点显示
/// </summary>
public bool dispCross = true;
/// <summary>
/// 运行过程信息
/// </summary>
public string runMessage { get; set; }
/// <summary>
/// 工具运行时间
/// </summary>
public string runTime { get; set; } = string.Empty;
public double minScore
{
get
@@ -130,7 +137,7 @@ namespace FindLineTool
/// <summary>
/// 新的跟随姿态变化后的预期线信息
/// </summary>
HTuple newExpectLineStartRow = new HTuple(200), newExpectLineStartCol = new HTuple(200), newExpectLineEndRow = new HTuple(200), newExpectLineEndCol = new HTuple(600);
HTuple newExpectCenterRow = new HTuple(200), newExpectCenterCol = new HTuple(200), newExpectAngle = new HTuple(0);
/// <summary>
/// 查找到的线的起点行坐标
/// </summary>
@@ -196,34 +203,22 @@ namespace FindLineTool
}
set { _angle = value; }
}
/// <summary>
/// 输入图像
/// </summary>
public HObject inputImage { get; set; } = null;
/// <summary>
/// 工具运行结果
/// </summary>
public ToolRunStatu toolRunStatu { get; set; } = ToolRunStatu.Not_Run;
/// <summary>
/// 软件运行状态
/// </summary>
public SoftwareRunState softwareRunState { get; set; } = SoftwareRunState.Debug;
public void DispImage()
public override void DispImage()
{
if(inputImage != null)
{
FormFindLine.Instance.myHwindow.HobjectToHimage(inputImage);
FormFindLine.Instance.myHwindow.DispHWindow.DispImage(new HImage(inputImage));
}
}
public void UpdateImage()
{
FormFindLine.Instance.myHwindow.ClearWindow();
FormFindLine.Instance.myHwindow.DispHWindow.ClearWindow();
DispImage();
}
public void Run(SoftwareRunState softwareRunState)
public override void Run(SoftwareRunState softwareRunState)
{
Stopwatch sw = new Stopwatch();
sw.Restart();
@@ -238,7 +233,10 @@ namespace FindLineTool
}
try
{
UpdateImage();
if(softwareRunState == SoftwareRunState.Debug)
{
UpdateImage();
}
if (inputPose != null)
{
HTuple Row = inputPose.X - templatePose.X;
@@ -284,7 +282,7 @@ namespace FindLineTool
//显示所有卡尺
HTuple pointRow, pointCol;
HOperatorSet.GetMetrologyObjectMeasures(out contoursDisp, handleID, new HTuple("all"), new HTuple("all"), out pointRow, out pointCol);
//显示指示找线方向的箭头
@@ -293,9 +291,9 @@ namespace FindLineTool
HOperatorSet.GenRegionLine(out drawLine, newExpectLineStartRow, newExpectLineStartCol, newExpectLineEndRow, newExpectLineEndCol);
HOperatorSet.ReduceDomain(inputImage, drawLine, out imageReducedLine);
HOperatorSet.GetRegionPoints(imageReducedLine, out arrowRow, out arrowColumn);
if(arrowRow.Length < 200)
if (arrowRow.Length < 200)
{
CommonMethods.CommonMethods.gen_arrow_contour_xld(out arrow, arrowRow[0], arrowColumn[0], arrowRow[arrowRow.Length-1], arrowColumn[arrowRow.Length - 1], 20, 20);
CommonMethods.CommonMethods.gen_arrow_contour_xld(out arrow, arrowRow[0], arrowColumn[0], arrowRow[arrowRow.Length - 1], arrowColumn[arrowRow.Length - 1], 20, 20);
}
else
{
@@ -326,7 +324,7 @@ namespace FindLineTool
HOperatorSet.AngleLx(ResultLineStartRow, ResultLineStartCol, ResultLineEndRow, ResultLineEndCol, out _angle);
if (softwareRunState == SoftwareRunState.Debug)
{
DispMainWindow(FormFindLine.Instance.myHwindow);
DispMainWindow(FormFindLine.Instance.myHwindow.DispHWindow);
FormFindLine.Instance.tbx_resultStartRow.Text = ResultLineStartRow.ToString();
FormFindLine.Instance.tbx_resultStartCol.Text = ResultLineEndCol.ToString();
FormFindLine.Instance.tbx_resultEndRow.Text = ResultLineEndRow.ToString();
@@ -351,18 +349,18 @@ namespace FindLineTool
}
}
internal void DrawExpectLine(HWindow_Final myHwindow)
internal void DrawExpectLine(HWindow myHwindow)
{
/*
if(inputImage != null)
{
try
{
myHwindow.DrawModel = true;
myHwindow.Focus();
HOperatorSet.SetColor(myHwindow.hWindowControl.HalconWindow, new HTuple("green"));
HOperatorSet.SetColor(myHwindow, new HTuple("green"));
Stopwatch sw = new Stopwatch();
sw.Restart();
HOperatorSet.DrawLineMod(myHwindow.hWindowControl.HalconWindow, newExpectLineStartRow, newExpectLineStartCol, newExpectLineEndRow, newExpectLineEndCol, out expectLineStartRow, out expectLineStartCol, out expectLineEndRow, out expectLineEndCol);
HOperatorSet.DrawLineMod(myHwindow, newExpectLineStartRow, newExpectLineStartCol, newExpectLineEndRow, newExpectLineEndCol, out expectLineStartRow, out expectLineStartCol, out expectLineEndRow, out expectLineEndCol);
if (inputPose != null)
{
@@ -375,7 +373,6 @@ namespace FindLineTool
FormFindLine.Instance.tbx_expectLineStartCol.Text = expectLineStartCol.TupleString("10.3f");
FormFindLine.Instance.tbx_expectLineEndRow.Text = expectLineEndRow.TupleString("10.3f");
FormFindLine.Instance.tbx_expectLineEndCol.Text = expectLineEndCol.TupleString("10.3f");
myHwindow.DrawModel = false;
Run(SoftwareRunState.Debug);
}
@@ -388,7 +385,7 @@ namespace FindLineTool
{
FormFindLine.Instance.SetToolStatus("输入图像为空!", ToolRunStatu.Not_Input_Image);
}
*/
}
/// <summary>
@@ -404,21 +401,23 @@ namespace FindLineTool
FormFindLine.Instance.myToolInfo.toolOutput.Add(new ToolIO("EndPoint.Column", ResultLineEndCol, DataType.IntValue));
}
public void DispMainWindow(HWindow_Final window)
public override void DispMainWindow(HWindow window)
{
// 显示矩形
if (dispRec)
{
window.DispObj(contoursDisp, "blue");
window.SetColor("blue");
window.DispObj(contoursDisp);
}
// 显示交点
if (dispCross)
{
window.DispObj(arrowDisp, "red");
window.DispObj(crossDisp, "orange");
window.SetColor("orange");
window.DispObj(crossDisp);
}
//显示找到的线
window.DispObj(LineDisp, "green");
window.SetColor("green");
window.DispObj(LineDisp);
}
}

View File

@@ -81,12 +81,8 @@
<Project>{7CD50B44-BF56-4E8E-8FA1-05F6968C1835}</Project>
<Name>ToolBase</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\LogForm\LogForm.csproj">
<Project>{6b38d68f-e77b-4761-bde5-a261ea8925dd}</Project>
<Name>LogForm</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\Logger\Logger.csproj">
<Project>{d4e052b9-e541-4b67-a1f9-273073ef1d4b}</Project>
<Project>{D4E052B9-E541-4B67-A1F9-273073EF1D4B}</Project>
<Name>Logger</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.VisionJob\ToolLib.VisionJob.csproj">

View File

@@ -15,6 +15,7 @@ using CommonMethods;
using CommonMethods.Interface;
using FormLib;
using HalconDotNet;
using Logger;
using System;
using System.Collections.Generic;
using System.Drawing;
@@ -38,29 +39,29 @@ namespace FindLineTool
if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null)
{
selectNode.ForeColor = Color.Red;
Logger.LoggerClass.WriteLog(L_toolList[toolIndex].toolName + " 无输入图像", Logger.MsgLevel.Exception);
LoggerClass.WriteLog(L_toolList[toolIndex].toolName + " 无输入图像", MsgLevel.Exception);
}
else
{
string sourceFrom = L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value.ToString();
if (L_toolList[toolIndex].toolInput[j].IOName == "InputImage")
{
string sourceToolName = Regex.Split(sourceFrom, " . ")[0];
sourceToolName = sourceToolName.Substring(3, Regex.Split(sourceFrom, " . ")[0].Length - 3);
string toolItem = Regex.Split(sourceFrom, " . ")[1];
string sourceToolName = Regex.Split(sourceFrom, "->")[0];
sourceToolName = sourceToolName.Substring(3, Regex.Split(sourceFrom, "->")[0].Length - 3);
string toolItem = Regex.Split(sourceFrom, "->")[1];
myFindLine.inputImage = myJob.GetToolInfoByToolName(sourceToolName).GetOutput(toolItem).value as HObject;
}
}
}
myFindLine.Run(SoftwareRunState.Release);
if (myFindLine.toolRunStatu == ToolRunStatu.Succeed)
if (myFindLine.toolRunStatu != ToolRunStatu.Succeed)
{
myFindLine.DispMainWindow(FormImageWindow.Instance.myHWindow);
myJob.FormLogDisp(L_toolList[toolIndex].toolName + " 运行成功", Color.Green, selectNode);
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行失败,失败原因:{myFindLine.runMessage}", Color.Red, selectNode, Logger.MsgLevel.Exception);
}
else
{
myJob.FormLogDisp(L_toolList[toolIndex].toolName + " 运行失败", Color.Red, selectNode, Logger.MsgLevel.Exception);
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myFindLine.runTime}", Color.Green, selectNode);
myFindLine.DispMainWindow(FormImageWindow.Instance.myHWindow.DispHWindow);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,24 +1,36 @@
using System;
using CommonMethods;
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CommonMethods;
using HalconDotNet;
using ChoiceTech.Halcon.Control;
using ViewROI;
namespace FindLineTool
{
public partial class FormFindLine : Form
{
public FindLine myFindLine = null;
public IToolInfo myToolInfo = null;
public HWindow_Final myHwindow = new HWindow_Final();
public IToolInfo myToolInfo = new IToolInfo();
public HWindowTool_Smart myHwindow = new HWindowTool_Smart();
public HDrawingObject selected_drawing_object = new HDrawingObject();
public FormFindLine(ref object findLine)
{
InitializeComponent();
_instance = this;
if (findLine.GetType().FullName != "System.Object")
{
myToolInfo = (IToolInfo)findLine;
myFindLine = (FindLine)myToolInfo.tool;
myFindLine.DispImage();
}
}
/// <summary>
/// 窗体对象实例
/// </summary>
@@ -27,7 +39,7 @@ namespace FindLineTool
{
get
{
if(_instance != null)
if (_instance != null)
{
lock (_instance)
{
@@ -45,69 +57,23 @@ namespace FindLineTool
_instance = new FormFindLine(ref line);
return _instance;
}
}
}
public FormFindLine(ref object findLine)
{
InitializeComponent();
_instance = this;
if(findLine.GetType().FullName != "System.Object")
{
myToolInfo = (IToolInfo)findLine;
myFindLine = (FindLine)myToolInfo.tool;
//myFindLine.inputImage = ComGlobalParams.inputImageGlobal; // 暂时直接将图像传递给该工具
myFindLine.DispImage();
}
}
private void FormFindLine_Load(object sender, EventArgs e)
private void FormFindLine2_Load(object sender, EventArgs e)
{
this.panel1.Controls.Add(myHwindow);
myHwindow.Dock = DockStyle.Fill;
InitTool();
}
private void btn_moveCliperRegion_Click(object sender, EventArgs e)
{
myFindLine.UpdateImage();
myFindLine.DrawExpectLine(myHwindow);
}
private void btn_runFindLineTool_Click(object sender, EventArgs e)
{
// 更改界面中参数,实时更新类中参数
myFindLine.expectLineStartRow = Convert.ToDouble(tbx_expectLineStartRow.Text.Trim());
myFindLine.expectLineStartCol = Convert.ToDouble(tbx_expectLineStartCol.Text.Trim());
myFindLine.expectLineEndRow = Convert.ToDouble(tbx_expectLineEndRow.Text.Trim());
myFindLine.expectLineEndCol = Convert.ToDouble(tbx_expectLineEndCol.Text.Trim());
// 运行参数
myFindLine.minScore = Convert.ToDouble(tbx_minScore.Text.Trim());
myFindLine.cliperNum = Convert.ToInt16(tbx_caliperNum.Text.Trim());
myFindLine.threshold = Convert.ToInt16(tbx_threshold.Text.Trim());
myFindLine.length = Convert.ToInt16(tbx_caliperLength.Text.Trim());
myFindLine.weidth = Convert.ToInt16(tbx_caliperLength2.Text.Trim());
myFindLine.polarity = cbx_polarity.SelectedItem.ToString() == "从明到暗" ? "negative":"positive";
myFindLine.edgeSelect = cbx_edgeSelect.SelectedItem.ToString();
myFindLine.sigma = Convert.ToDouble(tbx_Sigma.Text.Trim());
// Run
myFindLine.Run(SoftwareRunState.Debug);
}
public void InitTool()
private void InitTool()
{
this.Text = myToolInfo.toolName;
btn_runFindLineTool.Focus();
Application.DoEvents();
//myFindLine.Run(); //运行一下,使卡尺显示出来
// myFindLine.Run(); //运行一下,使卡尺显示出来
tbx_expectLineStartRow.Text = myFindLine.expectLineStartRow.ToString();
tbx_expectLineStartCol.Text = myFindLine.expectLineStartCol.ToString();
tbx_expectLineEndRow.Text = myFindLine.expectLineEndRow.ToString();
tbx_expectLineEndCol.Text = myFindLine.expectLineEndCol.ToString();
cbx_edgeSelect.Text = myFindLine.edgeSelect;
tbx_minScore.Text = myFindLine.minScore.ToString();
cbx_polarity.Text = myFindLine.polarity == "positive" ? "从暗到明" : "从明到暗";
@@ -118,6 +84,41 @@ namespace FindLineTool
tbx_caliperLength2.Text = myFindLine.weidth.ToString();
chBDispRec.Checked = myFindLine.dispRec;
chBDispCross.Checked = myFindLine.dispCross;
// 将要编辑的线显示
selected_drawing_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, new HTuple[] { myFindLine.expectLineStartRow, myFindLine.expectLineStartCol, myFindLine.expectLineEndRow, myFindLine.expectLineEndCol });
GC.KeepAlive(selected_drawing_object);
selected_drawing_object.OnSelect(OnSelectDrawingObject);
selected_drawing_object.OnAttach(OnSelectDrawingObject);
selected_drawing_object.OnResize(OnSelectDrawingObject);
selected_drawing_object.OnDrag(OnSelectDrawingObject);
myHwindow.DispHWindow.AttachDrawingObjectToWindow(selected_drawing_object);
}
/// <summary>
/// 参数回调
/// </summary>
/// <param name="dobj"></param>
/// <param name="hwin"></param>
/// <param name="type"></param>
private void OnSelectDrawingObject(HDrawingObject dobj, HWindow hwin, string type)
{
myFindLine.expectLineStartRow = dobj.GetDrawingObjectParams("row1");
myFindLine.expectLineStartCol = dobj.GetDrawingObjectParams("column1");
myFindLine.expectLineEndRow = dobj.GetDrawingObjectParams("row2");
myFindLine.expectLineEndCol = dobj.GetDrawingObjectParams("column2");
}
private void tsbtRunTool_Click(object sender, EventArgs e)
{
// 运行参数
myFindLine.minScore = Convert.ToDouble(tbx_minScore.Text.Trim());
myFindLine.cliperNum = Convert.ToInt16(tbx_caliperNum.Text.Trim());
myFindLine.threshold = Convert.ToInt16(tbx_threshold.Text.Trim());
myFindLine.length = Convert.ToInt16(tbx_caliperLength.Text.Trim());
myFindLine.weidth = Convert.ToInt16(tbx_caliperLength2.Text.Trim());
myFindLine.polarity = cbx_polarity.SelectedItem.ToString() == "从明到暗" ? "negative" : "positive";
myFindLine.edgeSelect = cbx_edgeSelect.SelectedItem.ToString();
myFindLine.sigma = Convert.ToDouble(tbx_Sigma.Text.Trim());
// Run
myFindLine.Run(SoftwareRunState.Debug);
}
/// <summary>
/// 设定工具运行状态
@@ -126,7 +127,7 @@ namespace FindLineTool
/// <param name="status">运行状态</param>
public void SetToolStatus(string msg, ToolRunStatu status)
{
if(myFindLine!=null)
if (myFindLine != null)
{
myFindLine.runMessage = msg;
myFindLine.toolRunStatu = status;
@@ -143,92 +144,18 @@ namespace FindLineTool
}
}
#region
private void tbx_expectLineStartRow_TextChanged(object sender, EventArgs e)
private void DispSetCheck(object sender, EventArgs e)
{
try
{
myFindLine.expectLineStartRow = Convert.ToDouble(tbx_expectLineStartRow.Text.Trim());
}
catch
{
SetToolStatus("输入了非法字符已自动替换为默认值200", ToolRunStatu.Input_Value_Type_Error);
tbx_expectLineStartRow.Text = "200";
}
myFindLine.dispRec = chBDispRec.Checked ? true : false;
myFindLine.dispCross = chBDispCross.Checked ? true : false;
}
private void tbx_expectLineStartCol_TextChanged(object sender, EventArgs e)
{
try
{
myFindLine.expectLineStartCol = Convert.ToDouble(tbx_expectLineStartCol.Text.Trim());
}
catch
{
SetToolStatus("输入了非法字符已自动替换为默认值200", ToolRunStatu.Input_Value_Type_Error);
tbx_expectLineStartCol.Text = "200";
}
}
private void tbx_expectLineEndRow_TextChanged(object sender, EventArgs e)
{
try
{
myFindLine.expectLineEndRow = Convert.ToDouble(tbx_expectLineEndRow.Text.Trim());
}
catch
{
SetToolStatus("输入了非法字符已自动替换为默认值200", ToolRunStatu.Input_Value_Type_Error);
tbx_expectLineEndRow.Text = "200";
}
}
private void tbx_expectLineEndCol_TextChanged(object sender, EventArgs e)
{
try
{
myFindLine.expectLineEndCol = Convert.ToDouble(tbx_expectLineEndCol.Text.Trim());
}
catch
{
SetToolStatus("输入了非法字符已自动替换为默认值600", ToolRunStatu.Input_Value_Type_Error);
tbx_expectLineEndCol.Text = "600";
}
}
private void chBDispRec_CheckedChanged(object sender, EventArgs e)
{
if(chBDispRec.Checked)
{
myFindLine.dispRec = true;
}
else
{
myFindLine.dispRec = false;
}
}
private void chBDispCross_CheckedChanged(object sender, EventArgs e)
{
if(chBDispCross.Checked)
{
myFindLine.dispCross = true;
}
else
{
myFindLine.dispCross = false;
}
}
#endregion
private void FormFindLine_FormClosing(object sender, FormClosingEventArgs e)
private void FormFindLine2_FormClosing(object sender, FormClosingEventArgs e)
{
myHwindow.Dispose();
this.Dispose();
this.Dispose();
GC.Collect();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -32,6 +32,9 @@ G:\VisionEdit\VisionEdit\FindLine\obj\Debug\FindLineTool.FormFindLine.resources
G:\VisionEdit\VisionEdit\FindLine\obj\Debug\FindLineTool.csproj.GenerateResource.Cache
G:\VisionEdit\VisionEdit\FindLine\obj\Debug\FindLineTool.dll
G:\VisionEdit\VisionEdit\FindLine\obj\Debug\FindLineTool.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.FormFindLine.resources
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\log4net.config
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\FindLineTool.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\FindLineTool.pdb
@@ -40,7 +43,6 @@ F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\DataStruct.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\FormLib.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\halcondotnet.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\HWindow_Tool.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\LogForm.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\Logger.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\ToolBase.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\ToolLib.VisionJob.dll
@@ -52,15 +54,11 @@ F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\CommonMethods.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\DataStruct.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\FormLib.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\ToolBase.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\LogForm.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\Logger.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\ToolLib.VisionJob.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\HWindow_Tool.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\halcondotnet.xml
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\WeifenLuo.WinFormsUI.Docking.pdb
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\Newtonsoft.Json.xml
F:\GitHubClone\最新克隆\VisionEdit\FindLine\bin\Debug\DevComponents.DotNetBar2.xml
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.FormFindLine.resources
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.dll
F:\GitHubClone\最新克隆\VisionEdit\FindLine\obj\Debug\FindLineTool.pdb

View File

@@ -1,4 +1,5 @@
using ChoiceTech.Halcon.Control;
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -8,13 +9,14 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ViewROI;
using WeifenLuo.WinFormsUI.Docking;
namespace FormLib
{
public partial class FormImageWindow : DockContent
{
public HWindow_Final myHWindow = new HWindow_Final();
public HWindowTool_Smart myHWindow = new HWindowTool_Smart();
public FormImageWindow()
{
InitializeComponent();

View File

@@ -91,12 +91,8 @@
<Project>{7cd50b44-bf56-4e8e-8fa1-05f6968c1835}</Project>
<Name>ToolBase</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\LogForm\LogForm.csproj">
<Project>{6B38D68F-E77B-4761-BDE5-A261EA8925DD}</Project>
<Name>LogForm</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\Logger\Logger.csproj">
<Project>{d4e052b9-e541-4b67-a1f9-273073ef1d4b}</Project>
<Project>{D4E052B9-E541-4B67-A1F9-273073EF1D4B}</Project>
<Name>Logger</Name>
</ProjectReference>
</ItemGroup>

View File

@@ -1,4 +1,4 @@
using LogForm;
using Logger;
using System;
using System.Collections.Generic;
using System.ComponentModel;

View File

@@ -83,24 +83,6 @@ namespace HalconTool
/// 读取单张图像或批量读取文件夹图像工作模式
/// </summary>
internal WorkMode workMode = WorkMode.ReadMultImage;
public ToolRunStatu toolRunStatu { get; set; } = ToolRunStatu.Not_Run;
/// <summary>
/// 运行过程信息
/// </summary>
public string runMessage { get; set; }
/// <summary>
/// 工具运行时间
/// </summary>
public string runTime { get; set; } = string.Empty;
public HObject inputImage { get; set; } = null;
/// <summary>
/// 运行模式
/// </summary>
public SoftwareRunState softwareRunState { get; set; } = SoftwareRunState.Debug;
public bool ReadImage(out string filePath)
{
@@ -118,7 +100,7 @@ namespace HalconTool
return true;
}
public void Run(SoftwareRunState softwareState)
public override void Run(SoftwareRunState softwareState)
{
Stopwatch sw = new Stopwatch();
sw.Restart();
@@ -130,7 +112,7 @@ namespace HalconTool
}
public void DispImage()
public override void DispImage()
{
HObject image = new HObject();
try
@@ -191,6 +173,11 @@ namespace HalconTool
FormHalconTool.Instance.statusStrip.BackColor = System.Drawing.Color.Red;
}
}
public override void DispMainWindow(HWindow window)
{
throw new NotImplementedException();
}
}

View File

@@ -40,7 +40,7 @@ namespace HalconTool
else
{
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myHalconTool.runTime}", Color.Green, selectNode);
FormImageWindow.Instance.myHWindow.HobjectToHimage(myHalconTool.outputImage);
FormImageWindow.Instance.myHWindow.DispHWindow.DispObj(myHalconTool.outputImage);
}
}
}

View File

@@ -32,6 +32,9 @@ G:\VisionEdit\VisionEdit\HalconTool\obj\Debug\HalconTool.FormHalconTool.resource
G:\VisionEdit\VisionEdit\HalconTool\obj\Debug\HalconTool.csproj.GenerateResource.Cache
G:\VisionEdit\VisionEdit\HalconTool\obj\Debug\HalconTool.dll
G:\VisionEdit\VisionEdit\HalconTool\obj\Debug\HalconTool.pdb
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.FormHalconTool.resources
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\log4net.config
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\HalconTool.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\HalconTool.pdb
@@ -45,7 +48,6 @@ F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\ToolBase.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\ToolLib.VisionJob.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\Newtonsoft.Json.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\WeifenLuo.WinFormsUI.Docking.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\LogForm.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\log4net.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\CommonMethods.pdb
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\FormLib.pdb
@@ -55,10 +57,6 @@ F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\ToolLib.VisionJob.pd
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\HWindow_Tool.pdb
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\DevComponents.DotNetBar2.xml
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\halcondotnet.xml
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\WeifenLuo.WinFormsUI.Docking.pdb
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\LogForm.pdb
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.FormHalconTool.resources
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.csproj.GenerateResource.Cache
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\bin\Debug\Newtonsoft.Json.xml
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.dll
F:\GitHubClone\最新克隆\VisionEdit\HalconTool\obj\Debug\HalconTool.pdb

View File

@@ -64,6 +64,7 @@
this.statusStrip.Size = new System.Drawing.Size(576, 22);
this.statusStrip.TabIndex = 1;
this.statusStrip.Text = "statusStrip1";
this.statusStrip.Visible = false;
//
// lb_Status
//

View File

@@ -14,6 +14,13 @@ namespace ViewROI
{
public bool DispStatus { get; set; }
public HImage hv_Image { get; set; }
public HWindow DispHWindow
{
get
{
return this.SmartWindow.HalconWindow;
}
}
public HWindowTool_Smart()
{
InitializeComponent();
@@ -32,6 +39,7 @@ namespace ViewROI
private void SmartWindow_HMouseMove(object sender, HalconDotNet.HMouseEventArgs e)
{
this.Cursor = e.Button == MouseButtons.Left ? Cursors.Hand : Cursors.Default;
if(DispStatus)
{

View File

@@ -125,7 +125,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk
CAAAAk1TRnQBSQFMAgEBAgEAAQgBAQEIAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAARABAQEQAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

View File

@@ -32,7 +32,6 @@ F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\bin\x64\Debug\HWindow_Tool.dl
F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\bin\x64\Debug\HWindow_Tool.pdb
F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\bin\x64\Debug\halcondotnet.dll
F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\bin\x64\Debug\halcondotnet.xml
F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\obj\x64\Debug\HWindow_Tool.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\obj\x64\Debug\ViewROI.HWindowTool_Smart.resources
F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\obj\x64\Debug\ChoiceTech.Halcon.Control.HWindow_Final.resources
F:\GitHubClone\最新克隆\VisionEdit\ImageWindow\obj\x64\Debug\ViewROI.Properties.Resources.resources

1628
PMAlignTool/FormPMAlignTool.Designer.cs generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,182 @@
using ChoiceTech.Halcon.Control;
using CommonMethods;
using HalconDotNet;
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;
using ViewROI;
namespace PMAlignTool
{
public partial class FormPMAlignTool : Form
{
private PMAlign myPMAlign = null;
private IToolInfo myToolInfo = null;
public HWindowTool_Smart myHwindow = new HWindowTool_Smart();
private HDrawingObject selected_drawing_object = new HDrawingObject();
private List<HDrawingObject> templateModelListAdd = new List<HDrawingObject>() { };
private List<HDrawingObject> templateModelListSub = new List<HDrawingObject>() { };
public FormPMAlignTool(ref object pmalign)
{
InitializeComponent();
_instance = this;
if (pmalign.GetType().FullName != "System.Object")
{
myToolInfo = (IToolInfo)pmalign;
myPMAlign = (PMAlign)myToolInfo.tool;
myPMAlign.DispImage();
}
}
/// <summary>
/// 窗体对象实例
/// </summary>
private static FormPMAlignTool _instance;
public static FormPMAlignTool Instance
{
get
{
if (_instance != null)
{
lock (_instance)
{
if (_instance == null)
{
object pmalign = new object();
_instance = new FormPMAlignTool(ref pmalign);
}
return _instance;
}
}
else
{
object pmalign = new object();
_instance = new FormPMAlignTool(ref pmalign);
return _instance;
}
}
}
private void FormPMAlignTool_Load(object sender, EventArgs e)
{
this.panel1.Controls.Add(myHwindow);
myHwindow.Dock = DockStyle.Fill;
InitTool();
}
private void InitTool()
{
cNumErosionValue1.Value = myPMAlign.imageProcess.erosionValue1.algValue;
cbCErosion1.Checked = myPMAlign.imageProcess.erosionValue1.isEnable;
cNumDilationValue2.Value = myPMAlign.imageProcess.dilationValue.algValue;
cbCDilation1.Checked = myPMAlign.imageProcess.dilationValue.isEnable;
cNumErosionValue2.Value = myPMAlign.imageProcess.erosionValue2.algValue;
cbCErosion2.Checked = myPMAlign.imageProcess.erosionValue2.isEnable;
}
private void btnAcqNewModelImage_Click(object sender, EventArgs e)
{
if (myPMAlign.inputImage != null)
{
myPMAlign.oldTrainImage = myPMAlign.inputImage;
}
}
private ShapeMode selectType;
private void btnOperateROI_Click(object sender, EventArgs e)
{
HDrawingObject temp_object = new HDrawingObject();
temp_object.ClearDrawingObject();
Button btnClick = sender as Button;
selectType = (ShapeMode)Enum.Parse(typeof(ShapeMode), btnClick.Tag.ToString());
switch (selectType)
{
case ShapeMode.RECTANGLE1:
temp_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, new HTuple[] { 100, 100, 300, 400 });
break;
case ShapeMode.RECTANGLE2:
temp_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE2, new HTuple[] { 200, 200, 0, 100,300 });
break;
case ShapeMode.CIRCLE:
temp_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, new HTuple[] { 200, 200, 100 });
break;
case ShapeMode.ELLIPSE:
break;
case ShapeMode.Other:
break;
default:
break;
}
GC.KeepAlive(temp_object);
temp_object.OnSelect(OnSelectDrawingObject);
temp_object.OnAttach(OnSelectDrawingObject);
temp_object.OnResize(OnSelectDrawingObject);
temp_object.OnDrag(OnSelectDrawingObject);
myHwindow.DispHWindow.AttachDrawingObjectToWindow(temp_object);
if(rdo_templateRegionAdd.Checked)
{
templateModelListAdd.Add(temp_object);
}
else
{
templateModelListSub.Add(temp_object);
}
}
/// <summary>
/// 参数回调
/// </summary>
/// <param name="dobj"></param>
/// <param name="hwin"></param>
/// <param name="type"></param>
private void OnSelectDrawingObject(HDrawingObject dobj, HWindow hwin, string type)
{
HObject selectObj = dobj.GetDrawingObjectIconic();
myPMAlign.templateRegion = selectObj.Clone();
switch (selectType)
{
case ShapeMode.RECTANGLE1:
break;
case ShapeMode.RECTANGLE2:
break;
case ShapeMode.CIRCLE:
break;
case ShapeMode.ELLIPSE:
break;
case ShapeMode.Other:
break;
default:
break;
}
selectObj.Dispose();
}
private void btnCreateModel_Click(object sender, EventArgs e)
{
if(myPMAlign.modelID == -1)
{
myPMAlign.oldTrainImage = myPMAlign.inputImage;
}
}
private void PreProcess_CheckChanged(object sender, EventArgs e)
{
myPMAlign.imageProcess.erosionValue1.isEnable = cbCErosion1.Checked;
myPMAlign.imageProcess.dilationValue.isEnable = cbCDilation1.Checked;
myPMAlign.imageProcess.erosionValue2.isEnable = cbCErosion2.Checked;
}
private void PreValueChanged(double value)
{
myPMAlign.imageProcess.erosionValue1.algValue = cNumErosionValue1.Value;
myPMAlign.imageProcess.dilationValue.algValue = cNumDilationValue2.Value;
myPMAlign.imageProcess.erosionValue2.algValue = cNumErosionValue2.Value;
}
}
}

File diff suppressed because it is too large Load Diff

160
PMAlignTool/PMAlign.cs Normal file
View File

@@ -0,0 +1,160 @@
/*
* ==============================================================================
*
* Filename: PMAlign
* Description:
*
* Version: 1.0
* Created: 2021/3/30 14:07:10
*
* Author: liu.wenjie
*
* ==============================================================================
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CommonMethods;
using HalconDotNet;
using ToolBase;
using static DataStruct.DataStruct;
namespace PMAlignTool
{
[Serializable]
public class PMAlign:IToolBase
{
/// <summary>
/// 是否显示匹配到的模板
/// </summary>
internal bool showTemplate { get; set; } = true;
/// <summary>
/// 是否显示中心十字架
/// </summary>
internal bool showCross { get; set; } = true;
/// <summary>
/// 是否显示特征
/// </summary>
internal bool showFeature { get; set; } = true;
/// <summary>
/// 显示结果序号
/// </summary>
internal bool showIndex { get; set; } = true;
/// <summary>
/// 是否显示搜索区域
/// </summary>
internal bool showSearchRegion { get; set; } = true;
/// <summary>
/// 模板句柄
/// </summary>
internal HTuple modelID { get; set; } = -1;
/// <summary>
/// 行列间隔像素数
/// </summary>
internal int spanPixelNum { get; set; } = 100;
/// <summary>
/// 排序模式
/// </summary>
// internal SortMode sortMode = SortMode.从上至下且从左至右;
/// <summary>
/// 模板区域
/// </summary>
internal HObject templateRegion { get; set; }
/// <summary>
/// 在进行模板创建及匹配时进行的图像预处理
/// </summary>
public ImagePreProcess imageProcess { get; set; } = new ImagePreProcess();
internal HObject totalRegion;
/// <summary>
/// 搜索区域图像
/// </summary>
internal HObject reducedImage;
/// <summary>
/// 最小匹配分数
/// </summary>
internal double minScore { get; set; } = 0.5;
/// <summary>
/// 匹配个数
/// </summary>
internal int matchNum { get; set; } = 1;
/// <summary>
/// 起始角度
/// </summary>
internal int startAngle { get; set; } = -30;
/// <summary>
/// 角度范围
/// </summary>
internal int angleRange { get; set; } = 30;
/// <summary>
/// 角度步长
/// </summary>
internal int angleStep { get; set; } = 1;
/// <summary>
/// 对比度
/// </summary>
internal int contrast { get; set; } = 30;
/// <summary>
/// 训练时所使用的模板图像,不点击获取图像时,不进行更新
/// </summary>
public HObject oldTrainImage { get; set; }
internal void DispMainWindow(object dispHWindow)
{
throw new NotImplementedException();
}
/// <summary>
/// 极性
/// </summary>
internal string polarity { get; set; } = "use_polarity";
/// <summary>
/// 工具锁
/// </summary>
private object obj { get; set; } = new object();
/// <summary>
/// 模板匹配结果
/// </summary>
internal List<XYU> L_result = new List<XYU>();
public override void Run(SoftwareRunState softwareRunState)
{
}
public override void DispImage()
{
if (inputImage != null)
{
FormPMAlignTool.Instance.myHwindow.DispHWindow.DispObj(inputImage);
}
}
public override void DispMainWindow(HWindow window)
{
throw new NotImplementedException();
}
public void CreateModelTemplate()
{
}
}
[Serializable]
public class ImagePreProcess
{
public ProcessAlg erosionValue1 { get; set; } = new ProcessAlg();
public ProcessAlg dilationValue { get; set; } = new ProcessAlg();
public ProcessAlg erosionValue2 { get; set; } = new ProcessAlg();
}
[Serializable]
public class ProcessAlg
{
public double algValue { get; set; } = 0;
public bool isEnable { get; set; } = false;
}
}

View File

@@ -4,14 +4,13 @@
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{6B38D68F-E77B-4761-BDE5-A261EA8925DD}</ProjectGuid>
<ProjectGuid>{C1C08195-2EC8-42E9-93BB-D5331E6C6687}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LogForm</RootNamespace>
<AssemblyName>LogForm</AssemblyName>
<RootNamespace>PMAlignTool</RootNamespace>
<AssemblyName>PMAlignTool</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -31,9 +30,17 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Controls">
<HintPath>..\UsingControl\Controls\obj\Debug\Controls.dll</HintPath>
</Reference>
<Reference Include="halcondotnet">
<HintPath>C:\Program Files\MVTec\HALCON-19.05-Progress\bin\dotnet20\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.Runtime.Serialization.Formatters.Soap" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@@ -43,37 +50,59 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DetailMesForm.cs">
<Compile Include="FormPMAlignTool.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DetailMesForm.Designer.cs">
<DependentUpon>DetailMesForm.cs</DependentUpon>
<Compile Include="FormPMAlignTool.Designer.cs">
<DependentUpon>FormPMAlignTool.cs</DependentUpon>
</Compile>
<Compile Include="PMAlign.cs" />
<Compile Include="PMAlignToolRun.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UserLogger.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UserLogger.Designer.cs">
<DependentUpon>UserLogger.cs</DependentUpon>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="DetailMesForm.resx">
<DependentUpon>DetailMesForm.cs</DependentUpon>
<EmbeddedResource Include="FormPMAlignTool.resx">
<DependentUpon>FormPMAlignTool.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UserLogger.resx">
<DependentUpon>UserLogger.cs</DependentUpon>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Common.ParamsList\EnumList\EnumList.csproj">
<Project>{bec2389f-b8b4-4e8a-8c71-189cde14e962}</Project>
<Name>EnumList</Name>
<ProjectReference Include="..\CommonMethods\CommonHelper.csproj">
<Project>{1C8D0DDC-2086-48A9-9586-F2B643E2FC54}</Project>
<Name>CommonHelper</Name>
</ProjectReference>
<ProjectReference Include="..\Logger\Logger.csproj">
<Project>{d4e052b9-e541-4b67-a1f9-273073ef1d4b}</Project>
<ProjectReference Include="..\DataStruct\DataStruct.csproj">
<Project>{DF3D4D4C-02DF-4F92-9FD4-0A861F64B0EF}</Project>
<Name>DataStruct</Name>
</ProjectReference>
<ProjectReference Include="..\FormLib\FormLib.csproj">
<Project>{8C6FC8C6-8874-494B-8260-071F291AA33D}</Project>
<Name>FormLib</Name>
</ProjectReference>
<ProjectReference Include="..\ImageWindow\HWindow_Tool.csproj">
<Project>{9BAA53FD-89B5-43E2-AC59-A27B006DEBB6}</Project>
<Name>HWindow_Tool</Name>
</ProjectReference>
<ProjectReference Include="..\ToolBase\ToolBase.csproj">
<Project>{7CD50B44-BF56-4E8E-8FA1-05F6968C1835}</Project>
<Name>ToolBase</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\Logger\Logger.csproj">
<Project>{D4E052B9-E541-4B67-A1F9-273073EF1D4B}</Project>
<Name>Logger</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.VisionJob\ToolLib.VisionJob.csproj">
<Project>{16E8FF17-98A8-4452-AB9E-C433DC9C21F7}</Project>
<Name>ToolLib.VisionJob</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -0,0 +1,68 @@
/*
* ==============================================================================
*
* Filename: PMAlignToolRun
* Description:
*
* Version: 1.0
* Created: 2021/3/30 11:05:40
*
* Author: liu.wenjie
*
* ==============================================================================
*/
using CommonMethods.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CommonMethods;
using System.Windows.Forms;
using ToolLib.VisionJob;
using System.Drawing;
using System.Text.RegularExpressions;
using HalconDotNet;
using FormLib;
using Logger;
namespace PMAlignTool
{
public class PMAlignToolRun : IToolRun
{
public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List<IToolInfo> L_toolList)
{
PMAlign myPMAlign = (PMAlign)L_toolList[toolIndex].tool;
VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName];
for (int j = 0; j < inputItemNum; j++)
{
if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null)
{
selectNode.ForeColor = Color.Red;
LoggerClass.WriteLog(L_toolList[toolIndex].toolName + " 无输入图像", MsgLevel.Exception);
}
else
{
string sourceFrom = L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value.ToString();
if (L_toolList[toolIndex].toolInput[j].IOName == "InputImage")
{
string sourceToolName = Regex.Split(sourceFrom, "->")[0];
sourceToolName = sourceToolName.Substring(3, Regex.Split(sourceFrom, "->")[0].Length - 3);
string toolItem = Regex.Split(sourceFrom, "->")[1];
myPMAlign.inputImage = myJob.GetToolInfoByToolName(sourceToolName).GetOutput(toolItem).value as HObject;
}
}
}
myPMAlign.Run(SoftwareRunState.Release);
if (myPMAlign.toolRunStatu != ToolRunStatu.Succeed)
{
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行失败,失败原因:{myPMAlign.runMessage}", Color.Red, selectNode, Logger.MsgLevel.Exception);
}
else
{
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myPMAlign.runTime}", Color.Green, selectNode);
myPMAlign.DispMainWindow(FormImageWindow.Instance.myHWindow.DispHWindow);
}
}
}
}

View File

@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("LogForm")]
[assembly: AssemblyTitle("PMAlignTool")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LogForm")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyProduct("PMAlignTool")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -20,7 +20,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("6b38d68f-e77b-4761-bde5-a261ea8925dd")]
[assembly: Guid("c1c08195-2ec8-42e9-93bb-d5331e6c6687")]
// 程序集的版本信息由下列四个值组成:
//

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace PMAlignTool.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PMAlignTool.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -8,14 +8,16 @@ using HalconDotNet;
namespace ToolBase
{
public interface IToolBase
[Serializable]
public abstract class IToolBase
{
SoftwareRunState softwareRunState { get; set; }
ToolRunStatu toolRunStatu { get; set; }
string runMessage { get; set; }
string runTime { get; set; }
void Run(SoftwareRunState softwareRunState);
HObject inputImage { get; set; }
void DispImage();
public ToolRunStatu toolRunStatu { get; set; } = ToolRunStatu.Not_Run;
public SoftwareRunState softwareRunState { get; set; } = SoftwareRunState.Debug;
public string runMessage { get; set; }
public string runTime { get; set; }
public abstract void Run(SoftwareRunState softwareRunState);
public HObject inputImage { get; set; }
public abstract void DispImage();
public abstract void DispMainWindow(HWindow window);
}
}

View File

@@ -14,6 +14,7 @@ F:\GitHubClone\最新克隆\VisionEdit\ToolBase\bin\Debug\halcondotnet.dll
F:\GitHubClone\最新克隆\VisionEdit\ToolBase\bin\Debug\Newtonsoft.Json.dll
F:\GitHubClone\最新克隆\VisionEdit\ToolBase\bin\Debug\CommonMethods.pdb
F:\GitHubClone\最新克隆\VisionEdit\ToolBase\bin\Debug\halcondotnet.xml
F:\GitHubClone\最新克隆\VisionEdit\ToolBase\bin\Debug\Newtonsoft.Json.xml
F:\GitHubClone\最新克隆\VisionEdit\ToolBase\obj\Debug\ToolBase.csprojResolveAssemblyReference.cache
F:\GitHubClone\最新克隆\VisionEdit\ToolBase\obj\Debug\ToolBase.dll
F:\GitHubClone\最新克隆\VisionEdit\ToolBase\obj\Debug\ToolBase.pdb

View File

@@ -1,137 +0,0 @@
namespace LogForm
{
partial class DetailMesForm
{
/// <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.btnClose = new System.Windows.Forms.Button();
this.Rtb_DetailMes = new System.Windows.Forms.RichTextBox();
this.lb_Level = new System.Windows.Forms.Label();
this.lb_Time = new System.Windows.Forms.Label();
this.lb_Detail = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// btnClose
//
this.btnClose.Location = new System.Drawing.Point(427, 334);
this.btnClose.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(99, 33);
this.btnClose.TabIndex = 9;
this.btnClose.Text = "关闭";
this.btnClose.UseVisualStyleBackColor = true;
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
//
// Rtb_DetailMes
//
this.Rtb_DetailMes.Location = new System.Drawing.Point(29, 140);
this.Rtb_DetailMes.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.Rtb_DetailMes.Name = "Rtb_DetailMes";
this.Rtb_DetailMes.Size = new System.Drawing.Size(503, 182);
this.Rtb_DetailMes.TabIndex = 8;
this.Rtb_DetailMes.Text = "";
//
// lb_Level
//
this.lb_Level.AutoSize = true;
this.lb_Level.Location = new System.Drawing.Point(110, 57);
this.lb_Level.Name = "lb_Level";
this.lb_Level.Size = new System.Drawing.Size(0, 17);
this.lb_Level.TabIndex = 3;
//
// lb_Time
//
this.lb_Time.AutoSize = true;
this.lb_Time.Location = new System.Drawing.Point(110, 16);
this.lb_Time.Name = "lb_Time";
this.lb_Time.Size = new System.Drawing.Size(0, 17);
this.lb_Time.TabIndex = 4;
//
// lb_Detail
//
this.lb_Detail.AutoSize = true;
this.lb_Detail.Location = new System.Drawing.Point(25, 100);
this.lb_Detail.Name = "lb_Detail";
this.lb_Detail.Size = new System.Drawing.Size(79, 17);
this.lb_Detail.TabIndex = 5;
this.lb_Detail.Text = "Log详细信息";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(25, 57);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(67, 17);
this.label3.TabIndex = 6;
this.label3.Text = "Log级别";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(25, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 17);
this.label1.TabIndex = 7;
this.label1.Text = "时间:";
//
// DetailMesForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(544, 381);
this.ControlBox = false;
this.Controls.Add(this.btnClose);
this.Controls.Add(this.Rtb_DetailMes);
this.Controls.Add(this.lb_Level);
this.Controls.Add(this.lb_Time);
this.Controls.Add(this.lb_Detail);
this.Controls.Add(this.label3);
this.Controls.Add(this.label1);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.Name = "DetailMesForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Load += new System.EventHandler(this.DetailMesForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnClose;
private System.Windows.Forms.RichTextBox Rtb_DetailMes;
private System.Windows.Forms.Label lb_Level;
private System.Windows.Forms.Label lb_Time;
private System.Windows.Forms.Label lb_Detail;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label1;
}
}

View File

@@ -1,44 +0,0 @@
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 LogForm
{
public partial class DetailMesForm : Form
{
private string detailMsg = string.Empty;
public DetailMesForm(string detailMsg)
{
InitializeComponent();
this.detailMsg = detailMsg;
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
private void DetailMesForm_Load(object sender, EventArgs e)
{
try
{
string time = detailMsg.Split('>')[0];
string level = detailMsg.Split(',')[0].Split('>')[1];
lb_Time.Text = time;
lb_Level.Text = level;
Rtb_DetailMes.Text = detailMsg;
}
catch (Exception)
{
Rtb_DetailMes.Text = detailMsg;
}
}
}
}

View File

@@ -1,91 +0,0 @@
namespace LogForm
{
partial class UserLogger
{
/// <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.listBox1 = new System.Windows.Forms.ListBox();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.ClearLog = new System.Windows.Forms.ToolStripMenuItem();
this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.BackColor = System.Drawing.SystemColors.Info;
this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.listBox1.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.listBox1.FormattingEnabled = true;
this.listBox1.HorizontalScrollbar = true;
this.listBox1.ItemHeight = 18;
this.listBox1.Location = new System.Drawing.Point(0, 0);
this.listBox1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(365, 266);
this.listBox1.TabIndex = 0;
this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);
this.listBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDoubleClick);
//
// contextMenuStrip1
//
this.contextMenuStrip1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ClearLog});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(107, 28);
//
// ClearLog
//
this.ClearLog.Name = "ClearLog";
this.ClearLog.Size = new System.Drawing.Size(106, 24);
this.ClearLog.Text = "清空";
this.ClearLog.Click += new System.EventHandler(this.ClearLog_Click);
//
// UserLogger
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.Controls.Add(this.listBox1);
this.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Name = "UserLogger";
this.Size = new System.Drawing.Size(365, 266);
this.Load += new System.EventHandler(this.UserLogger_Load);
this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem ClearLog;
}
}

View File

@@ -1,160 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using Logger;
using System.Threading.Tasks;
using System.IO;
using System.Collections.Generic;
namespace LogForm
{
public partial class UserLogger : UserControl
{
bool logFocus = true;
string logDictory = @"C:\MyCCDSystem\Log\";
public UserLogger()
{
InitializeComponent();
}
~UserLogger()
{
logFocus = false;
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index < 0)
{ return; }
else
{
e.DrawBackground();
Brush mybsh = Brushes.Black;
// 判断是什么类型的标签,在调用时必须信息前边标注信息的类别分为InfoWarningError
try
{
MsgLevel msgLevel = (MsgLevel)Enum.Parse(typeof(MsgLevel), listBox1.Items[e.Index].ToString().Split('>')[1].Trim().Split(',')[0]);
switch (msgLevel)
{
case MsgLevel.Info:
mybsh = Brushes.Green;
break;
case MsgLevel.Debug:
mybsh = Brushes.Green;
break;
case MsgLevel.Warn:
mybsh = Brushes.Purple;
break;
case MsgLevel.Exception:
case MsgLevel.Fatal:
mybsh = Brushes.Red;
break;
default:
mybsh = Brushes.Black;
break;
}
}
catch (Exception)
{
mybsh = Brushes.Green;
}
e.DrawFocusRectangle();
e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, mybsh, e.Bounds, StringFormat.GenericDefault);
}
}
public void AddLog(MsgLevel msgLog, string logInfo)
{
try
{
this.Invoke((MethodInvoker)delegate
{
string recordMsg = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} -> {msgLog.ToString()}, {logInfo}";
listBox1.Items.Add(recordMsg);
WriteLog(recordMsg);
listBox1.SelectedIndex = listBox1.Items.Count - 1;
if (listBox1.Items.Count > 1000)
{
listBox1.Items.Clear();
}
Application.DoEvents();
});
}
catch(Exception)
{
}
}
public void AddLog(MsgLevel msgLog, string logInfo, Exception ex)
{
try
{
this.Invoke((MethodInvoker)delegate
{
listBox1.Items.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " -> " + msgLog.ToString() + "," + logInfo + ex);
listBox1.SelectedIndex = listBox1.Items.Count - 1;
WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " -> " + msgLog.ToString() + "," + logInfo + ex);
if(listBox1.Items.Count >1000)
{
listBox1.Items.Clear();
}
Application.DoEvents();
});
}
catch (Exception)
{
}
}
public void WriteLog(string msg)
{
string time = DateTime.Now.ToString("HH:mm:ss.fff");
if (!Directory.Exists(logDictory))
{
Directory.CreateDirectory(logDictory);
}
string runningLogFileName = logDictory + DateTime.Now.ToString("yyyyMMdd") + ".log";
StreamWriter mySW = new StreamWriter(runningLogFileName, true);
mySW.WriteLine(msg);
mySW.Close();
}
private void UserLogger_Load(object sender, EventArgs e)
{
Task startLogFocus = new Task(() =>
{
while (logFocus)
{
if (LoggerClass.logQueue.Count > 0)
{
LogInfo log = LoggerClass.logQueue.Dequeue();
if (log.ex != null)
{
AddLog(log.logLevel, log.message, log.ex);
}
else
{
AddLog(log.logLevel, log.message);
}
}
}
});
startLogFocus.Start();
}
private void ClearLog_Click(object sender, EventArgs e)
{
this.listBox1.Items.Clear();
}
private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if(listBox1.SelectedIndex != -1)
{
string detalText = listBox1.SelectedItem.ToString();
DetailMesForm myForm = new DetailMesForm(detalText);
myForm.Show();
}
}
}
}

View File

@@ -37,6 +37,9 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@@ -46,8 +49,25 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="LogDetail.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="LogDetail.Designer.cs">
<DependentUpon>LogDetail.cs</DependentUpon>
</Compile>
<Compile Include="LoggerClass.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="UserLogger.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UserLogger.Designer.cs">
<DependentUpon>UserLogger.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="log4net.config">
@@ -60,6 +80,22 @@
<Name>EnumList</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="LogDetail.resx">
<DependentUpon>LogDetail.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<SubType>Designer</SubType>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="UserLogger.resx">
<DependentUpon>UserLogger.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="Resources\Log.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -10,12 +10,14 @@ namespace Logger
{
public class LoggerClass
{
public static readonly ILog loginfo = LogManager.GetLogger("loginfo");
public static readonly ILog logerror = LogManager.GetLogger("logerror");
private static readonly ILog loginfo = LogManager.GetLogger("loginfo");
private static readonly ILog logerror = LogManager.GetLogger("logerror");
/// <summary>
/// Log队列
/// </summary>
public static Queue<LogInfo> logQueue { get; set; } = new Queue<LogInfo>() { };
public static void WriteLog(string info, bool ShowMsgBox = false)
{
if (loginfo.IsInfoEnabled)
@@ -65,33 +67,11 @@ namespace Logger
}
}
}
public class LogInfo
{
public string message { get; set; }
public MsgLevel logLevel { get; set; }
public Exception ex { get; set; }
}
public enum MsgLevel
{
/// <summary>
/// 0.调试信息输出
/// </summary>
Debug = 0,
/// <summary>
/// 1.业务信息记录
/// </summary>
Info = 1,
/// <summary>
/// 2.警告提醒(捕获的业务异常)
/// </summary>
Warn = 2,
/// <summary>
/// 3.发生了异常(捕获的系统异常)
/// </summary>
Exception = 3,
/// <summary>
/// 4.发生致命异常(未被捕获的异常|捕获的业务逻辑异常)
/// </summary>
Fatal = 4
}
}

View File

@@ -105,14 +105,20 @@
treeNode7.Text = "平滑";
treeNode8.Name = "节点7";
treeNode8.Text = "去噪";
treeNode9.ImageKey = "图像预处理_32.png";
treeNode9.Name = "节点4";
treeNode9.SelectedImageKey = "图像预处理_32.png";
treeNode9.Text = "图像预处理";
treeNode10.Name = "节点9";
treeNode10.ImageIndex = 9;
treeNode10.Name = "PMAlign";
treeNode10.SelectedImageKey = "匹配.ico";
treeNode10.Tag = "PMAlignTool";
treeNode10.Text = "形状匹配";
treeNode11.Name = "节点10";
treeNode11.Text = "可变形匹配";
treeNode12.Name = "节点11";
treeNode12.Text = "灰度匹配";
treeNode13.ImageKey = "文件夹.png";
treeNode13.Name = "节点8";
treeNode13.Text = "匹配";
treeNode14.ImageKey = "Line.png";
@@ -129,7 +135,9 @@
treeNode16.SelectedImageKey = "卡尺.png";
treeNode16.Tag = "Caliper";
treeNode16.Text = "卡尺";
treeNode17.ImageKey = "几何_32.png";
treeNode17.Name = "节点0";
treeNode17.SelectedImageKey = "几何_32.png";
treeNode17.Text = "几何";
this.tvw_ToolBox.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
treeNode1,
@@ -156,6 +164,15 @@
this.imageList1.Images.SetKeyName(5, "Line.png");
this.imageList1.Images.SetKeyName(6, "Circle.png");
this.imageList1.Images.SetKeyName(7, "卡尺.png");
this.imageList1.Images.SetKeyName(8, "模板.ico");
this.imageList1.Images.SetKeyName(9, "匹配.ico");
this.imageList1.Images.SetKeyName(10, "start.ico");
this.imageList1.Images.SetKeyName(11, "复位.png");
this.imageList1.Images.SetKeyName(12, "开始.png");
this.imageList1.Images.SetKeyName(13, "删除.png");
this.imageList1.Images.SetKeyName(14, "停止.png");
this.imageList1.Images.SetKeyName(15, "几何_32.png");
this.imageList1.Images.SetKeyName(16, "图像预处理_32.png");
//
// richTextBoxEx1
//
@@ -186,6 +203,8 @@
this.imageListTool.Images.SetKeyName(6, "line.png");
this.imageListTool.Images.SetKeyName(7, "Circle.png");
this.imageListTool.Images.SetKeyName(8, "卡尺.png");
this.imageListTool.Images.SetKeyName(9, "匹配.ico");
this.imageListTool.Images.SetKeyName(10, "模板.ico");
//
// splitContainer1
//

View File

@@ -124,9 +124,9 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA8
FgAAAk1TRnQBSQFMAgEBCAEAAUABAAFAAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABgAMAAWADAAEBAQABCAYAATAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABs
LAAAAk1TRnQBSQFMAgEBEQEAAVgBAAFYAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABgAMAAaADAAEBAQABCAYAAVAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
@@ -153,73 +153,168 @@
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8A/wA0AAHzA1ooAAHzA1owAAH2G1kEAAHzAVoBAAFaJgAEWgEABFoUAAFs
AfQB8xYAHVkDAAHzA1ojAAH/AloB9AEAAfMDWgIAAQgCWhEAAWwB9AFmFwAdWQQAAvMBwgFaIQABngFa
Af8EAAPzBAABwgFaAf8OAAFsAvQB/wMAAf8BrhIAHVkHAAH0AVofAAJaDwABWgHCDAABbAL0AWYEAAFs
AbUSAB1ZCAAB/wFaHQAB5AFaEQABWgH/CgABbAL0AWYEAAHyAfQBkRIAHVkJAAH/AVobAAH/AVoTAAFa
CQAB7gL0Aa4FAAHtAfQBZhIAHVkKAAH0AVoaAAFaFAABwgFaCAAB9wL0AWYEAAHsAvQB8xIAHVkLAAH0
AVoYAAH/AVoVAAFaBwABbAT0Ae4B9wIAAWYC9BMAHVkMAAH/AVoXAAFaFgABCAFaBgAE9AH3AWwB8wFs
AWYBCQFmAa4TAB1ZDQAB/wFaFgABWhcAAVoFAAGuAfMF9AHzAWwB/wHxAgkBbBIAHVkOAAH0AVoVAAFa
FwABWgYAAWYC9AFsBPQB7gGuAf8BrgEJAZEBvBAAHVkPAAH0AVoSAAHzA1oUAAHzA1oEAAH/AfQBZgIA
AWwBkQL0AfAB9AGuAfEB/wGuAQkBbAFtAbsB7QwAHVkQAAH/AVoRAAHzAVoBAAFaFAAB8wFaAQABWgQA
AWwB8QIAAQcBCQG7AWwD9AGuAfQBZgL/AgkCZgwAHVkRAAH/AVoQAAHzA1oUAAHzA1oDAAHzAWYB/wIA
ApEBAAFmAWwBCQFmAvQBrgEHAWYB/wHvAWwBuwH3CwAdWRIAAfQBWhAAAfMBWgHzFQAB8wFaAfMHAAHz
AQkBBwIAAW0B9AFsAbsBrgL0AbUBbAH3Af8BrgHwCwAdWRMAAfQBWhAAAVoXAAFaCAAB8wFsBQABZgH/
AZEBrgEHAvQB8wNmCwAdWRQAAf8BWg8AAVoWAAH0AVoNAAGSAf8BZgH/AWwB/wEJAWYE9AHwAWwBZgkA
ATEbWQExFQAB/wFaDgABngFaFQABWg8AAWYB/wIAAfcBvAHtAQkBZgH0AfID9AGRAfAHAAMxAVgV/wQx
FgAB9AFaDgABWhQAAf8BWhUAAWwB/wFsAa4G9AFsAf8FAAMxAVgV/wQxFwAB9AFaDQABGwFaEwABWgH/
FgAB/wHzAQABrgHwBvQBbAQAHTEYAAH/AVoNAAJaEQABWgGeHAABZgb0AfIBrgIAGzEBeRoAAf8BWg0A
AloPAAJaHwABbAX0AWYCABIxJQAB9AFaDQACWg0AAVoB5CEAAbwBkgL0AfMDABExAZkmAAHCA1oLAAEb
AloCAAHzA1oDAAJaAf8kAAFsAfQBbAMAETEnAAHzAVoBAAFaDQABngRaAQAEWgH/ZAAB8wNaEAAB8wNa
aQAD8xEAA/P/ADYAAbMQAAH/AbttAAGyEQABsmwAAbIBCQGyAgkBswIJAboCCQG7BwkBugGzagAC/wEA
AbMCAAEJAgAB8wIAAf8IAAEJagAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZCQAB/wUJAfQCAAEZBQkB/wIA
BgkUAAuyAbMGAB30BgAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZCQAB/wUJAfQCAAEZBQkB/wIABgkTAAEJ
DLIFAB+KBQAB/wKzAbISswkAAf8CCQH/AgkB9AIAARkBCQEZAf8CCQH/AgADCQH/AfIBCQoAAbMKsgH0
CAABugGyBAABtAGKAWUCuxoZAYoFAAH/FAABGQkAAf8CCQEAAgkB9AIAARkBCQHzAQACCQH/AgADCQEA
AfMBCQkAAfMBswgAAboBsgH0CAABugGyBAABswGKAmUCuxkZAYoFAAH/FAABGQkAAf8FCQH0AgABGQUJ
Af8CAAYJCQABugH0CAABCQyyBAABswGKAbsCZQG7AQkYGQGKBQAB/xQAARkJAAH/BQkB9AIAARkFCQH/
AgAGCQkAAboB9AkADLIEAAGzAYoBuwEZAmUBuwEJCRkBCQwZAbsBigUAAf8UAAEZCgAB/wIJAv8DAAL/
AwkB/wMAAv8CCQHzAf8JAAG6AfQZAAGzAYoBuwIZAmUBuwgZArsLGQEJAWUBigUAAf8UAAEZCwACCQcA
AwkGAAIJAfQKAAG6AfQZAAGzAYoBuwMZAmUBuwYZAbsCZQG7ChkCZQGKBQAB/xQAARkLAAIJB/8DCQb/
AgkB9AoAAboB9AkAC7IBswQAAbMBigG7BBkCZQG7BRkBZgJlAWYBCQgZAbsBZQEZAYoFAAH/FAABGQsA
FAkB9AoAAboB9AgAAQkMsgQAAbMBigG7BRkCZQG7AxkBuwFlAWYBkQFlAbsHGQEJAmUBGQGKBQAB/xQA
ARkLABQJAfQKAAG6AfQEAAT0AbMBsgH0CAABugGyBAABswGKAbsGGQFlAWYBuwEJAbsCZQIZAWUBZgEJ
BhkBZgFlAhkBigUAAf8VshQAAfMCCRMAAboB9AIACLIB9AgAAboBsgQAAbMBigG7BhkBuwJlAbsCZQMZ
AQkBZQG7BRkBuwFlAWwCGQGKBQAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZFAAB8wIJEwABugH0AgABsgUA
AQkMsgQAAbMBigG7BxkBtQNlBRkCZQG7AxkBCQJlAxkBigUAAf8CAAGzAgABCQIAAfMCAAH/CAABGQ0A
B/8BGQIJB/8MAAG6AfQCAAGyBgAMsgQAAbMBigG7EBkBCQFlAbsDGQGuAWUEGQGKBQAB/wIAAbMCAAEJ
AgAB8wIAAf8IAAEZDAAB8xIJCwABugH0AgABshYAAbMBigG7AhkBZgJlDBkCZQG7ARkBuwJlBBkBigUA
Af8CAAGzAgABCQIAAfMCAAH/CAABGQwAAfMBCQ7/AwkLAAG6AfQCAAGyFgABswGKAbsBGQFlAYsCGQFl
DBkBZQK7AmUFGQGKBAAB/wGyFbQBsgsAAfMBCQ4AAwkKAAeyAbMEAAuyAbMEAAGzAYoBuwEZAWUBuwIZ
AWUMGQRlAZEFGQGKBAABshcAAbIKAAHzAQkDAAIJCQADCQkAAQkIsgMAAQkMsgQAAbMBigG7ARkBZQG7
AgkBZQ4ZAbUHGQGKBAABshezAbIKAAHzAQkDAAIJCQADCQkAAboBsgH0BAABugGyA/QBswGyAfQIAAG6
AbIEAAGzAYoBuwIZA2UBuxYZAYoEAAG6FwABsgoAAfMBCQ4AAwkJAAG6AbIB9AQAAboGsgH0CAABugGy
BAABswGKAbscGQGKBAABuhcAAbIKAAHzAQkOAAMJCQABCQiyAwABCQyyBAABswGKHbsBigQAAboXAAGy
CgAB8xIJCgAIsgQADLIFAB+KBAABugQAAbIB9AsAAQkBsgQAAbIKAAH/EQkB8ycAAf8crQG0BQABugMA
AbIBAAGzCwABCQEAAbIDAAGyZwABugIAAbIDAAGyCQABsgMAAbMCAAGyZwABugGzAboEAAG6CAAC8wMA
Af8BugGzAQlvAAGyAQkFAAG6AbN5AAG6A7IBCW0AAUIBTQE+BwABPgMAASgDAAGAAwABYAMAAQEBAAEB
BgABBhYAA///AP8AAwAk/wHDBP8B/AE/Bf8BwAIAAQMBywT/AfABhwL/AY8C/wHAAgABAQHDBP8BhAEx
Av8BHwL/AcACAAEBAeEE/wEeATwBfwH+ARwC/wHAAgABAQH8A/8B/gF/Af8BPwH8ATwC/wHAAgABAQH+
AX8C/wH8Av8BnwH4AXgC/wHAAgABAQH/AT8C/wH5Av8B3wHwAfgC/wHAAgABAQH/AZ8C/wH7Av8BzwLw
Av8BwAIAAQEB/wHPAv8B8wL/Ae8B4AExAv8BwAIAAQEB/wHnAv8B9wL/AecB4AEBAv8BwAIAAQEB/wHz
Av8B9wL/AfcBwAEAAv8BwAIAAQEB/wH5Av8B9wL/AfcB4AEAAT8B/wHAAgABAQH/AfwC/wHDAv8BwwHG
AQABAwH/AcACAAEBAf8B/gF/Af8BywL/AcsBzAEAAQMB/wHAAgABAQL/AT8B/wHDAv8BwwGMAYABAQH/
AcACAAEBAv8BnwH/AeMC/wHjAfgBwAEBAf8BwAIAAQEC/wHPAf8B9wL/AfcB+QHwAQEB/wHAAgABAQL/
AecB/wH3Av8B5wH/AcABAAF/AcACAAEBAv8B8wH/AfMC/wHvAf8B5gEAAR8BwAIAAQEC/wH5Af8B+wL/
Ac8C/wGAAQcBwAIAAQEC/wH8Af8B+QL/Ac8C/wHIAQMBwAIAAQEC/wH+AX8B/AL/AZ8C/wH+AQABwAIA
AQMD/wE/Af4BfwH/AT8D/wGAAcABAAEPBP8BnwH/AT8B/gF/A/8BwQHAAQABDwT/AcMB/wGMATgE/wHx
AcABAAEfBP8BywH/AeABgwz/AcMB/wH8AT8M/wHjAf8B/gE/Jf8B/gL/AT8M/wH+Av8Bvwz/AfwCAAEf
DP8B+QFtAb8B3wz/AfsBbQG/Ad8B8AEYAQwBDwL/AQABDwHAAgABAQH7AW0BvwHfAfABGAEMAQ8B/wH+
AQABDwGAAwAB+AIAAR8B8AEYAQwBDwH8AQABPwHPBAAB+wL/Ad8B8QEYAYwBTwH5Af4BPwHPBAAB+wL/
Ad8B8AEYAQwBDwH5Af4BAAEPBAAB+wL/Ad8B8AEYAQwBDwH5Af8BAAEPBAAB+wL/Ad8B+AE4ARwBDwH5
A/8EAAH7Av8B3wH8Af4BPwEfAfkD/wQAAfsC/wHfAfwCAAEfAfkB/wEAAQ8EAAH7Av8B3wH8AgABHwH5
Af4BAAEPBAAB+wL/Ad8B/AIAAR8B+QHgAT8BzwQAAfgCAAEfAf8B/gE/Af8B+QGAAT8BzwQAAfsBbQG/
Ad8B/wH+AT8B/wH5Ab4BAAEPBAAB+wFtAb8B3wH/AgABfwH5Ab8BAAEPBAAB+wFtAb8B3wH+AgABPwH5
Ab8C/wQAAfsBbQG/Ad8B/gIAAT8B+QG/Av8EAAHwAgABDwH+AX8B/gE/AfABDwEAAQ8EAAH3Av8B9wH+
AXMB/gE/AeABDgEAAQ8EAAHwAgABBwH+AXMB/gE/AeMBwAE/Ac8EAAH3Av8B9wH+AX8B/gE/AeMBwAE/
Ac8EAAH3Av8B9wH+AX8B/gE/AeABDgEAAQ8EAAH3Av8B9wH+AgABPwHwAQ8BAAEPAYADAAH3AZ8B/AH3
Af4CAAE/BP8BgAIAAQEB9wFfAf0Bdwz/AfYB7wH7AbcM/wHxAe8B8wGHDf8B8wHnDv8B/AEfDf8L
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wAHAAH/ARYBagiP
AWcBSgg4AVkBmgH/aAABFgqPAWcBSgo4AZpoAAFqCo8BZwFKCjgBWWgAC48BZwFKCzhoAAuPAWcBSgs4
aAALjwFnAUoLOGgAC48BZwFKCzhoAAuPAWcBSgs4aAALjwFnAUoLUmgAC48BZwxDaAALjwFnAUkLcWgA
C48BZwFJC3FoAAuPAWcBSQtxaAALjwFnAUkLcWgADEMBSQtxaAALowFmAUkLcWgAC8YBZwFJC3FoAAvG
AWcBSQtxaAALxgFnAUkLcWgAC8YBZwFJC3FoAAvGAWcBSQtxaAALxgFnAUkKcQFWaAABsArGAWcBSQpx
AXhoAAH/AbABgAjGAWcBSQhxAVYBeAH0/wD/AHIAAfQGVQF3Af82AAolAW80AA1VMgAPJTAAB1UBlwGY
AXcGVQF3EgAL9BEACSUBTAglAW8tAARVAZgJAAF3BFUPAA/rDgAFJQFvCQABRgUlKgAB9ANVAZ0NAAGX
A1UB/wwAAusB8gsAAQcC6wwABCUBTA0ABSUTAAL0EwAB/wNVEAAB/wNVDAAB6wHtDQAC6wsABCUQAAH0
BCUSAAL/EwADVRIAAf8DVQsAAesB8gEAAusCAAHyAesDAAHrAewBAAHsAesKAAQlEgAB/wMlAW8FAAH0
AfEB/wkAAv8JAAH/AfEB9AYAA1UUAAH0AlUBlwoAAesB9AEAAusCAAHyAesDAAHrAewBAAGSAesJAAH/
AyUUAAH0AyUFAAH/AbwBcwHxAf8HAAL0BwAB/wHxAXMBvAH/BQAB/wJVAQgHAAHxDQABdwJVCgAB6wH0
AQAC6wIAAfIB6wMAAesB7AEAAZIB6wkAAyUBFhUAAUYDJQYAAf8BBwEcAfMB/wUAAv8FAAH/AfMBHAEH
Af8HAANVCAACVQ0AAlUBdwkAAesB9AEAAusCAAHyAesDAAHrAewBAAGSAesIAAH/AyUFAAz/BgADJQgA
Af8BBwEcAfMB/wMAAvQDAAH/AfMBHAEHAf8JAAJVAfQIAANVDAABdwJVCQAB6wH0AQAC6wIAAfIB6wMA
AesB7AEAAZIB6wgAAyUB8wUAAW8LJQYAAUYCJQFvAwAB8wFyARwB8wIAAf8BBwEcAfMB/wEAAvQBAAH/
AfMBHAEHAf8CAAG8AfIBHAH0BAABCAJVCQAEVQHxCwACVQH/CAAB6wH0AQAC6wIAAfIB6wMAAesB7AEA
AZIB6wgAAyUGAAFvCyUHAAMlAwAB/wEcAfMFAAH/AQcBHAHzAv8B8wEcAQcB/wQAAf8BcwG8BQADVQkA
BlUKAAJVAXcIAAHrAfQBAALrAgAB8gHrAwAB6wHsAQABkgHrCAADJQYAAW8LJQcAAyUDAAH/AfQBcwH/
BgAB/wG8AnMBvAH/BgAB9AEcAe8FAAJVAZcJAAdVCQADVQgAAesB9AEAAusCAAHyAesDAAHrAewBAAGS
AesHAAH/AyUGAAFvCyUHAAMlAwAB9AIHAfQHAATwBwAB8AH0AfAB9AQAAlUB8wkACFUBCAcAA1UIAAHr
AfQBAALrAgAB8gHrAwAB6wHsAQABkgHrBwABlAIlARoGAAFvCyUHAAMlCgAC/wHxAf8BAALxAQAB/wHx
Av8LAAJVAfQJAAlVBwABnQJVCAAB6wH0AQAC6wIAAfIB6wMAAesB7AEAAZIB6wcAAUYCJQH0BgABbwsl
BwABbwIlCQAB9AH/AfMDAALxAwAB8wH/AfQKAAJVAfMJAAhVCAADVQgAAesB9AEAAusCAAHyAesDAAHr
AewBAAGSAesHAAGTAiUBGgYAAW8LJQcAAyUHAAP0BQAC8QUAA/QIAAJVAZcJAAZVAQgJAANVCAAB6wH0
AQAC6wIAAfIB6wMAAesB7AEAAZIB6wcAAf8CJQFMBgABbwslBwADJQcAAv8GAALxBgAC/wgAA1UJAAVV
Af8KAANVCAAB6wH0AQAC6wIAAfIB6wMAAesB7AEAAZIB6wgAAyUGAAFvCyUHAAMlDwAC8RAAAZgCVQkA
BFUMAAJVAfQIAAHrAfQBAALrAgAB8gHrAwAB6wHsAQABkgHrCAADJQYAAW8LJQcAAyUPAALxEQACVQH/
CAACVQEIDAABlwJVCQAB6wH0DQABkgHrCAADJQH/BQABbwslBgABFgMlDwAC8REAA1UIAAFVDgADVQcA
Av8B6wHwDf8B7AHrAv8GAAH0AyUFAAEWC0YGAAMlAf8PAALxEQAB9AJVAfMVAAGXAlUIABXrBwADJQHz
FQABbwMlEAAC8RIAA1UVAANVCAAV6wcAARoDJRUAAyURAALxEwADVRMAA1UJABXrCAAEJRMABCURAALx
AgAB/xAAAfIDVREAA1UPAALrBwAB6wHsDgAEJREABCUSAALxAgABHBEAAQgDVQHyDQABmANVAfQPAALr
AfQFAAG8AesB7w8ABCUB8w0AAZMEJRMAAvEBAAH/AXIB9BEAAfIEVQH/CQAB8gRVEgAJ6xEABSUB/wkA
AfMFJRQAAvEBAAEIAfABHBMABlUBlwHxAfQB8QdVFAAB8QWSAfQTAAclAW8BGwH0ARoBRgclFQAC/wEA
AfIB/wHzAf8TAAH0DVUB/zAAARoPJQH/MwABmAdVAfA1AAH0CyUB/3cAAf8BkwFGAZMB/3AAAZcDVQEI
IQABwghaAfNPAAHCBlUB9B0AAfMMWgH0TQAJVQH/GgAQWg4AAfQDBwHyDgAB9AMHAfImAApVAZcYAAZa
AQgEAAGeBVoNAAH0AXMB8gLzAfQOAAH/A/MBBwHyBgABvBkUBQAMVQHCFQAFWgH/CAAB/wNaDQAB8wEH
FgAB8wEHBgABvAEUBLgBkA0UBLgBkAEUBQAOVQH/EgABngRaDAAB5AH/DQAB8wEHAgAB/wLzAvQB/wIA
Av8CAAH/AwAB/wMAAfMBBwYAAbwBFAG4A5ABbAcUAYsBkAQUA5ABuAGQARQFABBVEQAEWhwAAfMBBwUA
Af8B8wHwAgAB8wFyAbwCBwEAAf8CBwMAAfMBBwYAAbwBFAG4CRQBbAPZAWwGFAG4AZABFAUAEVUBmA4A
BFodAAH/AfQCAAHzAgcBvAH0AgAB8AH/AfQB8QHzAf8B8wHvAfIB/wHyAf8BAAH/AfQGAAG8ARQBuAgU
AZAC2QGzApACuAGQAxQBuAGQARQFABNVAfIMAANaAf8jAAH/AfQBcwEcAf8B9AEcAQAB8AIAAXMB9AH/
AXMBBwH/CQABvAEUAbgHFAGQAtkBbAGQBNkBkAMUAbgBkAEUBQAVVQH/CQABngNaIQAB/wMHAfEB9gHy
Ae8B9AHyARwB/wHwAf8BBwHyAfQBBwsAAbwIFAFsAtkBbAGyAdkBuAKLAbMBkAYUBQAWVQGXCAADWgH/
JAAB/wG8AXMB/wH0AXIB/wHvAfICAAH/AQcBAAEHCwABvAgUAbgB2QFsAZAB2QG4ARQBkALZAbIGFAUA
GFUBmAYAA1oUAANaCQAIBwHvDwcHAAEZGd8FABpVAfQEAANaEwABCARaLwABGgFZARsBGgFZAfQBGgFZ
AZoBAAGaAVkBGgoAG1UBmAIAAf8DWhIAAf8GWggAAfQB8gH0AfIC8wH0Af8B8wH0AfMB9ALzAfQB8wH0
AfMB9AHzAfQB8xAAAZoBWQH0AXoBmgH/AnoB9gGaAXoBGgH/CgAcVQH/AQABngJaAZ4SAAdaAQgHAAHz
AQcB8wEHAfMBCAIAAfIBvAHyAbwB8gG8AfMBBwHzAQcB8wG8AfMBBxAAAZoBWQH/AVkBGgEbAVkB/wHz
AVkBmgH/AZoKABxVAZgBAANaAcIRAAlaAf8GAAH/AfQB8wHvAfMBHAH/AfMB9AFzAfYB9AHwAvIB8AH/
AfQB8gHwAfIBvA0AAvQBAAGaAXoB/wFZAhoBegEAAZoBegH0AnoKABxVARsBAAGeAloBnhAAC1oB/wcA
AfQBcwH2AXID/wG8AXMB7wEcAQABBwL/AQABvAH0AfAB8w0AAnoBAAGaAVkB/wFZAXoB/wH2AfQBWQEa
ARsBWQEaCgAcVQIAAf8DWg8ABFoBngNaAf8EWgYAAQcB/wFzAfQBHAHzAvQB/wH0AfMB9gHwAQcB/wEH
AQABBwH/AQcB/w0AAZoBegH/ARoBWQHzARsCegEaAXoBmgH/AZoBegH/CgAaVQGXBAADWg8ABFoBAANa
AQAB/wNaBgABBwHyAfMBvAH/ARwB/wH0AfEB9gEHAXMBBwH/Ae8B8AH0AQcB/wEHDgABGwFZARsB9gFZ
AXoB/wEbAXoBWQF6Af8BmgFZARsLABlVAf8FAANaDwADWgIAA1oCAAHAAloGAAH/Ae8C/wEAAfMBHAHz
Av8B8wL0AQcBvAH0AXMB9AEHAfEOAAH/AnoB/wHzAnoBGwH/AvQBmgFZARoB/wsAF1UB8QcAA1oQAAEb
AgAB8wNaAwAB/wgAAbwB8AEAAvQB/wHvAXIBHAEHAnMB9AH/ARwB9AHzAXMB/w8AARoBWQEaAQAB/wF6
BVkBmgH/DAAVVgGYCQABfANaEgADWgGeDAAB/wEcAfIB/wEHAbwB9AH2AvMB9AH/AfABHAHzAQABBwH/
EAAB9gJ6ARoC/wHzAxoB9A4AFFYB/wsAA1oRAAH/A1oJAAH0AfIEAAEcAfAB/wHzAnMCHAFzAVAB8AcA
AfQB8ggAAfcEAAH/AXoBWQF6AfMB/woAAfcB8QYAElYB9A0ABFoQAARaCQAB8wEHBAAB/wG8Ae8B8gH/
AfQC8wH0Af8B8wEIAf8FAAHzAQcIAAH3BQAB/wEaAXoBWQJ6AZoBGgcAAfcB8QYAEFYBCBAABFoOAARa
CgAB8wEHBgAB/wEHAXIBcwEcAe8BHAFQARwB9AYAAfMBBwgAAfcHAAH/ARsBmgF6AVkBGgcAAfcB8QYA
DlYBlxIABVoMAARaAZ4KAAHzAQcIAAH/AfQC8wH0Af8IAAHzAQcIAAH3A/EB9A0AA/EB9wHxBgANVgH/
FAAFWgoABVoLAAH/AVAB7wIHAfIOAAH0AwcBcwH0CAAE9wHxDQAE9wHxBgALVgH0FwAGWgYABloNAAH/
A/MB9A4AAf8D8wH0JgAJVgEIGgAQWkwAAZgGVgGXHQAB5AxaAZ5OAAVWAf8gAApaUQACCAH/JQAB9AKe
Af//ADMAAfMDWigAAfMDWjAAAfYbWQQAAfMBWgEAAVomAARaAQAEWhQAAWwB9AHzFgAdWQMAAfMDWiMA
Af8CWgH0AQAB8wNaAgABCAJaEQABbAH0AWYXAB1ZBAAC8wHCAVohAAGeAVoB/wQAA/MEAAHCAVoB/w4A
AWwC9AH/AwAB/wGuEgAdWQcAAfQBWh8AAloPAAFaAcIMAAFsAvQBZgQAAWwBtRIAHVkIAAH/AVodAAHk
AVoRAAFaAf8KAAFsAvQBZgQAAfIB9AGREgAdWQkAAf8BWhsAAf8BWhMAAVoJAAG8AvQBrgUAAe0B9AFm
EgAdWQoAAfQBWhoAAVoUAAHCAVoIAAH3AvQBZgQAAewC9AHzEgAdWQsAAfQBWhgAAf8BWhUAAVoHAAFs
BPQBvAH3AgABZgL0EwAdWQwAAf8BWhcAAVoWAAEIAVoGAAT0AfcBbAHzAWwBZgEJAWYBrhMAHVkNAAH/
AVoWAAFaFwABWgUAAa4B8wX0AfMBbAH/AfECCQFsEgAdWQ4AAfQBWhUAAVoXAAFaBgABZgL0AWwE9AG8
Aa4B/wGuAQkBkQG8EAAdWQ8AAfQBWhIAAfMDWhQAAfMDWgQAAf8B9AFmAgABbAGRAvQB8AH0Aa4B8QH/
Aa4BCQFsAW0BuwHtDAAdWRAAAf8BWhEAAfMBWgEAAVoUAAHzAVoBAAFaBAABbAHxAgABBwEJAbsBbAP0
Aa4B9AFmAv8CCQJmDAAdWREAAf8BWhAAAfMDWhQAAfMDWgMAAfMBZgH/AgACkQEAAWYBbAEJAWYC9AGu
AQcBZgH/Ae8BbAG7AfcLAB1ZEgAB9AFaEAAB8wFaAfMVAAHzAVoB8wcAAfMBCQEHAgABbQH0AWwBuwGu
AvQBtQFsAfcB/wGuAfALAB1ZEwAB9AFaEAABWhcAAVoIAAHzAWwFAAFmAf8BkQGuAQcC9AHzA2YLAB1Z
FAAB/wFaDwABWhYAAfQBWg0AAZIB/wFmAf8BbAH/AQkBZgT0AfABbAFmCQABMRtZATEVAAH/AVoOAAGe
AVoVAAFaDwABZgH/AgAB9wG8Ae0BCQFmAfQB8gP0AZEB8AcAAzEBWBX/BDEWAAH0AVoOAAFaFAAB/wFa
FQABbAH/AWwBrgb0AWwB/wUAAzEBWBX/BDEXAAH0AVoNAAEbAVoTAAFaAf8WAAH/AfMBAAGuAfAG9AFs
BAAdMRgAAf8BWg0AAloRAAFaAZ4cAAFmBvQB8gGuAgAbMQF5GgAB/wFaDQACWg8AAlofAAFsBfQBZgIA
EjElAAH0AVoNAAJaDQABWgHkIQABvAGSAvQB8wMAETEBmSYAAcIDWgsAARsCWgIAAfMDWgMAAloB/yQA
AWwB9AFsAwARMScAAfMBWgEAAVoNAAGeBFoBAARaAf9kAAHzA1oQAAHzA1ppAAPzEQAD8/8ANgABsxAA
Af8Bu20AAbIRAAGybAABsgEJAbICCQGzAgkBugIJAbsHCQG6AbNqAAL/AQABswIAAQkCAAHzAgAB/wgA
AQlqAAH/AgABswIAAQkCAAHzAgAB/wgAARkJAAH/BQkB9AIAARkFCQH/AgAGCRQAC7IBswYAHfQGAAH/
AgABswIAAQkCAAHzAgAB/wgAARkJAAH/BQkB9AIAARkFCQH/AgAGCRMAAQkMsgUAH4oFAAH/ArMBshKz
CQAB/wIJAf8CCQH0AgABGQEJARkB/wIJAf8CAAMJAf8B8gEJCgABswqyAfQIAAG6AbIEAAG0AYoBZQK7
GhkBigUAAf8UAAEZCQAB/wIJAQACCQH0AgABGQEJAfMBAAIJAf8CAAMJAQAB8wEJCQAB8wGzCAABugGy
AfQIAAG6AbIEAAGzAYoCZQK7GRkBigUAAf8UAAEZCQAB/wUJAfQCAAEZBQkB/wIABgkJAAG6AfQIAAEJ
DLIEAAGzAYoBuwJlAbsBCRgZAYoFAAH/FAABGQkAAf8FCQH0AgABGQUJAf8CAAYJCQABugH0CQAMsgQA
AbMBigG7ARkCZQG7AQkJGQEJDBkBuwGKBQAB/xQAARkKAAH/AgkC/wMAAv8DCQH/AwAC/wIJAfMB/wkA
AboB9BkAAbMBigG7AhkCZQG7CBkCuwsZAQkBZQGKBQAB/xQAARkLAAIJBwADCQYAAgkB9AoAAboB9BkA
AbMBigG7AxkCZQG7BhkBuwJlAbsKGQJlAYoFAAH/FAABGQsAAgkH/wMJBv8CCQH0CgABugH0CQALsgGz
BAABswGKAbsEGQJlAbsFGQFmAmUBZgEJCBkBuwFlARkBigUAAf8UAAEZCwAUCQH0CgABugH0CAABCQyy
BAABswGKAbsFGQJlAbsDGQG7AWUBZgGRAWUBuwcZAQkCZQEZAYoFAAH/FAABGQsAFAkB9AoAAboB9AQA
BPQBswGyAfQIAAG6AbIEAAGzAYoBuwYZAWUBZgG7AQkBuwJlAhkBZQFmAQkGGQFmAWUCGQGKBQAB/xWy
FAAB8wIJEwABugH0AgAIsgH0CAABugGyBAABswGKAbsGGQG7AmUBuwJlAxkBCQFlAbsFGQG7AWUBbAIZ
AYoFAAH/AgABswIAAQkCAAHzAgAB/wgAARkUAAHzAgkTAAG6AfQCAAGyBQABCQyyBAABswGKAbsHGQG1
A2UFGQJlAbsDGQEJAmUDGQGKBQAB/wIAAbMCAAEJAgAB8wIAAf8IAAEZDQAH/wEZAgkH/wwAAboB9AIA
AbIGAAyyBAABswGKAbsQGQEJAWUBuwMZAa4BZQQZAYoFAAH/AgABswIAAQkCAAHzAgAB/wgAARkMAAHz
EgkLAAG6AfQCAAGyFgABswGKAbsCGQFmAmUMGQJlAbsBGQG7AmUEGQGKBQAB/wIAAbMCAAEJAgAB8wIA
Af8IAAEZDAAB8wEJDv8DCQsAAboB9AIAAbIWAAGzAYoBuwEZAWUBiwIZAWUMGQFlArsCZQUZAYoEAAH/
AbIVtAGyCwAB8wEJDgADCQoAB7IBswQAC7IBswQAAbMBigG7ARkBZQG7AhkBZQwZBGUBkQUZAYoEAAGy
FwABsgoAAfMBCQMAAgkJAAMJCQABCQiyAwABCQyyBAABswGKAbsBGQFlAbsCCQFlDhkBtQcZAYoEAAGy
F7MBsgoAAfMBCQMAAgkJAAMJCQABugGyAfQEAAG6AbID9AGzAbIB9AgAAboBsgQAAbMBigG7AhkDZQG7
FhkBigQAAboXAAGyCgAB8wEJDgADCQkAAboBsgH0BAABugayAfQIAAG6AbIEAAGzAYoBuxwZAYoEAAG6
FwABsgoAAfMBCQ4AAwkJAAEJCLIDAAEJDLIEAAGzAYoduwGKBAABuhcAAbIKAAHzEgkKAAiyBAAMsgUA
H4oEAAG6BAABsgH0CwABCQGyBAABsgoAAf8RCQHzJwAB/xytAbQFAAG6AwABsgEAAbMLAAEJAQABsgMA
AbJnAAG6AgABsgMAAbIJAAGyAwABswIAAbJnAAG6AbMBugQAAboIAALzAwAB/wG6AbMBCW8AAbIBCQUA
AboBs3kAAboDsgEJbQABQgFNAT4HAAE+AwABKAMAAYADAAGgAwABAQEAAQEGAAEKFgAD/wEABP8MAAT/
DAAE/wwABP8MAAHwAgABDwwAAfACAAEPDAAB8AIAAQ8MAAHwAgABDwwAAfACAAEPDAAB8AIAAQ8MAAHw
AgABDwwAAfACAAEPDAAB8AIAAQ8MAAHwAgABDwwAAfACAAEPDAAB8AIAAQ8MAAHwAgABDwwAAfACAAEP
DAAB8AIAAQ8MAAHwAgABDwwAAfACAAEPDAAB8AIAAQ8MAAHwAgABDwwAAfACAAEPDAAB8AIAAQ8MAAHw
AgABDwwAAfACAAEPDAAB8AIAAQ8MAAT/DAAE/wwABP8MAAT/DAAB/wHwAQcG/wHgAQMG/wHAAQEG/wGA
AQAG/wIAAX8B/wHgAQMB/wH+AgABPwT/Af4BDwH4AT8B/wGAAQAB/wH8AQ8B+AEfBP8B+AE/Af4BDwH/
AR8B/AF/AfgBPwH+AQ8B/wH+AX8B/wHwAv8BDwH/AT8B/gF/AfAC/wEHAf8B/gF/Af8B8QL/AYcB/wEm
AXIBfwHhAv8BgwHjAf4BfwHHAeMC/wHDAf8BJgFyAX8BwwL/AcMB4AH+AX8BBwHDAfsB/wHjAf8BJgFy
AX8BwwL/AeEB+AE+AXwBHwHHAfkB/wHxAf8BJgFyAX8BhwHAAQMB8QH+AQ4BcAF/AccB+AH/AfEB/wEm
AXIBfwGHAcABAwHwAeEBggFBAYcBjwH4AT8B+AH/ASYBcgF/AY8BwAEDAfgB4wHgAQcCjwH4AR8B+AH/
ASYBcgF/AY8BwAEDAfgB4QH4AR8CjwH4AQ8B+AH/ASYBcgF/AQ8BwAEDAfgB4QH8AT8BhwGPAfgBAwH4
Af8BJgFyAX8BDwHAAQMB+AH/AcIBQwH/AY8B+AEDAfgB/wEmAXIBfwEPAcABAwH4Af8BjgFxAf8BjwH4
AQcB+AH/ASYBcgF/AQ8BwAEDAfgB/gE+AXwBfwGPAfgBDwH4Af8BJgFyAX8BDwHAAQMB+AH+An4BfwGP
AfgBHwH4Af8BJgFyAX8BjwHAAQMB+AH/Af4BfwH/AY8B+AF/AfgB/wEmAXIBfwGPAcABAwH4Af8B/gF/
Af8BxwH4Af8B8QH/AT8B/gF/AYcBwAEDAfAB/wH+AX8B/wHHAfsB/wHxAfwCAAEfAYcBwAEDAfAB/wH+
AX8B/wHDAv8B4wH8AgABHwHDAv8B4QH/Af4BfwH/AeMC/wHjAfwCAAEfAcMC/wHjAf8B/gF/Af8B8QL/
AccB/AIAAR8B4QL/AcMB/wH+AW8B/wHwAv8BjwH/AecB8wH/AfAC/wGHAf8B/gFvAf8B+AE/Af4BDwH/
AuMB/wH4AT8B/gEPAf8B/gFHAf8B/AEPAfgBPwH/AfABBwH/AfwBDwH4AR8B/wH+AUcC/wIAAX8B/wH4
AQ8B/wH+AgABPwH/Af4BQwL/AYABAAb/AgABfwX/AfABBwb/AcABAQ7/AfwBHw3/AeAE/wGAAR8J/wHA
AT8C/wH+AQABBwn/AcABDwL/AfwBAAEDAf8B8AF/Af4BDwT/AcABBwL/AfgBDwEDAf8B4AF/Af4BBwHg
AgABBwHAAQEC/wHwAT8BwwH/AecC/wHnAeACAAEHAcABAAF/Af8B4AH/AfMB/wHmAQYBbgHnAeACAAEH
AcABAAE/Af8B4QP/AecBxgEIAecB4AIAAQcBwAEAAQ8B/wHDA/8B5gEMAQABJwHgAgABBwHAAQABAwH/
AcME/wGAAbABPwHgAgABBwHAAgAB/wGHA/8B/AIAAf8B4AIAAQcBwAIAAX8BhwT/AYABMgH/AeACAAEH
AcACAAEfAY8C/wEfAfACAAEPAeACAAEHAcACAAEHAY8B/wH+AQ8F/wHgAQgB/wHAAgABAwEPAf8B/AEH
AfgCAAEfAf8B4AEAAf8BwAIAAQEBDwH/AfwBAwH4ARgBAAEfAf8B4AEAAf8BwAIAAQEBDwH/AfgBAQH4
AgABHwH/AiAB/wHAAgABAQEPAf8B8AEAAf4BAAEiAR8B/wEgAQAB/wHAAgABAwEPAf8B4AEAAfwBAAEC
AR8B/wIAAf8BwAIAAQcBjwH/AeEBEAH8AgABPwH/AQABAQH/AcACAAEPAY8B/wHjARgB/AEgAQABPwH/
AQABAQH/AcACAAE/AY8B/wH2AR0B/gFAAQABPwH/AYgBAwH/AcACAAH/AYcB/wH+AR8B/gEAAQIBfwH/
AYABDwH/AcABAAEBAf8BxwH/AfwBPwHnAYABDwHnAfsBwAH/Ac8BwAEAAQcB/wHDAf8B/AE/AecBgAED
AecB+wHgAR8BzwHAAQABHwH/AeEB/wH4AX8B5wHgAQcB5wH7AfgBHwHPAcABAAF/Af8B4AH/AfABfwHn
AfgBHwHnAfgBPwH+AQ8BwAEAAv8B8AF/AeAB/wHgAX8B/gEHAfgBPwH+AQ8BwAEDAv8B+AEfAYEB/wHw
AX8B/gEPBP8BwAEPAv8B/AEAAQMJ/wHAAT8C/wH+AQABBwn/AeABfwP/AYABHwn/AfEE/wHwJv8BwwT/
AfwBPwX/AcACAAEDAcsE/wHwAYcC/wGPAv8BwAIAAQEBwwT/AYQBMQL/AR8C/wHAAgABAQHhBP8BHgE8
AX8B/gEcAv8BwAIAAQEB/AP/Af4BfwH/AT8B/AE8Av8BwAIAAQEB/gF/Av8B/AL/AZ8B+AF4Av8BwAIA
AQEB/wE/Av8B+QL/Ad8B8AH4Av8BwAIAAQEB/wGfAv8B+wL/Ac8C8AL/AcACAAEBAf8BzwL/AfMC/wHv
AeABMQL/AcACAAEBAf8B5wL/AfcC/wHnAeABAQL/AcACAAEBAf8B8wL/AfcC/wH3AcABAAL/AcACAAEB
Af8B+QL/AfcC/wH3AeABAAE/Af8BwAIAAQEB/wH8Av8BwwL/AcMBxgEAAQMB/wHAAgABAQH/Af4BfwH/
AcsC/wHLAcwBAAEDAf8BwAIAAQEC/wE/Af8BwwL/AcMBjAGAAQEB/wHAAgABAQL/AZ8B/wHjAv8B4wH4
AcABAQH/AcACAAEBAv8BzwH/AfcC/wH3AfkB8AEBAf8BwAIAAQEC/wHnAf8B9wL/AecB/wHAAQABfwHA
AgABAQL/AfMB/wHzAv8B7wH/AeYBAAEfAcACAAEBAv8B+QH/AfsC/wHPAv8BgAEHAcACAAEBAv8B/AH/
AfkC/wHPAv8ByAEDAcACAAEBAv8B/gF/AfwC/wGfAv8B/gEAAcACAAEDA/8BPwH+AX8B/wE/A/8BgAHA
AQABDwT/AZ8B/wE/Af4BfwP/AcEBwAEAAQ8E/wHDAf8BjAE4BP8B8QHAAQABHwT/AcsB/wHgAYMM/wHD
Af8B/AE/DP8B4wH/Af4BPyX/Af4C/wE/DP8B/gL/Ab8M/wH8AgABHwz/AfkBbQG/Ad8M/wH7AW0BvwHf
AfABGAEMAQ8C/wEAAQ8BwAIAAQEB+wFtAb8B3wHwARgBDAEPAf8B/gEAAQ8BgAMAAfgCAAEfAfABGAEM
AQ8B/AEAAT8BzwQAAfsC/wHfAfEBGAGMAU8B+QH+AT8BzwQAAfsC/wHfAfABGAEMAQ8B+QH+AQABDwQA
AfsC/wHfAfABGAEMAQ8B+QH/AQABDwQAAfsC/wHfAfgBOAEcAQ8B+QP/BAAB+wL/Ad8B/AH+AT8BHwH5
A/8EAAH7Av8B3wH8AgABHwH5Af8BAAEPBAAB+wL/Ad8B/AIAAR8B+QH+AQABDwQAAfsC/wHfAfwCAAEf
AfkB4AE/Ac8EAAH4AgABHwH/Af4BPwH/AfkBgAE/Ac8EAAH7AW0BvwHfAf8B/gE/Af8B+QG+AQABDwQA
AfsBbQG/Ad8B/wIAAX8B+QG/AQABDwQAAfsBbQG/Ad8B/gIAAT8B+QG/Av8EAAH7AW0BvwHfAf4CAAE/
AfkBvwL/BAAB8AIAAQ8B/gF/Af4BPwHwAQ8BAAEPBAAB9wL/AfcB/gFzAf4BPwHgAQ4BAAEPBAAB8AIA
AQcB/gFzAf4BPwHjAcABPwHPBAAB9wL/AfcB/gF/Af4BPwHjAcABPwHPBAAB9wL/AfcB/gF/Af4BPwHg
AQ4BAAEPBAAB9wL/AfcB/gIAAT8B8AEPAQABDwGAAwAB9wGfAfwB9wH+AgABPwT/AYACAAEBAfcBXwH9
AXcM/wH2Ae8B+wG3DP8B8QHvAfMBhw3/AfMB5w7/AfwBHw3/Cw==
</value>
</data>
<metadata name="imageListTool.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -229,137 +324,159 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABK
HgAAAk1TRnQBSQFMAgEBCQEAASgBAAEoAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABMAMAAQEBAAEgBgABMP8AJwAB/wH2AesB//gAAf8B9gHrAf8DBgEIBAADDAEQ7AAB/wH2AesB/wFn
AUsBMgH/CAAB/wH2AesB/+gAAbQBoQGQAv8B9gHrAf8IAAFkAVIBQQHPAf8B9gHrAf/oAAH/AfYB6wL/
AfYB6wH/AXoBYAFJAf8BcQFWAT4B/wHiAcoBsAH/AYUBawFVAf/oAAH/AfYB6wH/AXEBVgE+Av8B9gHr
Av8B9gHrAf8BkwF+AWwB/wGOAXcBZAH/AagBjwF0Af/gAAFxAVYBPgH/BAABVAFMAUQBjwHLAbIBmQH/
AfsB8QHlAv8B9gHrAf8B+wHxAeUF/wHbAcIBqAH/AWcBSwEyAf/gAAHiAcoBsAH/BAABZgFQATsB5wF5
AWABSQH/AYABZgFPAv8B9gHrAf8BewFiAUsF/wFCAT4BOgFk5AABYAFRAUUBuAFnAUsBMgH/AXUBXAFF
Af8B4gHKAbAC/wH2AesC/wH2AesB/wHjAdYByQH/AWcBSwEyAf/wAAH7AfoB+QH/AZMBewFmAv8B9gHr
Av8B9gHrAv8B9gHrAf8DBgEI9AAB/wH2AesC/wH2AesC/wH2AesB/wHsAeEB1AH/9AABSAFCAT4BcAH/
AfYB6wH/AfEB5gHaAf//AP8A/wD/AP8ASQADMgFQUAABJwH6ARgB/wEnAfoBGAH/BAABJwH6ARgB/wEn
AfoBGAH/GAABqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8YAAFYAVQBSwGeAdsBlgEPAf8B2wGWAQ8B/wHbAZYBDwH/AwABARwAAzIBUAEmAfoBFwH/
QAABSwFrAUcBoAMSARgIAAEyATQBMgFQCAABPgFFAT4BbAMhATAMAAGNAWsBRgHvAVABJwEOAf8B4QG9
AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/FAAB2wGWAQ8B/xQA
AdsBlgEPAf8gAAEmAfoBFwH/OAABRwGiAT8BzyQAAyEBMAgAAY0BawFGAe8B4QG9AYoB/wFQAScBDgH/
AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8QAAHSAZYBFQH9QAABJgH6
ARcB/1wAAToBQAE6AWQIAAGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/EAADNgFZHAAB2wGWAQ8B/yQAASYB+gEXAf8sAAEnAfoBGAH/
LAABJwH6ARgB/wQAAY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/
AfoB6wHSAf8B3QG5AYcB/wFWAS0BFAH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wFQAScBDgH/AfoB6wHSAf8wAAI2ATUBVygAASYB+gEXAf8oAAEnAfoBGAH/LAABJwH6ARgB/wQA
AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8BUAEn
AQ4B/wH6AesB0gH/AecB1QG8Af8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wF0AVEBOAH/
AfoB6wHSAf8gAAHbAZYBDwH/PAABJgH6ARcB/yAAATIBNAEyAVAsAAEyATQBMgFQCAABjQFrAUYB7wHh
Ab0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/yAA
AdsBlgEPAf9AAAEmAfoBFwH/IAABJwH6ARgB/ywAAScB+gEYAf8EAAGNAWsBRgHvAeEBvQGKAf8BUAEn
AQ4B/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B2gG2AYQB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/EAAB2wGWAQ8B/wwA
AdsBlgEPAf8QAAG1AYcBJwHwMAABJgH6ARcB/xwAAScB+gEYAf8sAAEnAfoBGAH/BAABjQFrAUYB7wHh
Ab0BigH/AVABJwEOAf8B6QHMAaEB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfYB5wHOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/xQA
AVEBTgFKAZAIAAHbAZYBDwH/SAABJgH6ARcB/0QAAxIBGAgAAY0BawFGAe8B4QG9AYoB/wH6AesB0gH/
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACI
IwAAAk1TRnQBSQFMAgEBCwEAAUABAAFAAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABMAMAAQEBAAEgBgABMP8AJwAB/wH2AesB/3AAAyMBMwFOAVEBUAGZAzgBXBwAAU4BUQFQAZkBTgFR
AVABmVgAAf8B9gHrAf8DBgEIBAADDAEQKAABTAFEATQB/wHUAbgBAAH/AdQBuAEAAf8BTAFEATQB/wFM
AUQBNAH/AUwBRAE0Af8BTAFEATQB/wFMAUQBNAH/AUwBRAE0Af8BTAFEATQB/wHUAbgBAAH/AdQBuAEA
Af8BTAFEATQB/wwAAU4BUQFQAZksAAFOAVEBUAGZUAAB/wH2AesB/wFkAUgBLwH/CAAB/wH2AesB/ygA
AUwBRAE0Af8BTAFEATQB/wFMAUQBNAH/AUwBRAE0Af8BTAFEATQB/wFMAUQBNAH/AfQB2wEAAf8B/gHk
AQAB/wFMAUQBNAH/AUwBRAE0Af8BTAFEATQB/wHUAbgBAAH/AUwBRAE0Af8MAAFOAVEBUAGZCAADCwEP
A0IBdAQAAU4BeQFnAfABUAFTAVEBnwQAAU4BUAFPAZcIAAFOAVEBUAGZTAABtAGhAZAC/wH2AesB/wgA
AV8BWQFVAc8B/wH2AesB/ygAAUwBRAE0Af8BTAFEATQB/wFMAUQBNAH/AUwBRAE0Af8BTAFEATQC/wHl
AQAB/wFcAVMBLwL/AeUBAAL/AeUBAAH/AasBmQEXAf8BTAFEATQB/wHUAbgBAAH/AUwBRAE0Af8YAAMo
AT0BUwFbAVcBsQMkATUIAAFRAXYBZAHnAwgBCwFPAVIBUQGbVAAB/wH2AesC/wH2AesB/wF3AV0BRgH/
AW4BUwE7Af8B4gHKAbAB/wGFAWgBUgH/KAABTAFEATQB/wFMAUQBNAH/AUwBRAE0Af8BTAFEATQB/wHS
Ab0BCwH/AWMBWQEtAv8B5QEAAf8BTAFEATQC/wHlAQAB/wHCAa4BEAH/AUwBRAE0Af8BTAFEATQB/wFM
AUQBNAH/GAABSAFKAUkBiAMVAR0BSgF8AWgB8gFTAVkBVwGtBAADCAELXAAB/wH2AesB/wFuAVMBOwL/
AfYB6wL/AfYB6wH/AZMBewFpAf8BjgF0AWEB/wGoAY8BcQH/NAABSgG3Av8BTAFPAVIBkAMsAUQBSgG3
Av8EAAFKAbcC/5QAAW4BUwE7Af8EAAJMAUsBjwHLAbIBmQH/AfsB8QHlAv8B9gHrAf8B+wHxAeUF/wHb
AcIBqAH/AWQBSAEvAf8sAAFKAbcC/wFKAbcC/wFAAkEBbwMhATABSgG3Av8DIgEyHAABTgFRAVABmQFO
AVEBUAGZAUoBTAFLAYsEAAFIAkkBhgFIAkkBhQFIAUoBSQGHAUsBTQFMAY4BTAFOAU0BkQFIAkkBhQFL
AU0BTAGOVAAB4gHKAbAB/wQAAWQBVQFKAecBdgFdAUYB/wGAAWMBTAL/AfYB6wH/AXgBXwFIBf8DOwFk
IAABUAGjAd0B9QQAAUoBtwL/AUoBtAH2Af0DBAEGAywBRAFHAUkBSgGCAUoBtwL/IAABVAFzAWUB4AFN
AYMBawH3Aw0BEQFIAkkBhQFTAVkBVwGtBAADEgEZBAADIwEzAzEBTVwAAVcBVgFUAbgBZAFIAS8B/wFy
AVkBQgH/AeIBygGwAv8B9gHrAv8B9gHrAf8B4wHWAckB/wFkAUgBLwH/HAACNwE4AVsBPgI/AWsBSgG3
Av8DAwEEAU0BrAHqAfoBUQGgAdUB8gFWAWkBdAG9Aj0BPgFoHAABSwFOAU0BkAMxAU4DBQEHAwABAQM6
AWIBUQFUAVMBoQFNAVABTwGWAVEBWAFVAakDIwE0AwABAXAAAfsB+gH5Af8BkwF4AWMC/wH2AesC/wH2
AesC/wH2AesB/wMGAQgYAAFKAbcC/wQAAVIBogHZAfQBSgG3Av8BSgG3Av8BUAFZAV0BoyQAA0ABcAMm
ATkDBAEGAUgBfAFiAfYBUAFTAVEBnwFTAXYBZQHlAwIBAwMiATIBVQFxAWIB3HwAAf8B9gHrAv8B9gHr
Av8B9gHrAf8B7AHhAdQB/xQAAwoBDgFKAbcC/wM1AVYUAAGuAaQBkAH/EAADOAFcCAADQgF0AzEBTwFR
AXYBZAHnAVIBWgFWAbABRwF+AWUB+BAAAzgBXHgAA0ABcAH/AfYB6wH/AfEB5gHaAf8cAAE/AkABbQFN
AaEB1gHzAUkBSwFNAYgMAAGuAaQBkAH/EAABTgFRAVABmQwAAUsBTgFNAZABVgFuAWEB1wFRAVgBVgGq
AUcBgwFjAfsDHAEoDAABTgFRAVABmZAAAa4BpAGQAf8BrgGkAZAB/xwAAa4BpAGQAf8BrgGkAZAB/xAA
AUcBfgFlAfgBTgFRAVABmQM4AVwcAAFOAVEBUAGZAU4BUQFQAZkDIgEx/wD/AP8AywADMgFQUAABJAH6
ARUB/wEkAfoBFQH/BAABJAH6ARUB/wEkAfoBFQH/GAABqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFW
AQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/
AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8YAANQAZ4B2wGWAQwB/wHbAZYBDAH/AdsBlgEM
Af8DAAEBHAADMgFQASMB+gEUAf9AAAFRAVMBUQGgAxIBGAgAAzIBUAgAAT4BPwE+AWwDIQEwDAABfwFl
AUsB7wFNASQBCwH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8YAAHbAZYBDwH/BAAB2wGW
AQ8B/wwAAdsBlgEPAf88AAEmAfoBFwH/GAABJwH6ARgB/yQAAUoBcgFIAagMAAGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/ygAAdsBlgEPAf8BQQFA
AT8BcEQAASYB+gEXAf8YAAEnAfoBGAH/HAABSAGWAUIBx8AAAzIBUCAAAScB+gEYAf8BJwH6ARgB/wQA
AScB+gEYAf8BJwH6ARgB/8wAAzIBUCQAATIBNAEyAVD/AP8A/wA/AAHbAZYBDQH/AdsBlgENAf8B2wGW
AQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wwAAagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/BAABqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8EAAGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wwAAX0BbAFKAd8QAAHbAZYBDQH/EAABYgFd
AVQBwAgAAY0BawFGAe8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8BjQFrAUYB7wFQAScBDgH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wGNAWsBRgHvAVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/DAADKgFAEAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgEN
Af8B2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8IAAGNAWsBRgHvAeEBvQGKAf8BUAEnAQ4B/wHhAb0BigH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wHhAb0BigH/AY0BawFGAe8B4QG9AYoB/wFQAScBDgH/
AdIB/xQAAdsBlgEMAf8UAAHbAZYBDAH/IAABIwH6ARQB/zgAAVYBcgFTAc8kAAMhATAIAAF/AWUBSwHv
AeEBvQGKAf8BTQEkAQsB/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wHhAb0BigH/
EAAByQGWARgB/UAAASMB+gEUAf9cAAM7AWQIAAF/AWUBSwHvAeEBvQGKAf8B+gHrAdIB/wFNASQBCwH/
AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BTQEkAQsB/wHhAb0BigH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFNASQBCwH/EAADNgFZHAAB2wGWAQwB/yQAASMB+gEU
Af8sAAEkAfoBFQH/LAABJAH6ARUB/wQAAX8BZQFLAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8BTQEk
AQsB/wHhAb0BigH/AfoB6wHSAf8B3QG5AYcB/wFTASoBEQH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wFNASQBCwH/AfoB6wHSAf8wAAM1AVcoAAEjAfoBFAH/KAABJAH6ARUB/ywA
ASQB+gEVAf8EAAF/AWUBSwHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BTQEkAQsB/wHh
Ab0BigH/AU0BJAELAf8B+gHrAdIB/wHnAdUBvAH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AeEBvQGK
Af8BcQFOATUB/wH6AesB0gH/IAAB2wGWAQwB/zwAASMB+gEUAf8gAAMyAVAsAAMyAVAIAAF/AWUBSwHv
AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8BjQFrAUYB7wHhAb0BigH/
AVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wwAAyoBQDAA
AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wFQAScBDgH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AVABJwEOAf8BjQFrAUYB7wHhAb0BigH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AVABJwEOAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8BUAEnAQ4B/wGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/DAADKgFAEAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGW
AQ0B/wHbAZYBDQH/AdsBlgENAf8IAAGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AVABJwEO
Af8B4QG9AYoB/wH6AesB0gH/Ad0BuQGHAf8BVgEtARQB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHS
Af8BUAEnAQ4B/wHhAb0BigH/AfoB6wHSAf8B3QG5AYcB/wFWAS0BFAH/AVABJwEOAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8BjQFrAUYB7wHhAb0BigH/AfoB6wHS
Af8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8B+gHrAdIB/wHdAbkBhwH/AVYBLQEUAf8BUAEnAQ4B/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wwAAyoBQAQAAdsBlgEN
Af8B2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8QAAFiAV0BVAHACAABjQFrAUYB7wHhAb0BigH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AVABJwEOAf8B4QG9AYoB/wFQAScBDgH/AfoB6wHSAf8B5wHVAbwB/wHh
Ab0BigH/AfoB6wHSAf8B+gHrAdIB/wHhAb0BigH/AXQBUQE4Af8B+gHrAdIB/wGNAWsBRgHvAeEBvQGK
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wHhAb0BigH/AVABJwEOAf8B+gHrAdIB/wHn
AdUBvAH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8BdAFRATgB/wH6AesB0gH/AY0BawFG
Ae8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AeEBvQGKAf8BUAEnAQ4B/wH6
AesB0gH/AecB1QG8Af8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wF0AVEBOAH/AfoB6wHS
Af8MAAMqAUAQAAHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wgA
AY0BawFGAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/
AfoB6wHSAf8BjQFrAUYB7wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wFQAScBDgH/
AfoB6wHSAf8B+gHrAdIB/wGNAWsBRgHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/
AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/DAADKgFAMAABjQFrAUYB7wHhAb0BigH/AVABJwEOAf8B+gHr
AdIB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AdoBtgGEAf8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wGNAWsBRgHvAeEBvQGKAf8BUAEn
AQ4B/wH6AesB0gH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B2gG2AYQB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AY0BawFGAe8B4QG9
AYoB/wFQAScBDgH/AfoB6wHSAf8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wHaAbYBhAH/AVABJwEOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8IAAHb
AZYBDQH/AdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/CAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGW
AQ0B/wHbAZYBDQH/AdsBlgENAf8IAAGNAWsBRgHvAeEBvQGKAf8BUAEnAQ4B/wHpAcwBoQH/AVABJwEO
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B9gHnAc4B/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AY0BawFGAe8B4QG9AYoB/wFQAScBDgH/AekBzAGh
Af8BUAEnAQ4B/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH2
AecBzgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BjQFrAUYB7wHhAb0BigH/AVABJwEO
Af8B6QHMAaEB/wFQAScBDgH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfYB5wHOAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wgAAdsBlgENAf8IAAFi
AV0BVAHAAdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/EAABYgFdAVQBwAgAAY0BawFGAe8B4QG9AYoB/wH6
AdIB/wH6AesB0gH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/
IAAB2wGWAQwB/0AAASMB+gEUAf8gAAEkAfoBFQH/LAABJAH6ARUB/wQAAX8BZQFLAe8B4QG9AYoB/wFN
ASQBCwH/AfoB6wHSAf8BTQEkAQsB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wHaAbYBhAH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8QAAHbAZYBDAH/
DAAB2wGWAQwB/xAAAZoBegE1AfAwAAEjAfoBFAH/HAABJAH6ARUB/ywAASQB+gEVAf8EAAF/AWUBSwHv
AeEBvQGKAf8BTQEkAQsB/wHpAcwBoQH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B9gHnAc4B/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
FAACTAFLAZAIAAHbAZYBDAH/SAABIwH6ARQB/0QAAxIBGAgAAX8BZQFLAe8B4QG9AYoB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8YAAHbAZYBDAH/BAAB2wGW
AQwB/wwAAdsBlgEMAf88AAEjAfoBFAH/GAABJAH6ARUB/yQAAVIBVgFSAagMAAGoAVYBBAH/AagBVgEE
Af8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGo
AVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/ygAAdsBlgEMAf8DQAFw
RAABIwH6ARQB/xgAASQB+gEVAf8cAAFWAWgBUwHHwAADMgFQIAABJAH6ARUB/wEkAfoBFQH/BAABJAH6
ARUB/wEkAfoBFQH/zAADMgFQJAADMgFQ/wD/AP8APwAB2wGWAQoB/wHbAZYBCgH/AdsBlgEKAf8B2wGW
AQoB/wHbAZYBCgH/AdsBlgEKAf8MAAGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEE
Af8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGo
AVYBBAH/AagBVgEEAf8BqAFWAQQB/wQAAagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFW
AQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/
AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/BAABqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGo
AVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEE
Af8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8MAAFpAWIBVAHfEAAB2wGWAQoB/xAAAloBWAHACAABfwFl
AUsB7wFNASQBCwH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wF/AWUBSwHvAU0BJAELAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AX8BZQFLAe8BTQEkAQsB/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8MAAMqAUAQAAHbAZYBCgH/AdsBlgEKAf8B2wGWAQoB/wHbAZYBCgH/
AdsBlgEKAf8B2wGWAQoB/wgAAX8BZQFLAe8B4QG9AYoB/wFNASQBCwH/AeEBvQGKAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BjQFrAUYB7wHh
Af8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8BfwFlAUsB7wHhAb0BigH/AU0BJAELAf8B4QG9AYoB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wF/AWUBSwHvAeEBvQGKAf8BTQEkAQsB/wHh
Ab0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wGN
AWsBRgHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/CAAB2wGWAQ0B/wHbAZYBDQH/AdsBlgENAf8B2wGWAQ0B/wgAAdsBlgENAf8B2wGWAQ0B/wHb
AZYBDQH/AdsBlgENAf8B2wGWAQ0B/wHbAZYBDQH/DAABqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8EAAGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGo
AVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEH
Af8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wQAAagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/
AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZ
AQcB/wGoAVkBBwH/AagBWQEHAf8BqAFZAQcB/wGoAVkBBwH//wD/AP8AAwABQgFNAT4HAAE+AwABKAMA
AUADAAEwAwABAQEAAQEFAAGAAQEWAAP/AQAC/wYAAfsB/wYAAfIB/wYAAeYB/wYAAcwB/wYAAcAB/wYA
AcABfwYAAaABHwYAAegBDwYAAfgBBwYAAf8BgQYAAf8B8AYAAf8B+AYAAv8GAAL/BgAC/wYADP8BvwH/
AfwBnwGAAQAB/AEfAc8B/wHzAWcCAAH7Ae8B9wH/Ae8B+wIAAfcB/wH7Av8B+wIAAvcB/QH/Ad8B/QIA
Af8B9wH+Af8B3wH9AgAB/wF/Af8BfwG/AfsCAAH/AX8B/wG/Ad8B/QIAAfcBewH/At8B/QIAAfsBfwH/
Ae8B/wH7AgAB/QF3Af8B9wHvAfsBgAEAAf8BzwH/AfsC9wX/AfsB/AGfBf8B/QH/AX8Z/wEDAYABAAGA
AQABgAEAAe8BewYAAe8BAwYAAe8B/wYAAe8BAwYAAegBewYAAe8BAwYAAe8B/wYAAcMBAwYAAdgBewYA
AcMBAwGAAQABgAEAAYABABj/Cw==
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wHhAb0BigH/DAADKgFAMAABfwFlAUsB7wHh
Ab0BigH/AfoB6wHSAf8BTQEkAQsB/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AU0BJAEL
Af8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BTQEkAQsB/wF/
AWUBSwHvAeEBvQGKAf8B+gHrAdIB/wFNASQBCwH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8BTQEkAQsB/wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFN
ASQBCwH/AX8BZQFLAe8B4QG9AYoB/wH6AesB0gH/AU0BJAELAf8B4QG9AYoB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wFNASQBCwH/AeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AU0BJAELAf8MAAMqAUAQAAHbAZYBCgH/AdsBlgEKAf8B2wGWAQoB/wHbAZYBCgH/AdsBlgEK
Af8B2wGWAQoB/wgAAX8BZQFLAe8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8BTQEkAQsB/wHhAb0BigH/
AfoB6wHSAf8B3QG5AYcB/wFTASoBEQH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wFNASQBCwH/AfoB6wHSAf8BfwFlAUsB7wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wFNASQBCwH/
AeEBvQGKAf8B+gHrAdIB/wHdAbkBhwH/AVMBKgERAf8BTQEkAQsB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AU0BJAELAf8B+gHrAdIB/wF/AWUBSwHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/
AU0BJAELAf8B4QG9AYoB/wH6AesB0gH/Ad0BuQGHAf8BUwEqAREB/wFNASQBCwH/AfoB6wHSAf8B+gHr
AdIB/wH6AesB0gH/AfoB6wHSAf8BTQEkAQsB/wH6AesB0gH/DAADKgFABAAB2wGWAQoB/wHbAZYBCgH/
AdsBlgEKAf8B2wGWAQoB/xAAAloBWAHACAABfwFlAUsB7wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AU0BJAELAf8B4QG9AYoB/wFNASQBCwH/AfoB6wHSAf8B5wHVAbwB/wHhAb0BigH/AfoB6wHS
Af8B+gHrAdIB/wHhAb0BigH/AXEBTgE1Af8B+gHrAdIB/wF/AWUBSwHvAeEBvQGKAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8BTQEkAQsB/wHhAb0BigH/AU0BJAELAf8B+gHrAdIB/wHnAdUBvAH/AeEBvQGK
Af8B+gHrAdIB/wH6AesB0gH/AeEBvQGKAf8BcQFOATUB/wH6AesB0gH/AX8BZQFLAe8B4QG9AYoB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wFNASQBCwH/AeEBvQGKAf8BTQEkAQsB/wH6AesB0gH/AecB1QG8
Af8B4QG9AYoB/wH6AesB0gH/AfoB6wHSAf8B4QG9AYoB/wFxAU4BNQH/AfoB6wHSAf8MAAMqAUAQAAHb
AZYBCgH/AdsBlgEKAf8B2wGWAQoB/wHbAZYBCgH/AdsBlgEKAf8B2wGWAQoB/wgAAX8BZQFLAe8B4QG9
AYoB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8BTQEkAQsB/wH6AesB0gH/AfoB6wHSAf8BTQEkAQsB/wH6AesB0gH/AfoB6wHSAf8BfwFl
AUsB7wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wFNASQBCwH/AfoB6wHSAf8B+gHrAdIB/wFNASQBCwH/AfoB6wHSAf8B+gHr
AdIB/wF/AWUBSwHvAeEBvQGKAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/AU0BJAELAf8B+gHr
AdIB/wH6AesB0gH/DAADKgFAMAABfwFlAUsB7wHhAb0BigH/AU0BJAELAf8B+gHrAdIB/wFNASQBCwH/
AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AdoBtgGEAf8BTQEk
AQsB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wF/AWUBSwHvAeEBvQGKAf8BTQEkAQsB/wH6AesB0gH/
AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B2gG2
AYQB/wFNASQBCwH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AX8BZQFLAe8B4QG9AYoB/wFNASQBCwH/
AfoB6wHSAf8BTQEkAQsB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHr
AdIB/wHaAbYBhAH/AU0BJAELAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8IAAHbAZYBCgH/AdsBlgEK
Af8B2wGWAQoB/wHbAZYBCgH/CAAB2wGWAQoB/wHbAZYBCgH/AdsBlgEKAf8B2wGWAQoB/wHbAZYBCgH/
AdsBlgEKAf8IAAF/AWUBSwHvAeEBvQGKAf8BTQEkAQsB/wHpAcwBoQH/AU0BJAELAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B9gHnAc4B/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AX8BZQFLAe8B4QG9AYoB/wFNASQBCwH/AekBzAGhAf8BTQEkAQsB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH2AecBzgH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8BfwFlAUsB7wHhAb0BigH/AU0BJAELAf8B6QHMAaEB/wFN
ASQBCwH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfYB5wHO
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wgAAdsBlgEKAf8IAAJaAVgBwAHbAZYBCgH/
AdsBlgEKAf8B2wGWAQoB/xAAAloBWAHACAABfwFlAUsB7wHhAb0BigH/AfoB6wHSAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wF/AWUBSwHvAeEBvQGKAf8B+gHrAdIB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AX8BZQFLAe8B4QG9AYoB/wH6
AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHS
Af8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8B+gHrAdIB/wH6AesB0gH/AfoB6wHSAf8IAAHbAZYBCgH/
AdsBlgEKAf8B2wGWAQoB/wHbAZYBCgH/CAAB2wGWAQoB/wHbAZYBCgH/AdsBlgEKAf8B2wGWAQoB/wHb
AZYBCgH/AdsBlgEKAf8MAAGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFW
AQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/
AagBVgEEAf8BqAFWAQQB/wQAAagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGo
AVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEE
Af8BqAFWAQQB/wGoAVYBBAH/BAABqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/
AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFWAQQB/wGoAVYBBAH/AagBVgEEAf8BqAFW
AQQB/wGoAVYBBAH/AagBVgEEAf//AP8A/wADAAFCAU0BPgcAAT4DAAEoAwABQAMAATADAAEBAQABAQUA
AYABARYAA/8BAAb/AgAB+wP/AccB8wIAAfIB/wHAAQEB3wH9AgAB5gH/AcABAQHZAS0CAAHMAf8BwAEB
AfgBxwIAAcAB/wHAAQEB+AFfAgABwAF/AfwBLwL/AgABoAEfAfwBDwHiAQMCAAHoAQ8B9AEPAfABUwIA
AfgBBwHwAQ8B4AEHAgAB/wGBAfoBHwHwAQcCAAH/AfAB+AH7AdgBPQIAAf8B+AH+ATsB3AEdAgAC/wHn
AfMBxwHxAgAG/wIABv8CAAz/Ab8B/wH8AZ8BgAEAAfwBHwHPAf8B8wFnAgAB+wHvAfcB/wHvAfsCAAH3
Af8B+wL/AfsCAAL3Af0B/wHfAf0CAAH/AfcB/gH/Ad8B/QIAAf8BfwH/AX8BvwH7AgAB/wF/Af8BvwHf
Af0CAAH3AXsB/wLfAf0CAAH7AX8B/wHvAf8B+wIAAf0BdwH/AfcB7wH7AYABAAH/Ac8B/wH7AvcF/wH7
AfwBnwX/Af0B/wF/Gf8BAwGAAQABgAEAAYABAAHvAXsGAAHvAQMGAAHvAf8GAAHvAQMGAAHoAXsGAAHv
AQMGAAHvAf8GAAHDAQMGAAHYAXsGAAHDAQMBgAEAAYABAAGAAQAY/ws=
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

View File

@@ -89,19 +89,19 @@ namespace ToolLib.VisionJob
public void InitJob(VisionJob myJob)
{
if(myJob.L_toolList.Count > 0)
myJob.GetJobTree().ImageList = FormToolBox.Instance.imageListTool;
if (myJob.L_toolList.Count > 0)
{
ReCoverJob(myJob);
}
myJob.GetJobTree().Dock = DockStyle.Fill;
myJob.GetJobTree().ImageList = FormToolBox.Instance.imageListTool;
myJob.GetJobTree().Font = new Font("微软雅黑", 9, FontStyle.Bold);
myJob.GetJobTree().Scrollable = true;
myJob.GetJobTree().ItemHeight = 20;
myJob.GetJobTree().ShowLines = false;
myJob.GetJobTree().AllowDrop = true;
//myTreeView.ImageList = Job.imageList;
// 在窗体UI出现变化时更新画线
myJob.GetJobTree().AfterSelect += myJob.tvw_job_AfterSelect;
@@ -198,7 +198,7 @@ namespace ToolLib.VisionJob
/// <summary>
/// 恢复工具之间的关系和连线
/// </summary>
private void ReCoverJob(VisionJob myJob)
private void ReCoverJob(VisionJob myJob, ImageList inputImageList = null)
{
//反序列化各工具
myJob.D_itemAndSource.Clear();
@@ -223,14 +223,12 @@ namespace ToolLib.VisionJob
string toolNodeText = Regex.Split(myJob.L_toolList[i].toolInput[j].value.ToString(), "->")[0].Substring(3);
string a = myJob.L_toolList[i].toolInput[j].value.ToString();
string toolIONodeText = "-->" + Regex.Split(myJob.L_toolList[i].toolInput[j].value.ToString(), "->")[1];
TreeNode bbb = myJob.GetToolIONodeByNodeText(toolNodeText, toolIONodeText);
myJob.D_itemAndSource.Add(treeNode, myJob.GetToolIONodeByNodeText(toolNodeText, toolIONodeText));
}
if (myJob.L_toolList[i].toolType == ToolType.Output)
{
string toolNodeText = Regex.Split(treeNode.Text, "->")[0].Substring(3);
string toolIONodeText = Regex.Split(treeNode.Text, "->")[1];
TreeNode aaa = myJob.GetToolIONodeByNodeText(toolNodeText, "-->" + toolIONodeText);
myJob.D_itemAndSource.Add(treeNode, myJob.GetToolIONodeByNodeText(toolNodeText, "-->" + toolIONodeText));
}
}

View File

@@ -88,7 +88,6 @@ namespace ToolLib.VisionJob
IToolInfo insertTool = VisionToolFactory.CreateToolVision(tool, toolName);
TreeNode insertNode = new TreeNode();
insertNode = GetJobTree(jobName).Nodes.Add("", insertTool.toolName, (int)tool, (int)tool); // 该工具对应的节点
// 判断节点是否添加默认输入输出图
// 输入
for (int i = 0; i < insertTool.toolInput.Count; i++)

View File

@@ -83,12 +83,8 @@
<Project>{df3d4d4c-02df-4f92-9fd4-0a861f64b0ef}</Project>
<Name>DataStruct</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\LogForm\LogForm.csproj">
<Project>{6b38d68f-e77b-4761-bde5-a261ea8925dd}</Project>
<Name>LogForm</Name>
</ProjectReference>
<ProjectReference Include="..\ToolLib.Log\Logger\Logger.csproj">
<Project>{d4e052b9-e541-4b67-a1f9-273073ef1d4b}</Project>
<Project>{D4E052B9-E541-4B67-A1F9-273073EF1D4B}</Project>
<Name>Logger</Name>
</ProjectReference>
</ItemGroup>

View File

@@ -420,7 +420,8 @@ namespace ToolLib.VisionJob
{
if ((item1.Value.Bounds.X < maxLength && item1.Key.Bounds.X < maxLength) || (item1.Value.Bounds.X < maxLength && item1.Key.Bounds.X < maxLength))
{
max += (15 - Math.Abs(max - item.Key));
if (item1.Value.Bounds.Y > startNode.Bounds.Y || item1.Key.Bounds.Y > startNode.Bounds.Y) //20200612加
max += (10 - Math.Abs(max - item.Key));
}
}
}

View File

@@ -65,6 +65,10 @@
<Project>{F5669FB7-77EC-44B9-898B-6D575B7D26EA}</Project>
<Name>HalconTool</Name>
</ProjectReference>
<ProjectReference Include="..\PMAlignTool\PMAlignTool.csproj">
<Project>{C1C08195-2EC8-42E9-93BB-D5331E6C6687}</Project>
<Name>PMAlignTool</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -2,6 +2,7 @@
using CommonMethods;
using FindLineTool;
using HalconTool;
using PMAlignTool;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -104,4 +105,30 @@ namespace VisionJobFactory
{
}
[Serializable]
[VisionToolAttribute(ToolType.PMAlignTool)]
public class PMAlignToolToolInterface : IToolInfo
{
ToolIO inputImage = new ToolIO("InputImage", null, DataType.Image);
ToolIO outPose = new ToolIO("GetPose", null, DataType.Pose);
public PMAlignToolToolInterface(string toolName)
{
enable = true;
toolType = ToolType.PMAlignTool;
this.toolName = toolName;
tool = new PMAlign();
FormToolName = "PMAlignTool.FormPMAlignTool";
FormTool = null;
toolInput = new List<ToolIO>() { inputImage };
toolOutput = new List<ToolIO>() { outPose };
}
/// <summary>
/// 只获取选择工具的描述信息
/// </summary>
public PMAlignToolToolInterface()
{
toolDescription = "模板匹配工具,可得到根据图像捕获特征的姿态";
}
}
}

View File

@@ -0,0 +1,73 @@
namespace Controls
{
partial class CButton
{
/// <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.btn_button = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btn_button
//
this.btn_button.BackgroundImage = global::Controls.Properties.Resources.ButtonUp;
this.btn_button.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.btn_button.Dock = System.Windows.Forms.DockStyle.Fill;
this.btn_button.FlatAppearance.BorderSize = 0;
this.btn_button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btn_button.ForeColor = System.Drawing.Color.White;
this.btn_button.Location = new System.Drawing.Point(0, 0);
this.btn_button.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.btn_button.Name = "btn_button";
this.btn_button.Size = new System.Drawing.Size(67, 28);
this.btn_button.TabIndex = 0;
this.btn_button.Text = "Button";
this.btn_button.UseVisualStyleBackColor = true;
this.btn_button.Click += new System.EventHandler(this.btn_button_Click);
this.btn_button.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btn_button_MouseDown);
this.btn_button.MouseEnter += new System.EventHandler(this.btn_button_MouseEnter);
this.btn_button.MouseLeave += new System.EventHandler(this.btn_button_MouseLeave);
this.btn_button.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btn_button_MouseUp);
//
// CButton
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.btn_button);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.Name = "CButton";
this.Size = new System.Drawing.Size(67, 28);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btn_button;
}
}

View File

@@ -0,0 +1,67 @@
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;
using Controls.Properties;
namespace Controls
{
public delegate void DClicked();
public partial class CButton : UserControl
{
public CButton()
{
InitializeComponent();
btn_button.Text = TextStr;
}
/// <summary>
/// 点击事件
/// </summary>
public event DClicked Clicked;
/// <summary>
/// 文本
/// </summary>
private string _textStr = "Button";
public string TextStr
{
get { return _textStr; }
set
{
_textStr = value;
btn_button.Text = value;
}
}
private void btn_button_MouseEnter(object sender, EventArgs e)
{
btn_button.BackgroundImage = Resources.ButtonEnter;
Application.DoEvents();
}
private void btn_button_MouseDown(object sender, MouseEventArgs e)
{
btn_button.BackgroundImage = Resources.ButtonDown;
Application.DoEvents();
}
private void btn_button_MouseLeave(object sender, EventArgs e)
{
btn_button.BackgroundImage = Resources.ButtonUp;
Application.DoEvents();
}
private void btn_button_MouseUp(object sender, MouseEventArgs e)
{
btn_button.BackgroundImage = Resources.ButtonUp;
Application.DoEvents();
}
private void btn_button_Click(object sender, EventArgs e)
{
if (Clicked != null)
Clicked();
}
}
}

View File

@@ -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>

View File

@@ -0,0 +1,76 @@
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;
using Controls.Properties;
namespace Controls
{
public delegate void DCheckChanged(bool Checked);
public partial class CCheckBox : UserControl
{
public CCheckBox()
{
InitializeComponent();
ckb_box.Text = TextStr;
}
/// <summary>
/// 状态改变事件
/// </summary>
public event DCheckChanged CheckChanged;
/// <summary>
/// 勾选状态
/// </summary>
private bool _checked = false;
public bool Checked
{
get { return _checked; }
set
{
_checked = value;
ckb_box.Checked = value;
}
}
/// <summary>
/// 文本
/// </summary>
private string _textStr = "复选框";
public string TextStr
{
get { return _textStr; }
set
{
_textStr = value;
ckb_box.Text = value;
}
}
private void pic_image_Click(object sender, EventArgs e)
{
ckb_box.Checked = !ckb_box.Checked;
}
private void ckb_box_CheckedChanged(object sender, EventArgs e)
{
if (ckb_box.Checked)
{
pic_image.Image = Resources.;
Checked = true;
}
else
{
pic_image.Image = Resources.;
Checked = false;
}
if (CheckChanged != null)
CheckChanged(ckb_box.Checked);
}
}
}

View File

@@ -0,0 +1,85 @@
namespace Controls
{
partial class CCheckBox
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CCheckBox));
this.pic_image = new System.Windows.Forms.PictureBox();
this.ckb_box = new System.Windows.Forms.CheckBox();
((System.ComponentModel.ISupportInitialize)(this.pic_image)).BeginInit();
this.SuspendLayout();
//
// pic_image
//
this.pic_image.Image = ((System.Drawing.Image)(resources.GetObject("pic_image.Image")));
this.pic_image.Location = new System.Drawing.Point(1, 1);
this.pic_image.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.pic_image.Name = "pic_image";
this.pic_image.Size = new System.Drawing.Size(18, 18);
this.pic_image.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pic_image.TabIndex = 0;
this.pic_image.TabStop = false;
this.pic_image.Click += new System.EventHandler(this.pic_image_Click);
//
// ckb_box
//
this.ckb_box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ckb_box.BackColor = System.Drawing.Color.White;
this.ckb_box.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.ckb_box.Location = new System.Drawing.Point(5, 1);
this.ckb_box.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.ckb_box.Name = "ckb_box";
this.ckb_box.Size = new System.Drawing.Size(161, 23);
this.ckb_box.TabIndex = 1;
this.ckb_box.Text = "复选框";
this.ckb_box.UseVisualStyleBackColor = false;
this.ckb_box.CheckedChanged += new System.EventHandler(this.ckb_box_CheckedChanged);
//
// CCheckBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.pic_image);
this.Controls.Add(this.ckb_box);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.Name = "CCheckBox";
this.Size = new System.Drawing.Size(167, 20);
((System.ComponentModel.ISupportInitialize)(this.pic_image)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PictureBox pic_image;
private System.Windows.Forms.CheckBox ckb_box;
}
}

View File

@@ -0,0 +1,145 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pic_image.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAABGFJREFUeF7t
nYFR20AQRSnBJVBCOgglpIPQQdxBKIEOoBKTDkgHSQdJB8n/mTXjEYJIp7vT7u3/M29gQNrz+D9sy9jy
laIoiqIoiqIoiqIU5unp6fp0On0U7eB1bFf3/uGFAV/AM/gjusLrnNd9fyGw6AE8gLkLJvrDLg5WT9tg
oRvwyxYWfmAnH6ymNsECtxcLCp/cWl11g8H8y59bUPij7i0BBvI+Xzf7cWBX9R4TYNjjxXARg0erb1sw
iId6cwsI/2w/RMSQ42SoiMPRaiwPhuhJnrg8W43lmRkqAmE1lgUDdP8fn/LHAdhZx/7xubE614c7T4aJ
eEiA5EiA5EiA5EiA5EiA5EiA5EiA5EiA5EiA5EiA5EiA5EiA5EiA5EiA5EgAb5xOp5/4ylda3+H7b5e/
a4AE8ALK/o2vr965g5/xXdWtRJAAHrDy333HDrb5Pt2vAhJgb5aUz3Cby/0qIQH2ZGn552B7Pj6YnVWI
BNiLteUz2Kf2YwEJsAcl5TMSYABKy2emsyogAXqysfy7y1mVkAC92Fh+iyMAIgF6UKH8VifgkACtcVw+
kQAtcV4+kQCtCFA+kQAtCFI+kQCNKLpisV/P8okEaEDRyRixX+/yiQSoTKTyiQSoSLTyiQSoRMTyiQSo
QNTyiV8BcCh1fnHkPb5v/eLIUiKXT/wJYMfQr65Y/IwvjmzxurhSopdPXN4CvHuhnNwajFA+cSfAnY1/
M9jmsPMtwSjlE3cCLLpA2G4vCUYqn/gSwEYvCrbvLcFo5RN3twCrzl2L7XtJMGL5xJ0An2z84mCf1hKM
Wj5xJ8APG78q2K+VBCOXT9wJQB5siVXBfrUlKC2fH6IV5YM0XApA9pYgQ/nErQBkiwRb3kOXpXziWgBS
fB8MCfiU8tzM98hUPnEvAOklQbbySQgBSGsJMpZPwghAWkmQtXwSSgBSW4LM5ZNwApBaEmQvn4QUgGyV
oOjDk7HfSOWTsAKQUgmKPiwR+41WPgktACmSYG2wzojlk/ACkKL34C0N5o9aPhlCAP7XrYkEmDty+WQI
AUh1CTBv9PLJMAKQahJgTobyyVACkM0SYP8s5ZPhBCDFEmC/TOWTIQUgqyXA9tnKJ8MKQBZLgO0ylk+G
FoD8VwL8Pmv5ZHgByJsS4OeZyycpBDjzFfwTAV+vwWdAOea2zUIqAcRrJEByJEByJEByJEByJEByJEBy
JEByJEByJEByJEByJEByJEByJEByJEByJEByJEByJEByJEByNgnA19XNDRVxKDpXwktmBopAWI3lOfU5
VbtoALuzGsuDQcfpYBGGo9VYHgzR44C4bLv/PweD+Nl+cwsIv9xbfduDYTw795LTsQoHWFcHq69OMJCf
kDG7oHDHqrfNLw4G304WEv5oe1o9LLD07NyiI9ZJm7/8abAQ33KtB4Z+uAd17/OXBIvyEPHIJxzsgohO
2HXO52jqHOrVCC8M4D+QRDv8FK4oiqIoiqIoiqLEytXVXycxKra7YoNwAAAAAElFTkSuQmCC
</value>
</data>
</root>

View File

@@ -0,0 +1,134 @@
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;
using Controls.Properties;
namespace Controls
{
public delegate void DSelectedIndexChanged();
public partial class CComboBox : UserControl
{
public CComboBox()
{
InitializeComponent();
cbx_item.Items.AddRange(Items);
}
/// <summary>
/// 选中项改变事件
/// </summary>
public event DSelectedIndexChanged SelectedIndexChanged;
/// <summary>
/// 选中项索引
/// </summary>
private int _selectedIndex = -1;
public int SelectedIndex
{
get { return _selectedIndex; }
set
{
_selectedIndex = value;
cbx_item.SelectedIndex = value;
}
}
/// <summary>
/// 文本
/// </summary>
private string _text = string.Empty;
public string TextStr
{
get { return _text; }
set
{
_text = value;
cbx_item.Text = value;
}
}
/// <summary>
/// 是否可以编辑
/// </summary>
private bool _canEdit = false;
public bool CanEdit
{
get { return _canEdit; }
set
{
_canEdit = value;
if (value)
cbx_item.DropDownStyle = ComboBoxStyle.DropDown;
else
cbx_item.DropDownStyle = ComboBoxStyle.DropDownList;
}
}
/// <summary>
/// 项
/// </summary>
private string[] _items = new string[] { };
public string[] Items
{
get { return _items; }
set
{
_items = value;
cbx_item.Items.Clear();
cbx_item.Items.AddRange(value);
}
}
/// <summary>
/// 删除所有项
/// </summary>
public void Clear()
{
Items = new string[] { };
cbx_item.Items.Clear();
}
/// <summary>
/// 添加项
/// </summary>
/// <param name="item">项</param>
public void Add(string item)
{
string[] items = new string[Items.Length + 1];
for (int i = 0; i < Items.Length; i++)
{
items[i] = Items[i];
}
items[Items.Length] = item;
Items = items;
}
private void cbx_item_SelectedIndexChanged(object sender, EventArgs e)
{
SelectedIndex = cbx_item.SelectedIndex;
TextStr = cbx_item.Text;
if (SelectedIndexChanged != null)
SelectedIndexChanged();
}
private void ComboBox_Enter(object sender, EventArgs e)
{
lbl_line.Height = 2;
lbl_line.BackColor = Color.FromArgb(18, 150, 219);
btn_showItem.Image = Resources.BlueImage;
}
private void ComboBox_Leave(object sender, EventArgs e)
{
lbl_line.Height = 1;
lbl_line.BackColor = Color.Gray;
btn_showItem.Image = Resources.GrayImage;
}
private void btn_showItem_Click(object sender, EventArgs e)
{
cbx_item.DroppedDown = true;
}
}
}

View File

@@ -0,0 +1,108 @@
namespace Controls
{
partial class CComboBox
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CComboBox));
this.cbx_item = new System.Windows.Forms.ComboBox();
this.lbl_line = new System.Windows.Forms.Label();
this.btn_showItem = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// cbx_item
//
this.cbx_item.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.cbx_item.BackColor = System.Drawing.Color.White;
this.cbx_item.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbx_item.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.cbx_item.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.cbx_item.FormattingEnabled = true;
this.cbx_item.Location = new System.Drawing.Point(2, -3);
this.cbx_item.Margin = new System.Windows.Forms.Padding(0);
this.cbx_item.Name = "cbx_item";
this.cbx_item.Size = new System.Drawing.Size(120, 25);
this.cbx_item.TabIndex = 10;
this.cbx_item.TabStop = false;
this.cbx_item.SelectedIndexChanged += new System.EventHandler(this.cbx_item_SelectedIndexChanged);
//
// lbl_line
//
this.lbl_line.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lbl_line.BackColor = System.Drawing.Color.Gray;
this.lbl_line.Location = new System.Drawing.Point(3, 20);
this.lbl_line.Name = "lbl_line";
this.lbl_line.Size = new System.Drawing.Size(120, 1);
this.lbl_line.TabIndex = 11;
//
// btn_showItem
//
this.btn_showItem.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btn_showItem.BackColor = System.Drawing.Color.White;
this.btn_showItem.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.btn_showItem.FlatAppearance.BorderColor = System.Drawing.Color.White;
this.btn_showItem.FlatAppearance.BorderSize = 0;
this.btn_showItem.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Gray;
this.btn_showItem.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkGray;
this.btn_showItem.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btn_showItem.Image = ((System.Drawing.Image)(resources.GetObject("btn_showItem.Image")));
this.btn_showItem.ImageAlign = System.Drawing.ContentAlignment.BottomCenter;
this.btn_showItem.Location = new System.Drawing.Point(103, -1);
this.btn_showItem.Margin = new System.Windows.Forms.Padding(0);
this.btn_showItem.Name = "btn_showItem";
this.btn_showItem.Size = new System.Drawing.Size(17, 20);
this.btn_showItem.TabIndex = 12;
this.btn_showItem.UseVisualStyleBackColor = false;
this.btn_showItem.Click += new System.EventHandler(this.btn_showItem_Click);
//
// CComboBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.btn_showItem);
this.Controls.Add(this.lbl_line);
this.Controls.Add(this.cbx_item);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(0);
this.Name = "CComboBox";
this.Size = new System.Drawing.Size(120, 22);
this.Enter += new System.EventHandler(this.ComboBox_Enter);
this.Leave += new System.EventHandler(this.ComboBox_Leave);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ComboBox cbx_item;
private System.Windows.Forms.Label lbl_line;
private System.Windows.Forms.Button btn_showItem;
}
}

View File

@@ -0,0 +1,128 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btn_showItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAADlJREFUKFNj
6OrqMuju7q7HhkFyYAWdnZ0fgPR/ZAwVM2AAARADWRGKJAzAFGGVhAGQBE5JWgEGBgBpDD29jSJy5QAA
AABJRU5ErkJggg==
</value>
</data>
</root>

View File

@@ -0,0 +1,77 @@
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 Controls
{
public partial class CNumeric : UserControl
{
public CNumeric()
{
InitializeComponent();
tbx_value.Text = _value.ToString();
}
/// <summary>
/// 值改变事件
/// </summary>
public event DValueChanged ValueChanged;
/// <summary>
/// 值
/// </summary>
private string _value = string.Empty;
public string Value
{
get
{
return _value;
}
set
{
_value = value;
tbx_value.Text = value.ToString();
}
}
private void tbx_value_KeyPress(object sender, KeyPressEventArgs e)
{
try
{
/*只能数字键、退格键、负号、小数点*/
if (((int)e.KeyChar < 48 || (int)e.KeyChar > 57) && (int)e.KeyChar != 8 &&
(int)e.KeyChar != 45 && (int)e.KeyChar != 46) e.Handled = true;
/*输入为负号和小数点时,且只能输入一次(负号只能最前面输入,小数点不可最前面输入)*/
if (e.KeyChar == 45 && (((TextBox)sender).SelectionStart != 0 ||
((TextBox)sender).Text.IndexOf("-") >= 0)) e.Handled = true;
if (e.KeyChar == 46 && (((TextBox)sender).SelectionStart == 0 ||
((TextBox)sender).Text.IndexOf(".") >= 0)) e.Handled = true;
}
catch { }
}
private void Numeric_Enter(object sender, EventArgs e)
{
lbl_line.Height = 2;
lbl_line.BackColor = Color.FromArgb(18, 150, 219);
}
private void Numeric_Leave(object sender, EventArgs e)
{
lbl_line.Height = 1;
lbl_line.BackColor = Color.Gray;
}
private void tbx_value_TextChanged(object sender, EventArgs e)
{
if (tbx_value.Text != string.Empty && tbx_value.Text != Value.ToString())
Value = tbx_value.Text;
if (ValueChanged != null)
ValueChanged(Convert.ToDouble(Value));
}
}
}

View File

@@ -0,0 +1,79 @@
namespace Controls
{
partial class CNumeric
{
/// <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.lbl_line = new System.Windows.Forms.Label();
this.tbx_value = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// lbl_line
//
this.lbl_line.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.lbl_line.BackColor = System.Drawing.Color.Gray;
this.lbl_line.Location = new System.Drawing.Point(0, 20);
this.lbl_line.Name = "lbl_line";
this.lbl_line.Size = new System.Drawing.Size(120, 1);
this.lbl_line.TabIndex = 8;
//
// tbx_value
//
this.tbx_value.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.tbx_value.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.tbx_value.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.tbx_value.Location = new System.Drawing.Point(3, 0);
this.tbx_value.Name = "tbx_value";
this.tbx_value.Size = new System.Drawing.Size(114, 16);
this.tbx_value.TabIndex = 9;
this.tbx_value.TextChanged += new System.EventHandler(this.tbx_value_TextChanged);
this.tbx_value.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tbx_value_KeyPress);
//
// CNumeric
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.tbx_value);
this.Controls.Add(this.lbl_line);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.Name = "CNumeric";
this.Size = new System.Drawing.Size(121, 22);
this.Enter += new System.EventHandler(this.Numeric_Enter);
this.Leave += new System.EventHandler(this.Numeric_Leave);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lbl_line;
private System.Windows.Forms.TextBox tbx_value;
}
}

View File

@@ -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>

View File

@@ -0,0 +1,193 @@
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;
using System.Text.RegularExpressions;
using Controls.Properties;
namespace Controls
{
public delegate void DValueChanged(double value);
public partial class CNumericUpDown : UserControl
{
public CNumericUpDown()
{
InitializeComponent();
nud_value.Text = Value.ToString();
}
/// <summary>
/// 值改变事件
/// </summary>
public event DValueChanged ValueChanged;
/// <summary>
/// 点击一下值的变化量
/// </summary>
private decimal _incremeent = 1;
public decimal Incremeent
{
get { return _incremeent; }
set { _incremeent = value; }
}
/// <summary>
/// 小数位数
/// </summary>
private int _decimalPlaces = 0;
public int DecimalPlaces
{
get { return _decimalPlaces; }
set
{
_decimalPlaces = value;
nud_value.DecimalPlaces = value;
}
}
/// <summary>
/// 最小值
/// </summary>
private decimal _minValue = 0;
public decimal MinValue
{
get { return _minValue; }
set
{
_minValue = value;
nud_value.Minimum = value;
}
}
/// <summary>
/// 最大值
/// </summary>
private decimal _maxValue = 100;
public decimal MaxValue
{
get { return _maxValue; }
set
{
_maxValue = value;
nud_value.Maximum = value;
}
}
/// <summary>
/// 值
/// </summary>
private double _value = 0;
public double Value
{
get
{
return _value;
}
set
{
_value = value;
nud_value.Text = value.ToString();
}
}
private void btn_add_MouseEnter(object sender, EventArgs e)
{
try
{
btn_add.BringToFront();
if (nud_value.Value < MaxValue)
{
btn_add.FlatAppearance.MouseDownBackColor = Color.Gray;
btn_add.FlatAppearance.MouseOverBackColor = Color.DarkGray;
btn_add.Image = Resources.blueAdd;
}
else
{
btn_add.FlatAppearance.MouseDownBackColor = Color.White;
btn_add.FlatAppearance.MouseOverBackColor = Color.White;
}
}
catch { }
}
private void btn_add_MouseLeave(object sender, EventArgs e)
{
btn_add.Image = Resources.grayAdd;
}
private void btn_sub_MouseEnter(object sender, EventArgs e)
{
try
{
btn_sub.BringToFront();
if (nud_value.Value >= MinValue)
{
btn_sub.FlatAppearance.MouseDownBackColor = Color.Gray;
btn_sub.FlatAppearance.MouseOverBackColor = Color.DarkGray;
btn_sub.Image = Resources.blueSub;
}
else
{
btn_sub.FlatAppearance.MouseDownBackColor = Color.White;
btn_sub.FlatAppearance.MouseOverBackColor = Color.White;
}
}
catch { }
}
private void btn_add_Click(object sender, EventArgs e)
{
try
{
if (nud_value.Value + Incremeent <= MaxValue)
nud_value.Text = (nud_value.Value + Incremeent).ToString();
if (nud_value.Value >= MaxValue)
{
btn_add.FlatAppearance.MouseDownBackColor = Color.White;
btn_add.FlatAppearance.MouseOverBackColor = Color.White;
btn_add.Image = Resources.grayAdd;
}
}
catch { }
}
private void btn_sub_Click(object sender, EventArgs e)
{
try
{
if (nud_value.Value + Incremeent > MinValue)
nud_value.Text = (nud_value.Value - Incremeent).ToString();
if (nud_value.Value <= MinValue)
{
btn_sub.FlatAppearance.MouseDownBackColor = Color.White;
btn_sub.FlatAppearance.MouseOverBackColor = Color.White;
btn_sub.Image = Resources.graySub;
}
}
catch { }
}
private void nud_value_ValueChanged(object sender, EventArgs e)
{
Value = (double)nud_value.Value;
if (ValueChanged != null)
ValueChanged(Value);
}
private void UserControl1_Leave(object sender, EventArgs e)
{
lbl_line.Height = 1;
lbl_line.BackColor = Color.Gray;
}
private void UserControl1_Enter(object sender, EventArgs e)
{
lbl_line.Height = 2;
lbl_line.BackColor = Color.FromArgb(18, 150, 219);
}
private void btn_sub_MouseLeave(object sender, EventArgs e)
{
btn_sub.Image = Resources.graySub;
}
}
}

View File

@@ -0,0 +1,133 @@
namespace Controls
{
partial class CNumericUpDown
{
/// <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.btn_add = new System.Windows.Forms.Button();
this.btn_sub = new System.Windows.Forms.Button();
this.lbl_line = new System.Windows.Forms.Label();
this.nud_value = new System.Windows.Forms.NumericUpDown();
((System.ComponentModel.ISupportInitialize)(this.nud_value)).BeginInit();
this.SuspendLayout();
//
// btn_add
//
this.btn_add.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btn_add.BackColor = System.Drawing.Color.White;
this.btn_add.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btn_add.FlatAppearance.BorderSize = 0;
this.btn_add.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Gray;
this.btn_add.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkGray;
this.btn_add.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btn_add.Image = global::Controls.Properties.Resources.grayAdd;
this.btn_add.Location = new System.Drawing.Point(119, 0);
this.btn_add.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
this.btn_add.Name = "btn_add";
this.btn_add.Size = new System.Drawing.Size(20, 23);
this.btn_add.TabIndex = 7;
this.btn_add.TabStop = false;
this.btn_add.UseVisualStyleBackColor = false;
this.btn_add.Click += new System.EventHandler(this.btn_add_Click);
this.btn_add.MouseEnter += new System.EventHandler(this.btn_add_MouseEnter);
this.btn_add.MouseLeave += new System.EventHandler(this.btn_add_MouseLeave);
//
// btn_sub
//
this.btn_sub.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btn_sub.BackColor = System.Drawing.Color.White;
this.btn_sub.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btn_sub.FlatAppearance.BorderSize = 0;
this.btn_sub.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Gray;
this.btn_sub.FlatAppearance.MouseOverBackColor = System.Drawing.Color.DarkGray;
this.btn_sub.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btn_sub.Image = global::Controls.Properties.Resources.graySub;
this.btn_sub.Location = new System.Drawing.Point(101, 0);
this.btn_sub.Margin = new System.Windows.Forms.Padding(14, 20, 14, 20);
this.btn_sub.Name = "btn_sub";
this.btn_sub.Size = new System.Drawing.Size(20, 23);
this.btn_sub.TabIndex = 6;
this.btn_sub.TabStop = false;
this.btn_sub.UseVisualStyleBackColor = false;
this.btn_sub.Click += new System.EventHandler(this.btn_sub_Click);
this.btn_sub.MouseEnter += new System.EventHandler(this.btn_sub_MouseEnter);
this.btn_sub.MouseLeave += new System.EventHandler(this.btn_sub_MouseLeave);
//
// lbl_line
//
this.lbl_line.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lbl_line.BackColor = System.Drawing.Color.Gray;
this.lbl_line.Location = new System.Drawing.Point(3, 24);
this.lbl_line.Name = "lbl_line";
this.lbl_line.Size = new System.Drawing.Size(137, 1);
this.lbl_line.TabIndex = 5;
//
// nud_value
//
this.nud_value.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.nud_value.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.nud_value.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.nud_value.Location = new System.Drawing.Point(6, 4);
this.nud_value.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.nud_value.Name = "nud_value";
this.nud_value.Size = new System.Drawing.Size(130, 19);
this.nud_value.TabIndex = 8;
this.nud_value.ValueChanged += new System.EventHandler(this.nud_value_ValueChanged);
//
// CNumericUpDown
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.btn_add);
this.Controls.Add(this.btn_sub);
this.Controls.Add(this.lbl_line);
this.Controls.Add(this.nud_value);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.MaximumSize = new System.Drawing.Size(300, 26);
this.MinimumSize = new System.Drawing.Size(50, 26);
this.Name = "CNumericUpDown";
this.Size = new System.Drawing.Size(140, 26);
this.Enter += new System.EventHandler(this.UserControl1_Enter);
this.Leave += new System.EventHandler(this.UserControl1_Leave);
((System.ComponentModel.ISupportInitialize)(this.nud_value)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btn_add;
private System.Windows.Forms.Button btn_sub;
private System.Windows.Forms.Label lbl_line;
private System.Windows.Forms.NumericUpDown nud_value;
}
}

View File

@@ -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>

View File

@@ -0,0 +1,75 @@
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;
using Controls.Properties;
namespace Controls
{
public partial class CRadioBox : UserControl
{
public CRadioBox()
{
InitializeComponent();
ckb_box.Text = TextStr;
}
/// <summary>
/// 状态改变事件
/// </summary>
public event DCheckChanged CheckChanged;
/// <summary>
/// 勾选状态
/// </summary>
private bool _checked = false;
public bool Checked
{
get { return _checked; }
set
{
_checked = value;
ckb_box.Checked = value;
}
}
/// <summary>
/// 文本
/// </summary>
private string _textStr = "复选框";
public string TextStr
{
get { return _textStr; }
set
{
_textStr = value;
ckb_box.Text = value;
}
}
private void pic_image_Click(object sender, EventArgs e)
{
ckb_box.Checked = !ckb_box.Checked;
}
private void ckb_box_CheckedChanged(object sender, EventArgs e)
{
if (ckb_box.Checked)
{
pic_image.Image = Resources.;
Checked = true;
}
else
{
pic_image.Image = Resources.;
Checked = false;
}
if (CheckChanged != null)
CheckChanged(ckb_box.Checked);
}
}
}

View File

@@ -0,0 +1,86 @@
namespace Controls
{
partial class CRadioBox
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CRadioBox));
this.pic_image = new System.Windows.Forms.PictureBox();
this.ckb_box = new System.Windows.Forms.CheckBox();
((System.ComponentModel.ISupportInitialize)(this.pic_image)).BeginInit();
this.SuspendLayout();
//
// pic_image
//
this.pic_image.Image = ((System.Drawing.Image)(resources.GetObject("pic_image.Image")));
this.pic_image.Location = new System.Drawing.Point(2, 2);
this.pic_image.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.pic_image.Name = "pic_image";
this.pic_image.Padding = new System.Windows.Forms.Padding(1);
this.pic_image.Size = new System.Drawing.Size(20, 20);
this.pic_image.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pic_image.TabIndex = 0;
this.pic_image.TabStop = false;
this.pic_image.Click += new System.EventHandler(this.pic_image_Click);
//
// ckb_box
//
this.ckb_box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ckb_box.BackColor = System.Drawing.Color.White;
this.ckb_box.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.ckb_box.Location = new System.Drawing.Point(7, 4);
this.ckb_box.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.ckb_box.Name = "ckb_box";
this.ckb_box.Size = new System.Drawing.Size(91, 23);
this.ckb_box.TabIndex = 1;
this.ckb_box.Text = "复选框";
this.ckb_box.UseVisualStyleBackColor = false;
this.ckb_box.CheckedChanged += new System.EventHandler(this.ckb_box_CheckedChanged);
//
// RadioBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.pic_image);
this.Controls.Add(this.ckb_box);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.Name = "RadioBox";
this.Size = new System.Drawing.Size(97, 24);
((System.ComponentModel.ISupportInitialize)(this.pic_image)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PictureBox pic_image;
private System.Windows.Forms.CheckBox ckb_box;
}
}

View File

@@ -0,0 +1,157 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pic_image.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAByJJREFUeF7t
netRJTcQhQnBITgEMrAzWDJYMoAMzL8t4AdkgDMwGUAGOAOTAWSwPofq67rIgouk1nPOqfrqsgsjtdSt
x0iauUeSJEmSJEmSJElr6+bm5perq6vfYvz48eNX+zNpVtGJ5tCzy8vLG3w+4PMffP5M5AXw2pvr6+s/
8LMCZESxRcNB38zZT+a8algw3eHzuwKik6yVn4HqDj8EA8KC79jMk2qILZ2tDvwVOmEgGJBntNXMlkpl
rf0OcEyOVfqo3GmIKNCe42OVOxMPmKP8bsWSDmkhx4coEA7JbrdilbcMnDBqjhCILYOz6ViFLcoLJ7RW
/O3KZvYjz+pr87DZiSJbPSpgtpl9DdgbnFi1bENbGOtT4dzAqmddsctHYR/Cwov/eFp2SEDhjlnAvcKK
OBwW11pWZoGsYLECi/+zThBospcN6+zUqnFOsQB7BRJ5zBkEMJzdfqxAIp25ggAGa8z3ZZ45AQ01g2MF
EfmMHwS2tLulNf3WvAy9kQQDtchTnwer7rGEln8RMVZUgHVt1T6G7F4/aqyoA+vcqr+vbH1fk772jDEf
QHe05f383vSdD8D5JxGjREPoA3NHW+mWbwzogy5DATLWrH8Q6AtzSxvZ0e2oMaIPTQ+SIOL+jBkh0kA9
vuLzFpzyto7g/05Yv/a76HUxeI25p67U+n2gwz4bu+32+jG87jOa9AI0PJa5SOLL27v42y8HQfVeQK3f
haS9fdZ5ynBQtRdQ6y8m62BHSr3jb+vcEdiYpCXffLJP9dCpkfQ+4sUu8xUS1vm+TODAc6vGLOH61BVX
/yNkSFR7/Rmw+7YqzFZiD0Du7VIfafKXh4fzKaYTS/8zXJeHkSAXK6IZiThezqeQVvKeC64pGnbeCQnq
ka4EnJ1/HsvjCzxaEmWy2X8sAxHB0/k29GbfebkMA0hIs/8v4ul8a3hFPS/sKT8rwELFEhfvGc35xq0l
mS8UTIc+DjCo88mTJZsn3f4dZmDnv1E0D9Bx788Z3fmk6Pg4CqhjXx8wg/ON/GVhXOy2AIQKe2WlgXPA
Uy8MrqQDD6PAclgVFauy82lr/u4gEvBy0P1H+9R2DOrvyDWj4rbOXtv5Rv6CEC4u3v79amvh38WuHwkG
atGkak+NnE/y7wQiiaWS1FpGDgJP51NIs9nuqmWZrlhiKeQcTxoxCCo4v+nb0C3bNDmsAWSPlSMFwezO
J5Z1mkrXAFBxRWfTRgiCFZxPstYCegcA1TMIVnE+6RUALvfKPYJgJeeTLgEA3F5g0DIIVnM+6RUALsMA
RYfQMbE8PFnR+aRbABgu77arHQSrOp9kBQAu9HrVq9tQUCsIVna+kdcIIwnl8jRqEGzA+f1WAgNGDILn
1Z1PzLx04eLnMLFChgkCXMsnbt3evYu0hnQ+MRPThYtr7Nd3D4ItOR8UbQfXeiKoWxBszPksb/6CHC6u
eSSseRBszfmEPjRz0+W4FvARzYJgi84nKHf+wyGNjoVXD4KtOt8oKzcS8L4TiFH2AMOekNaxOfwt7S07
n2U3s/OFRFptxNxZlsVCWm9BsGXnG+UHWFGJLV8I7RoExP5ZLNpmNk4DfFf+jgCOq7HEK+IWBF6iTYGN
U5BzJjMqRFLyYkshwwQBbQlsm4VnK0K52JVEMqhN9yCgDYFN0wCfuT291PMp4W5BwLwDW2bDbf7zJiTY
6zm+5kHAPAMbZsOv+98JifZ8VUyzIGBeQd7T4TL7D9XhbiCkehAwjyDPKXGb/YfixCKWYUOqBQHTDvKa
Fd+3hO6r42RwH/cgYJpBHtOSdQA0RQP0AsQtCJhWkPbM+Lwc8jMN0guQ4iBgGkGaU1O99e+EzO7DzDuR
HQS8Nkhrduq3/p0G6gXIQ8p5ArubWc357Vr/TpgLjPQGsRfYc/Dki51wavFalqZwXmZFbCdrSS0Oi6Tw
hMr4vt8jsLeC47/hd0t+4QXK+5rSA7qKrS5mlGiK/9fDpAgGTPmuv0VoN/H7SOx+2A1FjBMVsTr33fHL
lU2uooaKOnD4teofQzBI7xVuR/n3ANQQgqD10bHNwTq26h5Pg94aLgPH/WpbvV6Coe8ezBA+WJ2OMek7
JBqqIPBjKufvBKO1SORH38WeXNHwoCAinTmdvxPXCDQcpGN1Nrfzd0JBNCdIYMox/5BYIAXBYZZ0/k62
TqDNo4957La121KIci0bB7BOrHq2IRSYXx23+SGBddD8ONcosrOFWx4SttHlHxJ7A1TGlvYQnllmK75E
2QSx1osphwGOv1Cr/0QcFlBJIzx95ArLNPxO3khaJRDk+ELNGAiw9+2LsuV4R9kc4RQVO/KpIz4yd6ox
vrLYslDRtyMEA20A52rtnbTXM3CYqH4raUHH4DtRSx9QbIm2Bc1X2/G28hE/56w4Mph47QXTYppy+AKi
E+nMGHKwJEmSJEmSJEmr6+joX4ihrIv2m0xeAAAAAElFTkSuQmCC
</value>
</data>
</root>

View File

@@ -0,0 +1,190 @@
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;
using Controls.Properties;
namespace Controls
{
public delegate void DTextStrChanged(string textStr);
public partial class CTextBox : UserControl
{
public CTextBox()
{
InitializeComponent();
tbx_text.Text = DefaultText;
//if (PasswordChar && tbx_text.Text != DefaultText)
//{
//}
//else
//{
//}
//if (PasswordChar)
//{
// tbx_text.PasswordChar = '*';
// btn_eye.Visible = true;
//}
//else
//{
//}
if (!PasswordChar)
{
tbx_text.PasswordChar = '\0';
btn_eye.Visible = false;
}
else
{
tbx_text.PasswordChar = '\0';
btn_eye.Visible = true ;
}
}
/// <summary>
/// 文本改变事件
/// </summary>
public event DTextStrChanged TextStrChanged;
/// <summary>
/// 控件文本
/// </summary>
private string _text = string.Empty;
public string TextStr
{
get
{
return _text;
}
set
{
if (value == string.Empty)
{
tbx_text.PasswordChar = '\0';
tbx_text.ForeColor = Color.DarkGray;
tbx_text.Text = DefaultText;
_text = value;
}
else
{
if (PasswordChar)
tbx_text.PasswordChar = '*';
else
tbx_text.PasswordChar = '\0';
tbx_text.ForeColor = Color.FromArgb(64, 64, 64);
_text = value;
tbx_text.Text = _text;
}
}
}
/// <summary>
/// 默认文本
/// </summary>
private string _defaultText = string.Empty;
public string DefaultText
{
get { return _defaultText; }
set { _defaultText = value; }
}
/// <summary>
/// 是否以密码形式显示
/// </summary>
private bool _passwordChar = false;
public bool PasswordChar
{
get { return _passwordChar; }
set
{
_passwordChar = value;
if (PasswordChar)
{
tbx_text.PasswordChar = '*';
}
else
{
tbx_text.PasswordChar = '\0';
}
}
}
private void TextBox_Enter(object sender, EventArgs e)
{
lbl_line.Height = 2;
lbl_line.BackColor = Color.FromArgb(18, 150, 219);
if (tbx_text.Text == DefaultText)
{
tbx_text.SelectionStart = 0;
tbx_text.SelectionLength = 0;
}
}
private void TextBox_Leave(object sender, EventArgs e)
{
lbl_line.Height = 1;
lbl_line.BackColor = Color.Gray;
}
private void tbx_text_TextChanged(object sender, EventArgs e)
{
if (tbx_text.Text != DefaultText && tbx_text.Text != TextStr)
TextStr = tbx_text.Text;
if (TextStrChanged != null)
TextStrChanged(TextStr);
if (PasswordChar && TextStr != string.Empty)
tbx_text.PasswordChar = '*';
else if (TextStr ==string .Empty )
tbx_text.PasswordChar = '\0';
}
private void tbx_text_KeyDown(object sender, KeyEventArgs e)
{
if (tbx_text.Text == DefaultText && e.KeyCode != Keys.Back)
tbx_text.Text = string.Empty;
}
private void tbx_text_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (tbx_text.Text == DefaultText)
{
tbx_text.SelectionStart = 0;
tbx_text.SelectionLength = 0;
}
}
}
private void btn_eye_MouseDown(object sender, MouseEventArgs e)
{
tbx_text.PasswordChar = '\0';
btn_eye.BackgroundImage = Resources.Show;
//tbx_text.Width = tbx_text.Width - 30;
}
private void btn_eye_MouseUp(object sender, MouseEventArgs e)
{
if (TextStr != string.Empty)
tbx_text.PasswordChar = '*';
btn_eye.BackgroundImage = Resources.Hide;
tbx_text.Width = tbx_text.Width + 30;
tbx_text.Focus();
tbx_text.SelectionStart = 0;
tbx_text.SelectionLength = 0;
}
private void TextBox_Load(object sender, EventArgs e)
{
if (!PasswordChar)
{
tbx_text.PasswordChar = '\0';
btn_eye.Visible = false;
}
else
{
tbx_text.PasswordChar = '\0';
btn_eye.Visible = true ;
}
}
}
}

108
UsingControl/Controls/CTextBox.designer.cs generated Normal file
View File

@@ -0,0 +1,108 @@
namespace Controls
{
partial class CTextBox
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CTextBox));
this.lbl_line = new System.Windows.Forms.Label();
this.tbx_text = new System.Windows.Forms.TextBox();
this.btn_eye = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// lbl_line
//
this.lbl_line.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.lbl_line.BackColor = System.Drawing.Color.Gray;
this.lbl_line.Location = new System.Drawing.Point(2, 20);
this.lbl_line.Name = "lbl_line";
this.lbl_line.Size = new System.Drawing.Size(133, 1);
this.lbl_line.TabIndex = 10;
//
// tbx_text
//
this.tbx_text.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.tbx_text.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.tbx_text.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.tbx_text.Location = new System.Drawing.Point(6, 1);
this.tbx_text.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
this.tbx_text.Name = "tbx_text";
this.tbx_text.Size = new System.Drawing.Size(125, 16);
this.tbx_text.TabIndex = 9;
this.tbx_text.TextChanged += new System.EventHandler(this.tbx_text_TextChanged);
this.tbx_text.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbx_text_KeyDown);
this.tbx_text.MouseUp += new System.Windows.Forms.MouseEventHandler(this.tbx_text_MouseUp);
//
// btn_eye
//
this.btn_eye.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btn_eye.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btn_eye.BackgroundImage")));
this.btn_eye.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btn_eye.FlatAppearance.BorderSize = 0;
this.btn_eye.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btn_eye.Location = new System.Drawing.Point(110, 1);
this.btn_eye.Name = "btn_eye";
this.btn_eye.Size = new System.Drawing.Size(21, 18);
this.btn_eye.TabIndex = 11;
this.btn_eye.TabStop = false;
this.btn_eye.UseVisualStyleBackColor = true;
this.btn_eye.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btn_eye_MouseDown);
this.btn_eye.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btn_eye_MouseUp);
//
// CTextBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.btn_eye);
this.Controls.Add(this.lbl_line);
this.Controls.Add(this.tbx_text);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.MaximumSize = new System.Drawing.Size(400, 22);
this.MinimumSize = new System.Drawing.Size(20, 22);
this.Name = "CTextBox";
this.Size = new System.Drawing.Size(137, 22);
this.Load += new System.EventHandler(this.TextBox_Load);
this.Enter += new System.EventHandler(this.TextBox_Enter);
this.Leave += new System.EventHandler(this.TextBox_Leave);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lbl_line;
private System.Windows.Forms.TextBox tbx_text;
private System.Windows.Forms.Button btn_eye;
}
}

View File

@@ -0,0 +1,131 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btn_eye.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABGdBTUEAALGPC/xhBQAAAPxJREFUOE/N
kj0KwlAQhHMEj+ARvIDghfIH3sLG0sqktBcsxc5KCVjYKIhIbAQjgrZ+89zEKNhnYNid3XlvN494zUIU
RR1LHX71X8gYhuGD2LaSh76geya/EQTBAMNaOaYW+Ym4iuN4TJyhb6pbPxWVOyDaGM5wS54rJy5KWk+c
owvf97t2tJq2gXu26EvDFL2EE2nVyXfkB2k7+l7FGtVqaH2nq8Op1TVEvs/aKuhmkzJpXWdQlHYNYBsc
TTrDkIImuRcmH5lOYA7Li8q3GUlXoDClWcgoExxCt4HpRBfKZ0e+YY+VYXgSr/Bei1n90/4Coyb1aqx+
mCbA816Kvb06q+4cHAAAAABJRU5ErkJggg==
</value>
</data>
</root>

View File

@@ -0,0 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{6D2088CB-161B-47FB-9C35-0EE8DE61A3DF}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Controls</RootNamespace>
<AssemblyName>Controls</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CButton.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CButton.Designer.cs">
<DependentUpon>CButton.cs</DependentUpon>
</Compile>
<Compile Include="CCheckBox.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CCheckBox.designer.cs">
<DependentUpon>CCheckBox.cs</DependentUpon>
</Compile>
<Compile Include="CComboBox.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CComboBox.designer.cs">
<DependentUpon>CComboBox.cs</DependentUpon>
</Compile>
<Compile Include="CNumeric.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CNumeric.designer.cs">
<DependentUpon>CNumeric.cs</DependentUpon>
</Compile>
<Compile Include="CNumericUpDown.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CNumericUpDown.designer.cs">
<DependentUpon>CNumericUpDown.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="CRadioBox.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CRadioBox.designer.cs">
<DependentUpon>CRadioBox.cs</DependentUpon>
</Compile>
<Compile Include="CTextBox.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CTextBox.designer.cs">
<DependentUpon>CTextBox.cs</DependentUpon>
</Compile>
<Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="CButton.resx">
<DependentUpon>CButton.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CCheckBox.resx">
<DependentUpon>CCheckBox.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CComboBox.resx">
<DependentUpon>CComboBox.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CNumeric.resx">
<DependentUpon>CNumeric.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CNumericUpDown.resx">
<DependentUpon>CNumericUpDown.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="CRadioBox.resx">
<DependentUpon>CRadioBox.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CTextBox.resx">
<DependentUpon>CTextBox.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="Resources\复选框.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\去复选框.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\勾选.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\去勾选.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\grayAdd.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\blueSub.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\graySub.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\blueAdd.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\BlueImage.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\GrayImage.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Hide.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Show.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\ButtonDown.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\ButtonEnter.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\ButtonUp.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Controls")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Controls")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("2eb3123a-4223-4587-83e5-2b1cf8508df3")]
// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,213 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace Controls.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Controls.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap blueAdd {
get {
object obj = ResourceManager.GetObject("blueAdd", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap BlueImage {
get {
object obj = ResourceManager.GetObject("BlueImage", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap blueSub {
get {
object obj = ResourceManager.GetObject("blueSub", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap ButtonDown {
get {
object obj = ResourceManager.GetObject("ButtonDown", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap ButtonEnter {
get {
object obj = ResourceManager.GetObject("ButtonEnter", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap ButtonUp {
get {
object obj = ResourceManager.GetObject("ButtonUp", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap grayAdd {
get {
object obj = ResourceManager.GetObject("grayAdd", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap GrayImage {
get {
object obj = ResourceManager.GetObject("GrayImage", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap graySub {
get {
object obj = ResourceManager.GetObject("graySub", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Hide {
get {
object obj = ResourceManager.GetObject("Hide", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Show {
get {
object obj = ResourceManager.GetObject("Show", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap {
get {
object obj = ResourceManager.GetObject("勾选", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap {
get {
object obj = ResourceManager.GetObject("去勾选", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap {
get {
object obj = ResourceManager.GetObject("去复选框", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap {
get {
object obj = ResourceManager.GetObject("复选框", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@@ -0,0 +1,166 @@
<?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>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="blueAdd" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\blueAdd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="BlueImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\BlueImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="blueSub" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\blueSub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="grayAdd" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\grayAdd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="GrayImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\GrayImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="graySub" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\graySub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Hide" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Hide.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Show" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Show.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="勾选" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\勾选.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="去勾选" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\去勾选.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="去复选框" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\去复选框.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="复选框" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\复选框.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ButtonDown" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ButtonDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ButtonEnter" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ButtonEnter.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ButtonUp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ButtonUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Some files were not shown because too many files have changed in this diff Show More