diff --git a/acontrol.cs b/acontrol.cs
new file mode 100644
index 0000000..95aba56
--- /dev/null
+++ b/acontrol.cs
@@ -0,0 +1,292 @@
+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 System.Reflection.Emit;
+using System.Windows.Forms.VisualStyles;
+
+namespace Control2
+{
+ public partial class AdvancedLabel : UserControl
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoEllipsis = true;
+ this.label1.Dock = System.Windows.Forms.DockStyle.Left;
+ this.label1.Location = new System.Drawing.Point(0, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(35, 16);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "label1";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.label1.Click += new System.EventHandler(this.label1_Click);
+ this.label1.Resize += new System.EventHandler(this.label1_Resize);
+ //
+ // label2
+ //
+ this.label2.AutoEllipsis = true;
+ this.label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.label2.Dock = System.Windows.Forms.DockStyle.Right;
+ this.label2.Location = new System.Drawing.Point(56, 0);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(56, 16);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "label2";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.label2.Click += new System.EventHandler(this.label2_Click);
+ //
+ // AdvancedLabel
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.AutoSize = true;
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.MinimumSize = new System.Drawing.Size(70, 16);
+ this.Name = "AdvancedLabel";
+ this.Size = new System.Drawing.Size(112, 16);
+ this.Load += new System.EventHandler(this.AdvancedLabel_Load);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ public AdvancedLabel()
+ {
+ InitializeComponent();
+ }
+
+ public String Txt
+ {
+ get => label1.Text;
+ set
+ {
+ if (InvokeRequired)
+ label1.BeginInvoke((MethodInvoker)(() => label1.Text = value));
+ else
+ label1.Text = value;
+ }
+ }
+ public String Value
+ {
+ get => label2.Text;
+ set
+ {
+ if (InvokeRequired)
+ label2.BeginInvoke((MethodInvoker)(() => label2.Text = value));
+ else
+ label2.Text = value;
+ }
+ }
+ public void Val(T value)
+ {
+ label2.Text = value.ToString();
+ }
+ public Int32 Width1
+ {
+ get => label1.Width;
+ set
+ {
+ Width = value + label2.Width + Space;
+ label1.Width = value;
+ }
+ }
+ public Int32 Width2
+ {
+ get => label2.Width;
+ set
+ {
+ label2.Width = value;
+ Width = value + label1.Width + Space;
+ }
+ }
+ public Int32 Space
+ {
+ get
+ {
+ return Width - label1.Width - label2.Width;
+ }
+ set
+ {
+ Width = value + label1.Width + label2.Width;
+ // label2.Left = value + label1.Width;
+ }
+ }
+ public Int32 LabelWidth
+ {
+ get
+ {
+ return label1.Width + Space + label2.Width;
+ }
+ set
+ {
+ Width = value;
+ }
+ }
+ public System.Drawing.ContentAlignment ValAlign
+ {
+ get
+ {
+ return label2.TextAlign;
+ }
+ set
+ {
+ label2.TextAlign = value;
+ }
+ }
+ public BorderStyle Border
+ {
+ get
+ {
+ return label2.BorderStyle;
+ }
+ set
+ {
+ label2.BorderStyle = value;
+ }
+ }
+ private void label1_Resize(object sender, EventArgs e)
+ {
+ // label2.Top = label1.Top;
+ // label2.Left = label1.Left + label1.Width + 6;
+ }
+
+ private void label1_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ private void AdvancedLabel_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ private void label2_Click(object sender, EventArgs e)
+ {
+
+ }
+ }
+ public class AdvancedRadioButton : CheckBox
+ {
+ public enum Level { Parent, Form };
+
+ [Category("AdvancedRadioButton"),
+ Description("Gets or sets the level that specifies which RadioButton controls are affected."),
+ DefaultValue(Level.Parent)]
+ public Level GroupNameLevel { get; set; }
+
+ [Category("AdvancedRadioButton"),
+ Description("Gets or sets the name that specifies which RadioButton controls are mutually exclusive.")]
+ public string GroupName { get; set; }
+
+ protected override void OnCheckedChanged(EventArgs e)
+ {
+ base.OnCheckedChanged(e);
+
+ if (Checked)
+ {
+ var arbControls = (dynamic)null;
+ switch (GroupNameLevel)
+ {
+ case Level.Parent:
+ if (this.Parent != null)
+ arbControls = GetAll(this.Parent, typeof(AdvancedRadioButton));
+ break;
+ case Level.Form:
+ Form form = this.FindForm();
+ if (form != null)
+ arbControls = GetAll(this.FindForm(), typeof(AdvancedRadioButton));
+ break;
+ }
+ if (arbControls != null)
+ foreach (Control control in arbControls)
+ if (control != this &&
+ (control as AdvancedRadioButton).GroupName == this.GroupName)
+ (control as AdvancedRadioButton).Checked = false;
+ }
+ }
+
+ protected override void OnClick(EventArgs e)
+ {
+ if (!Checked)
+ base.OnClick(e);
+ }
+
+ protected override void OnPaint(PaintEventArgs pevent)
+ {
+ CheckBoxRenderer.DrawParentBackground(pevent.Graphics, pevent.ClipRectangle, this);
+
+ RadioButtonState radioButtonState;
+ if (Checked)
+ {
+ radioButtonState = RadioButtonState.CheckedNormal;
+ if (Focused)
+ radioButtonState = RadioButtonState.CheckedHot;
+ if (!Enabled)
+ radioButtonState = RadioButtonState.CheckedDisabled;
+ }
+ else
+ {
+ radioButtonState = RadioButtonState.UncheckedNormal;
+ if (Focused)
+ radioButtonState = RadioButtonState.UncheckedHot;
+ if (!Enabled)
+ radioButtonState = RadioButtonState.UncheckedDisabled;
+ }
+
+ Size glyphSize = RadioButtonRenderer.GetGlyphSize(pevent.Graphics, radioButtonState);
+ Rectangle rect = pevent.ClipRectangle;
+ rect.Width -= glyphSize.Width;
+ rect.Location = new Point(rect.Left + glyphSize.Width, rect.Top);
+
+ RadioButtonRenderer.DrawRadioButton(pevent.Graphics, new System.Drawing.Point(0, rect.Height / 2 - glyphSize.Height / 2), rect, this.Text, this.Font, this.Focused, radioButtonState);
+ }
+
+ private IEnumerable GetAll(Control control, Type type)
+ {
+ var controls = control.Controls.Cast();
+
+ return controls.SelectMany(ctrl => GetAll(ctrl, type))
+ .Concat(controls)
+ .Where(c => c.GetType() == type);
+ }
+ }
+}
diff --git a/util.cs b/util.cs
index 5f29e00..a99f52b 100644
--- a/util.cs
+++ b/util.cs
@@ -15,6 +15,7 @@ using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Net;
+
namespace UTIL
{
public static class ASMBL
@@ -603,6 +604,7 @@ namespace UTIL
Int32 _tail;
Int32 _length;
Int32 _bufferSize;
+ Int32 _pos;
Object _lock = new object();
public CircularBuffer(Int32 bufferSize)
{
@@ -610,6 +612,18 @@ namespace UTIL
_bufferSize = bufferSize;
_head = bufferSize - 1;
}
+ public Int32 Count
+ {
+ get { return _length; }
+ }
+ public Int32 Head
+ {
+ get { return _head; }
+ }
+ public Int32 Tail
+ {
+ get { return _tail; }
+ }
public bool IsEmpty
{
get { return _length == 0; }
@@ -618,6 +632,10 @@ namespace UTIL
{
get { return _length == _bufferSize; }
}
+ public bool IsNoData
+ {
+ get { return _tail + _pos >= _head; }
+ }
public T Dequeue()
{
lock (_lock)
@@ -630,6 +648,18 @@ namespace UTIL
return dequeued;
}
}
+ public T Peek(int pos)
+ {
+ _pos = pos;
+ lock (_lock)
+ {
+ if (IsEmpty) throw new InvalidOperationException("Queue exhausted");
+ if (_tail + pos > _head) throw new InvalidOperationException("End data");
+
+ T dequeued = _buffer[_tail + pos];
+ return dequeued;
+ }
+ }
private int NextPosition(int position)
{
return (position + 1) % _bufferSize;