From 72c1646109b187adf0c379bbd54ad7498c3a6b4e Mon Sep 17 00:00:00 2001 From: insideq Date: Sat, 3 Feb 2024 15:59:05 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=E2=84=961?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectExcavator/DirectionType.cs | 27 ++ .../ProjectExcavator/DrawningExcavator.cs | 262 ++++++++++++++++++ .../ProjectExcavator/EntityExcavator.cs | 67 +++++ .../ProjectExcavator/Form1.Designer.cs | 39 --- ProjectExcavator/ProjectExcavator/Form1.cs | 10 - .../FormExcavator.Designer.cs | 134 +++++++++ .../ProjectExcavator/FormExcavator.cs | 68 +++++ .../{Form1.resx => FormExcavator.resx} | 50 ++-- ProjectExcavator/ProjectExcavator/Program.cs | 2 +- .../ProjectExcavator/ProjectExcavator.csproj | 17 +- .../Properties/Resources.Designer.cs | 103 +++++++ .../Properties/Resources.resx | 133 +++++++++ .../ProjectExcavator/Resources/arrowDown.png | Bin 0 -> 4866 bytes .../ProjectExcavator/Resources/arrowLeft.png | Bin 0 -> 3859 bytes .../ProjectExcavator/Resources/arrowRight.png | Bin 0 -> 3986 bytes .../ProjectExcavator/Resources/arrowUp.png | Bin 0 -> 4861 bytes 16 files changed, 836 insertions(+), 76 deletions(-) create mode 100644 ProjectExcavator/ProjectExcavator/DirectionType.cs create mode 100644 ProjectExcavator/ProjectExcavator/DrawningExcavator.cs create mode 100644 ProjectExcavator/ProjectExcavator/EntityExcavator.cs delete mode 100644 ProjectExcavator/ProjectExcavator/Form1.Designer.cs delete mode 100644 ProjectExcavator/ProjectExcavator/Form1.cs create mode 100644 ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs create mode 100644 ProjectExcavator/ProjectExcavator/FormExcavator.cs rename ProjectExcavator/ProjectExcavator/{Form1.resx => FormExcavator.resx} (93%) create mode 100644 ProjectExcavator/ProjectExcavator/Properties/Resources.Designer.cs create mode 100644 ProjectExcavator/ProjectExcavator/Properties/Resources.resx create mode 100644 ProjectExcavator/ProjectExcavator/Resources/arrowDown.png create mode 100644 ProjectExcavator/ProjectExcavator/Resources/arrowLeft.png create mode 100644 ProjectExcavator/ProjectExcavator/Resources/arrowRight.png create mode 100644 ProjectExcavator/ProjectExcavator/Resources/arrowUp.png diff --git a/ProjectExcavator/ProjectExcavator/DirectionType.cs b/ProjectExcavator/ProjectExcavator/DirectionType.cs new file mode 100644 index 0000000..417fbd5 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/DirectionType.cs @@ -0,0 +1,27 @@ +namespace ProjectExcavator; + +/// +/// Направление перемещения +/// +public enum DirectionType +{ + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4 +} diff --git a/ProjectExcavator/ProjectExcavator/DrawningExcavator.cs b/ProjectExcavator/ProjectExcavator/DrawningExcavator.cs new file mode 100644 index 0000000..7fbcc3f --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/DrawningExcavator.cs @@ -0,0 +1,262 @@ +namespace ProjectExcavator; + +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningExcavator +{ + /// + /// Класс-сущность + /// + public EntityExcavator? EntityExcavator { get; private set; } + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки автомобиля + /// + private int? _startPosX; + + /// + /// Верхняя координата прорисовки автомобиля + /// + private int? _startPosY; + + /// + /// Ширина прорисовки автомобиля + /// + private readonly int _drawingExcWidth = 120; //дописать ширина + + /// + /// Высота прорисовки автомобиля + /// + private readonly int _drawingExcHeight = 70; //дописать высота + + /// + /// Инициализация свойств + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия обвеса + /// Признак наличия опор + /// Признак наличия ковша + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool prop, bool ladle) + { + EntityExcavator = new EntityExcavator(); + EntityExcavator.Init(speed, weight, bodyColor, additionalColor, bodyKit, prop, ladle); + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + //TODO проверка, что объект "влезает" в размеры поля + //если влезает, сохраняем границы и корректируем позицию объекта, если она уже была установлена + _pictureWidth = width; + _pictureHeight = height; + if (_pictureWidth <= _drawingExcWidth || _pictureHeight <= _drawingExcHeight) + { + _pictureHeight = null; + _pictureWidth = null; + return false; + } + if (_startPosX + _drawingExcWidth > _pictureWidth) + { + _startPosX = _pictureWidth.Value - _drawingExcWidth; + } + if (_startPosY + _drawingExcHeight > _pictureHeight) + { + _startPosY = _pictureHeight.Value - _drawingExcHeight; + } + return true; + } + + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y, int width, int height) + { + //TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы + //то надо изменить координаты, чтобы он оставался в этих границах + if (x >= 0 && x + _drawingExcWidth <= width && y >= 0 && y + _drawingExcWidth <= height) + { + _startPosX = x; + _startPosY = y; + _pictureWidth = width; + _pictureHeight = height; + } + } + + /// + /// Изменение направления движения + /// + /// Направление + /// true - перемещение выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + + switch (direction) + { + //влево + case DirectionType.Left: + if(_startPosX.Value - EntityExcavator.Step > 0) + { + _startPosX -= (int)EntityExcavator.Step; + } + return true; + //вверх + case DirectionType.Up: + if(_startPosY.Value - EntityExcavator.Step > 0) + { + _startPosY -= (int)EntityExcavator.Step; + } + return true; + //вправо + case DirectionType.Right: + if(_startPosX + EntityExcavator.Step < _pictureWidth - _drawingExcWidth) + { + _startPosX += (int)EntityExcavator.Step; + } + return true; + //вниз + case DirectionType.Down: + if(_startPosY + EntityExcavator.Step < _pictureHeight - _drawingExcHeight) + { + _startPosY += (int)EntityExcavator.Step; + } + return true; + default: + return false; + } + } + + /// + /// Прорисовка объекта + /// + /// + public void DrawTransport(Graphics g) + { + if(EntityExcavator == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(EntityExcavator.AdditionalColor); + + //обвесы + if (EntityExcavator.Prop) + { + //Опоры + //справа + g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value + 40, 11, 3); + g.DrawRectangle(pen, _startPosX.Value + 87, _startPosY.Value + 43, 5, 25); + g.DrawRectangle(pen, _startPosX.Value + 84, _startPosY.Value + 68, 11, 3); + + //слева + g.DrawRectangle(pen, _startPosX.Value + 6, _startPosY.Value + 40, 13, 3); + g.DrawRectangle(pen, _startPosX.Value + 4, _startPosY.Value + 43, 5, 25); + g.DrawRectangle(pen, _startPosX.Value + 1, _startPosY.Value + 68, 11, 3); + + //покраска справа + g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 40, 11, 3); + g.FillRectangle(additionalBrush, _startPosX.Value + 87, _startPosY.Value + 43, 5, 25); + g.FillRectangle(additionalBrush, _startPosX.Value + 84, _startPosY.Value + 68, 11, 3); + + //покраска слева + g.FillRectangle(additionalBrush, _startPosX.Value + 6, _startPosY.Value + 40, 13, 3); + g.FillRectangle(additionalBrush, _startPosX.Value + 4, _startPosY.Value + 43, 5, 25); + g.FillRectangle(additionalBrush, _startPosX.Value + 1, _startPosY.Value + 68, 11, 3); + } + + if (EntityExcavator.Ladle) + { + //Ковш + //ковш(стрела) + g.DrawRectangle(pen, _startPosX.Value + 77, _startPosY.Value + 17, 14, 8); + g.DrawRectangle(pen, _startPosX.Value + 91, _startPosY.Value + 9, 20, 7); + g.DrawRectangle(pen, _startPosX.Value + 111, _startPosY.Value + 17, 9, 20); + + Point[] pointsLadle = + { + new Point(_startPosX.Value + 120, _startPosY.Value + 37), + new Point(_startPosX.Value + 104, _startPosY.Value + 54), + new Point(_startPosX.Value + 120, _startPosY.Value + 54), + }; + g.FillPolygon(additionalBrush, pointsLadle); + g.DrawPolygon(pen, pointsLadle); + + //покраска + g.FillRectangle(additionalBrush, _startPosX.Value + 77, _startPosY.Value + 17, 14, 8); + g.FillRectangle(additionalBrush, _startPosX.Value + 91, _startPosY.Value + 9, 20, 7); + g.FillRectangle(additionalBrush, _startPosX.Value + 111, _startPosY.Value + 17, 9, 20); + } + + //Границы экскаватора + g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 25, /*длина*/60, /*ширина*/20); //главная нижняя + g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 10, 5, 15); + g.DrawRectangle(pen, _startPosX.Value + 55, _startPosY.Value + 3, 22, 22); //кабина + + Brush br = new SolidBrush(EntityExcavator.BodyColor); + + g.FillRectangle(br, _startPosX.Value + 21, _startPosY.Value + 26, 59, 19); + g.FillRectangle(br, _startPosX.Value + 36, _startPosY.Value + 11, 4, 14); + + Brush brBlue = new SolidBrush(Color.PowderBlue); + g.FillRectangle(brBlue, _startPosX.Value + 56, _startPosY.Value + 4, 21, 21); + + //ручка для катков + Pen penEllip = new Pen(Color.Black); + penEllip.Width = 2; + + //гусеницы (катки) + g.DrawEllipse(pen, _startPosX.Value + 15, _startPosY.Value + 47, 17, 17); + g.DrawEllipse(pen, _startPosX.Value + 63, _startPosY.Value + 47, 17, 17); + + //гусеницы (гуценица) + g.DrawRectangle(pen, _startPosX.Value + 24, _startPosY.Value + 47, 48, 17); + + //закрашивание катков + Brush brWhite = new SolidBrush(Color.White); + g.FillEllipse(brWhite, _startPosX.Value + 15, _startPosY.Value + 47, 17, 17); + g.FillEllipse(brWhite, _startPosX.Value + 63, _startPosY.Value + 47, 17, 17); + + //жирные круги + g.DrawEllipse(penEllip, _startPosX.Value + 15, _startPosY.Value + 47, 17, 17); + g.DrawEllipse(penEllip, _startPosX.Value + 63, _startPosY.Value + 47, 17, 17); + + //маленькие катки (верхние) + g.DrawEllipse(penEllip, _startPosX.Value + 40, _startPosY.Value + 48, 5, 5); + g.DrawEllipse(penEllip, _startPosX.Value + 50, _startPosY.Value + 48, 5, 5); + + //нижние катки + g.DrawEllipse(penEllip, _startPosX.Value + 34, _startPosY.Value + 55, 8, 8); + g.DrawEllipse(penEllip, _startPosX.Value + 44, _startPosY.Value + 55, 8, 8); + g.DrawEllipse(penEllip, _startPosX.Value + 54, _startPosY.Value + 55, 8, 8); + + } +} \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/EntityExcavator.cs b/ProjectExcavator/ProjectExcavator/EntityExcavator.cs new file mode 100644 index 0000000..b131d5f --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/EntityExcavator.cs @@ -0,0 +1,67 @@ +namespace ProjectExcavator; +/// +/// Класс-сущность "Спортивный автомобиль" +/// +public class EntityExcavator +{ + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + + /// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; private set; } + + /// + /// Признак наличия обвеса + /// + public bool BodyKit { get; private set; } + + /// + /// Признак наличия опор + /// + public bool Prop { get; private set; } + + /// + /// Признак наличия ковша + /// + public bool Ladle { get; private set; } + + /// + /// Шаг перемещения экскаватора + /// + public double Step => Speed * 100 / Weight; + + /// + /// + /// + /// Скорсть + /// Вес экскаватора + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия обвеса + /// Признак наличия опор + /// Признак наличия ковша + public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool prop, bool ladle) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + AdditionalColor = additionalColor; + BodyKit = bodyKit; + Prop = prop; + Ladle = ladle; + } +} diff --git a/ProjectExcavator/ProjectExcavator/Form1.Designer.cs b/ProjectExcavator/ProjectExcavator/Form1.Designer.cs deleted file mode 100644 index 18aac23..0000000 --- a/ProjectExcavator/ProjectExcavator/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectExcavator -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} diff --git a/ProjectExcavator/ProjectExcavator/Form1.cs b/ProjectExcavator/ProjectExcavator/Form1.cs deleted file mode 100644 index aad2e9f..0000000 --- a/ProjectExcavator/ProjectExcavator/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectExcavator -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs b/ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs new file mode 100644 index 0000000..996a49f --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/FormExcavator.Designer.cs @@ -0,0 +1,134 @@ +namespace ProjectExcavator +{ + partial class FormExcavator + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + pictureBoxExcavator = new PictureBox(); + buttonCreate = new Button(); + buttonLeft = new Button(); + buttonRight = new Button(); + buttonDown = new Button(); + buttonUp = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxExcavator).BeginInit(); + SuspendLayout(); + // + // pictureBoxExcavator + // + pictureBoxExcavator.Location = new Point(0, 0); + pictureBoxExcavator.Name = "pictureBoxExcavator"; + pictureBoxExcavator.Size = new Size(931, 604); + pictureBoxExcavator.TabIndex = 0; + pictureBoxExcavator.TabStop = false; + // + // buttonCreate + // + buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreate.BackColor = SystemColors.Control; + buttonCreate.Location = new Point(12, 569); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(75, 23); + buttonCreate.TabIndex = 1; + buttonCreate.Text = "Создать"; + buttonCreate.UseVisualStyleBackColor = false; + buttonCreate.Click += buttonCreate_Click; + // + // buttonLeft + // + buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonLeft.BackgroundImage = Properties.Resources.arrowLeft; + buttonLeft.BackgroundImageLayout = ImageLayout.Stretch; + buttonLeft.Location = new Point(777, 547); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(35, 35); + buttonLeft.TabIndex = 2; + buttonLeft.UseVisualStyleBackColor = true; + buttonLeft.Click += buttonMove_Click; + // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackgroundImage = Properties.Resources.arrowRight; + buttonRight.BackgroundImageLayout = ImageLayout.Stretch; + buttonRight.Location = new Point(857, 547); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(35, 35); + buttonRight.TabIndex = 3; + buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += buttonMove_Click; + // + // buttonDown + // + buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonDown.BackgroundImage = Properties.Resources.arrowDown; + buttonDown.BackgroundImageLayout = ImageLayout.Stretch; + buttonDown.Location = new Point(818, 547); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(35, 35); + buttonDown.TabIndex = 4; + buttonDown.UseVisualStyleBackColor = true; + buttonDown.Click += buttonMove_Click; + // + // buttonUp + // + buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonUp.BackgroundImage = Properties.Resources.arrowUp; + buttonUp.BackgroundImageLayout = ImageLayout.Stretch; + buttonUp.Location = new Point(818, 506); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(35, 35); + buttonUp.TabIndex = 5; + buttonUp.UseVisualStyleBackColor = true; + buttonUp.Click += buttonMove_Click; + // + // FormExcavator + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(931, 604); + Controls.Add(buttonUp); + Controls.Add(buttonDown); + Controls.Add(buttonRight); + Controls.Add(buttonLeft); + Controls.Add(buttonCreate); + Controls.Add(pictureBoxExcavator); + Name = "FormExcavator"; + Text = "Экскаватор"; + ((System.ComponentModel.ISupportInitialize)pictureBoxExcavator).EndInit(); + ResumeLayout(false); + } + + #endregion + + private PictureBox pictureBoxExcavator; + private Button buttonCreate; + private Button buttonLeft; + private Button buttonRight; + private Button buttonDown; + private Button buttonUp; + } +} \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/FormExcavator.cs b/ProjectExcavator/ProjectExcavator/FormExcavator.cs new file mode 100644 index 0000000..a53f52d --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/FormExcavator.cs @@ -0,0 +1,68 @@ +namespace ProjectExcavator; + +public partial class FormExcavator : Form +{ + private DrawningExcavator? _drawningExcavator; + public FormExcavator() + { + InitializeComponent(); + } + + private void Draw() + { + if (_drawningExcavator == null) + { + return; + } + + Bitmap bmp = new(pictureBoxExcavator.Width, pictureBoxExcavator.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningExcavator.DrawTransport(gr); + pictureBoxExcavator.Image = bmp; + } + + private void buttonCreate_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningExcavator = new DrawningExcavator(); + _drawningExcavator.Init(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); + _drawningExcavator.SetPictureSize(pictureBoxExcavator.Width, pictureBoxExcavator.Height); + _drawningExcavator.SetPosition(random.Next(10,100), random.Next(10,100), pictureBoxExcavator.Width, pictureBoxExcavator.Height); + + Draw(); + } + + private void buttonMove_Click(object sender, EventArgs e) + { + if(_drawningExcavator == null) + { + return; + } + + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "buttonUp": + result = _drawningExcavator.MoveTransport(DirectionType.Up); + break; + case "buttonDown": + result = _drawningExcavator.MoveTransport(DirectionType.Down); + break; + case "buttonRight": + result = _drawningExcavator.MoveTransport(DirectionType.Right); + break; + case "buttonLeft": + result = _drawningExcavator.MoveTransport(DirectionType.Left); + break; + } + + if (result) + { + Draw(); + } + } +} diff --git a/ProjectExcavator/ProjectExcavator/Form1.resx b/ProjectExcavator/ProjectExcavator/FormExcavator.resx similarity index 93% rename from ProjectExcavator/ProjectExcavator/Form1.resx rename to ProjectExcavator/ProjectExcavator/FormExcavator.resx index 1af7de1..af32865 100644 --- a/ProjectExcavator/ProjectExcavator/Form1.resx +++ b/ProjectExcavator/ProjectExcavator/FormExcavator.resx @@ -1,17 +1,17 @@  - diff --git a/ProjectExcavator/ProjectExcavator/Program.cs b/ProjectExcavator/ProjectExcavator/Program.cs index c5b8144..59b8c54 100644 --- a/ProjectExcavator/ProjectExcavator/Program.cs +++ b/ProjectExcavator/ProjectExcavator/Program.cs @@ -11,7 +11,7 @@ namespace ProjectExcavator // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); + Application.Run(new FormExcavator()); } } } \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj b/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj index 663fdb8..629ec08 100644 --- a/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj +++ b/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj @@ -2,10 +2,25 @@ WinExe - net8.0-windows + net8.0-windows7.0 enable true enable + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/Properties/Resources.Designer.cs b/ProjectExcavator/ProjectExcavator/Properties/Resources.Designer.cs new file mode 100644 index 0000000..cb5a2f0 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectExcavator.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.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() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [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("ProjectExcavator.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowDown { + get { + object obj = ResourceManager.GetObject("arrowDown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowLeft { + get { + object obj = ResourceManager.GetObject("arrowLeft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowRight { + get { + object obj = ResourceManager.GetObject("arrowRight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowUp { + get { + object obj = ResourceManager.GetObject("arrowUp", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectExcavator/ProjectExcavator/Properties/Resources.resx b/ProjectExcavator/ProjectExcavator/Properties/Resources.resx new file mode 100644 index 0000000..14078bc --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\arrowUp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowDown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\arrowRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/Resources/arrowDown.png b/ProjectExcavator/ProjectExcavator/Resources/arrowDown.png new file mode 100644 index 0000000000000000000000000000000000000000..84204b37c93a0d442f807d2a876c1d17edad51f4 GIT binary patch literal 4866 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 K>=o=LpZPC*W95hd literal 0 HcmV?d00001 diff --git a/ProjectExcavator/ProjectExcavator/Resources/arrowLeft.png b/ProjectExcavator/ProjectExcavator/Resources/arrowLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..16c62ca975ac2d77462b14c3b35f57886acc5956 GIT binary patch literal 3859 zcmeHJX;jnK62A$XyS4O*4@6W@6cmsmXb^%TkdP1*D5!`85hNm8h+qtX)b^=eKn230 zB;XN}0*V`mAWLi&YuxakB4wxA81iI!5+p1pdG|&?y!W|Zn{#rKxpVK#Z+>^~%zU?t z=C^R3`8)u?LNaM*5CC}i7Z2tb!=H)czsI+pfxa?I0ZSHfjcjq?_= zA}I5@j;i#&tG0jca~;g;>(p#}uE@(!ZPN)IhSP~^-NC``wN7Wx_c`cnHvFU?+Rc< zR%IXiLCOGueTKZ8Oh*B!?owix$>+c+c0MKwu~4M2j^RODT!~^fE3_IeuYHTzSGr1H zS2a1s?S`7ce%6K#Uv>%C5eKsQ_3yZwI@<2|WfcS7DQWoBZBh4U>Y=N(1gOkctH)?{ zt42Fs&joRRj6KXA2k66;U%u(?y1QuO)opAGeI0Z z=7eVlgkd6^fo6x_)Dn^8j#WYFN=Ds*#LDW0$%RWfR*M0eudcPH{2o%OMb)j00!VIjamRz0kqX zs|gk|ms5Th(tiDzQXXP4C>){1BZ-6EKvDwvF_g;KN^OY6K))t{;0B}HCxom|O%5OL zE`mO<25^F4=(pV>N}SYA&kr2NK@e=?q;o1Llu$?Un>u-Mf)ul?Jr`DxJuvf{ZQ_y@!1K{*;l0q_py{ zptNWDh$aMy+RYI#F5E_{uIR|?o?Fa!Q4MoaXwVXi-7Q2(;3l&*g%m{w&Z594iArm9 zeCt4#GrB$9`GU0&+ieA@h~_)%m{hS zo!E(TgC-t7b#E_P`1iy&|3h}G;A4V6V0{GmXOI06;c^{Gt zsAl0ZtBRzYoT53tvCMpxrUyIi=LclZBP#|1#lC(lxq;-+y2a}C&sC8G0=}q4yOF!i z(#rD1(~?_6WxQYGpHHp<**96EDje4!W7O{kgc6wH^k7nV-*Q&hOJQl|X^2{kNnZn=RK zm`Ry2lIYCRUK@B3iQ8sP>1%s9leW=s^1_JrLG19Q5~_T)Bqzh5J+Q%G@IS?oxY+W; zx$nmAoA6q+n&CiR@z9Hp-dp-hrLUbl&MzrqNE>w3*u~4%ZO{HQ@!r?Y3jZ=E2gK$O zNdwzd_8wElbmw7Opv_*@_`BO(RCYs58iRPC5{>??-rjGM?*4FmJA+R z7j~~83A7L)pF%A`6YH!smB8)09lqTwSV1Cg)B&e}4`Gd-Tvvge&MS+Cql(5a4EhDJ zBV8pS%+<{WQcGGm78b--v=WaFn$V9EypwQz`Vi35|#e0+qJ7E%3{8^Kx$gAcf0d?Hf#-t5*vvf zr|zUL7EPl@AydXxElhbXy(MuBfB^I_?3HjNK%Py9;$zv%5Q|qr%fOoXu;aX`AU8V< ze$7fmE^RF-(B{vy_bq~`n@3iPQj>i0htb>F3;(};n|P`gf}CuFFWH}ZlJV?8BH zZP8g7EY1)x33ks<6)xptg^MfCkRNC{aScXC6Emw0hC*CL0;$h&`N5{{W$NJ@wd){R zM@grHko_Hv&WJie8fvM-UX8GkWp5w{BI!zR<4_|2adElV<{w`N%ZrzFdO55h_dR+F zLTw<1cv+1e|Aj;n;tVT5l7M7k3K2E2V3kc7(>e$W;SG+`{PfWrZG>Y-_7&7T&U|Vf zz6Ii|$fmn+zZsm61sB)8Z{)R-Qjw8n_e`AeTpBjDwomk}ZH zX6Uoqn*Z?qOQ;&~w?~&;r#y`U{y46fH>~68gLsJPAK8JIDuteo^RAGbOLt{2LM&b% z;P)6h!sPL8y^xuIB)YeH+;uyAL27YQIn0EgdT-t#;Hddb?H8gvCTCDo>vDCYu6-}t zYZv>w_App>y;9Yp*Oiln(_1*3a3Go$ePUzBDfWK;Ln97nCHS!`M%jR7xjH+jyuDK6 zU6rlcVwdD%2nf?h?G`I5vssTrVWM9izoH#~qV3*QKa^~joZD-96`pN$SEe+&g literal 0 HcmV?d00001 diff --git a/ProjectExcavator/ProjectExcavator/Resources/arrowRight.png b/ProjectExcavator/ProjectExcavator/Resources/arrowRight.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6578c23ba670154222b4626aabec8a4b7be59d GIT binary patch literal 3986 zcmeHKYgAKL7Cs?7tO~JpT5Lh0%jMW=gS17UJZsT~wj*G9L`ry66tGAFVjAQXEUjp3 zrB)k642+c)xPc^!fILFt;DCxi6|X?$DZ}gX2oM7#A<3L`v0ZD{nt%P$6WSnl1k>k|M>;7=2S#6v#^!3|F zI^%TiF6|A47NcomRh_tBxfP=O>+|Or=(4tY;0Y92#}BIYIM1jol!!dtlrBK=W{x;K zA}p*obbZLMfbhUqiK6~4d>M3YZVu*@Oph6J44wDA0{sdT4}gKEyie5+8#IIb$m!CI z&DCy{fsMnD3Cyl%(aS+uZdchHV*%{Gio&*O=bMeOhEmsI!E{)}Z*^ON!g(Sxs>yir1dsbD{8basaGkcpU^1|$g=tnO^$~(h z$oe!YDy->Dv%RvXg5<{TwoTT6Ip@!Tl$3^w>RNC7#v4aVE%rw_K*rX z^v3;GPg;Wfg}a2`WiRbSvONIiZd#T?-%2-d`$9cFXK}$mvnVtlE~fpWJxSteEBEYO zdKfV}LVQh4r7A{*j|{2#1Lp-2`-ZE-0yE&CxXz#ru4fx&Bq}jcl!#L@nKzeM%1O9~ zAkGYZP6d7;H11sND#!HAX#)I2XxgBVa||3-u<8P#-<<(U=_?meAV1= zO(&OQf}EX@eKnrG)aaWq6x4sKSzhrT@Lhipw({#90v%_y;z%u zg2#!9tw=D@+#qB>#XdHlH_vQ!yP86RZDc5&U7{g@T~$;DXSz5G967Aku%sOS4t!yD^iMM6P?gpSa`%s0e5+Q4M`*)nZF z@~7M|?CWE z#T_J}7Y8xXdW|SWed{-%XvC^tC^0*PQGtc14hh8y5qgr9T!Gn;!ufkdk;*hP>11KV zs4JFh%U>oVrHI#fP(kGPS-1znCXUsZQ-Q7C;LfFDA{2bM0No_J|Ul6tYaWWb>F%KVvfF~P zZt`RN0u~xWKQxiHFN&X>)I{$(%5ID9t%cx$`tn&X=|0$=^U_ZDwY}bC?0}aR?x2RW>X%h?ws{fB*oApMJ(`OsLx9=mk<6i0N>qIK?73SVs*kR z)s-0Ser zBAOoA(qnRI;tp|HP}peN^@C2-929XW{rmDch>jO5chao^YnRwf{H?Tqw(__w-VW9e zJXa{}Gz-LTh>y#rOwwo)dr7#9ZUe~bWeGdxHaM<@5&5^|DLi!;{@#{Cv&f6>fuq&+ zrl;?@Q>FYKrv9M1k->S%bkR4lC?$>?&ei>=Vn*I$(p3l*EU_0Cbj($ib%?TC-T$V@ zN+_u<(zZYuGL??o%Nu&;yr%RQ`DJZ(=(LT0pgtuSJsq8+cjX6q97MKhYB`OGD*YHd3YOy5>B@NXxWY0Ynmu|n-BIL>VNxO#lt*R z3{CHQ!iW28*+Z!TLkMIH&N@@@MR$j&-3cPDDb-#lGsvi|l_3u}zINF|)o_M!5MksW zAUoF4j%y-$ETS}GdV#7~Ga6jTHb4rJ)L)Vg>@jvcv{h$_Nn~HJx|wz}gRg4N5VnW{ z-~h;scde-{Ll6c9*=ushMlgO4FGj@LV)mqv6Ps~HD_zGGm$um;VUKwAEBO&zVmX5n zLkZk|PN#=WCl3!oFS149WDk2nHX)eKizXCeAxcG#S^I@fVkdC4qfu1t%pXI;C=s?m zg_B2v_JAroL+BsB>u1Cls55QXTy`E3>$C(?d$O+|JQl|e7>C(C9|5c&#?_&JSOr;=X{(O-kq9{x|X#M_R+oSa50zoQ#@ zL0hJRHi7}0)I&pTY7bMEp@dVt|C_?Ng=QnXf~AI-fW;@a9n+qxX8iCA^EUvP8E~)C z<~HbOjYEQ`D}loM&N%Lqn$XDSs9P8j3{zlt@SG&0Qu|T=(xTCud;4so38I9=ZDG{+ak|H)3E>utbwK`9IGy S{~{LIdw2Wp5`P%^<$nRB+vuwR literal 0 HcmV?d00001 diff --git a/ProjectExcavator/ProjectExcavator/Resources/arrowUp.png b/ProjectExcavator/ProjectExcavator/Resources/arrowUp.png new file mode 100644 index 0000000000000000000000000000000000000000..68d77d12deeeca8e726ad5fe1df47124b5d35bb0 GIT binary patch literal 4861 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 literal 0 HcmV?d00001