diff --git a/App.config b/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ConsoleApp1.csproj b/ConsoleApp1.csproj new file mode 100644 index 0000000..1a1f659 --- /dev/null +++ b/ConsoleApp1.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {CE05578D-0247-4C11-9319-5F1E77CCB4E1} + Exe + ConsoleApp1 + ConsoleApp1 + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Form + + + + + + + + \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..b78a5d3 --- /dev/null +++ b/Program.cs @@ -0,0 +1,213 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Windows.Forms; + +namespace GridToggler +{ + static class Program + { + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } + + public class MainForm : Form + { + private const int GRID_SIZE = 20; + private const int BOX_SIZE = 20; + + private int[,] boxes; + private Rectangle[,] rectangles; + private bool isFilling; + private bool isClearing; + + private MenuStrip menuStrip; + private ToolStripMenuItem fileToolStripMenuItem; + private ToolStripMenuItem saveImageToolStripMenuItem; + private ToolStripMenuItem clearGridToolStripMenuItem; + + public MainForm() + { + InitializeComponent(); + + // Initialize grid of boxes + boxes = new int[GRID_SIZE, GRID_SIZE]; + rectangles = new Rectangle[GRID_SIZE, GRID_SIZE]; + + for (int x = 0; x < GRID_SIZE; x++) + { + for (int y = 0; y < GRID_SIZE; y++) + { + boxes[x, y] = 0; + rectangles[x, y] = new Rectangle(x * BOX_SIZE, y * BOX_SIZE, BOX_SIZE, BOX_SIZE); + } + } + } + + private void MainForm_Paint(object sender, PaintEventArgs e) + { + Graphics g = e.Graphics; + + for (int x = 0; x < GRID_SIZE; x++) + { + for (int y = 0; y < GRID_SIZE; y++) + { + Rectangle rect = rectangles[x, y]; + + if (boxes[x, y] == 1) + g.FillRectangle(Brushes.Black, rect); + else + g.FillRectangle(Brushes.White, rect); + + g.DrawRectangle(Pens.Black, rect); + } + } + } + + private void MainForm_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + isFilling = true; + else if (e.Button == MouseButtons.Right) + isClearing = true; + + ToggleBoxState(e); + } + + private void MainForm_MouseUp(object sender, MouseEventArgs e) + { + isFilling = false; + isClearing = false; + } + + private void MainForm_MouseMove(object sender, MouseEventArgs e) + { + if (isFilling || isClearing) + ToggleBoxState(e); + } + + private void ToggleBoxState(MouseEventArgs e) + { + int x = e.X / BOX_SIZE; + int y = e.Y / BOX_SIZE; + + if (x >= 0 && x < GRID_SIZE && y >= 0 && y < GRID_SIZE) + { + if (isFilling) + boxes[x, y] = 1; + else if (isClearing) + boxes[x, y] = 0; + + Invalidate(rectangles[x, y]); + } + } + + private void SaveImageToolStripMenuItem_Click(object sender, EventArgs e) + { + using (Bitmap bitmap = new Bitmap(GRID_SIZE * BOX_SIZE, GRID_SIZE * BOX_SIZE)) + { + using (Graphics g = Graphics.FromImage(bitmap)) + { + for (int x = 0; x < GRID_SIZE; x++) + { + for (int y = 0; y < GRID_SIZE; y++) + { + Rectangle rect = rectangles[x, y]; + + if (boxes[x, y] == 1) + g.FillRectangle(Brushes.Black, rect); + else + g.FillRectangle(Brushes.White, rect); + + g.DrawRectangle(Pens.Black, rect); + } + } + } + + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Filter = "PNG Image|*.png"; + saveFileDialog.Title = "Save Image"; + saveFileDialog.ShowDialog(); + + if (saveFileDialog.FileName != "") + bitmap.Save(saveFileDialog.FileName, ImageFormat.Png); + } + } + + private void ClearGridToolStripMenuItem_Click(object sender, EventArgs e) + { + for (int x = 0; x < GRID_SIZE; x++) + { + for (int y = 0; y < GRID_SIZE; y++) + { + boxes[x, y] = 0; + Invalidate(rectangles[x, y]); + } + } + } + + private void InitializeComponent() + { + menuStrip = new MenuStrip(); + fileToolStripMenuItem = new ToolStripMenuItem(); + saveImageToolStripMenuItem = new ToolStripMenuItem(); + clearGridToolStripMenuItem = new ToolStripMenuItem(); + + menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem }); + fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { clearGridToolStripMenuItem, saveImageToolStripMenuItem }); + fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + fileToolStripMenuItem.Size = new Size(37, 20); + fileToolStripMenuItem.Text = "File"; + + clearGridToolStripMenuItem.Name = "clearGridToolStripMenuItem"; + fileToolStripMenuItem.Size = new Size(37, 20); + this.SuspendLayout(); + + // Create menu strip + menuStrip = new MenuStrip(); + fileToolStripMenuItem = new ToolStripMenuItem(); + saveImageToolStripMenuItem = new ToolStripMenuItem(); + clearGridToolStripMenuItem = new ToolStripMenuItem(); + + menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem }); + fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { clearGridToolStripMenuItem, saveImageToolStripMenuItem }); + fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + fileToolStripMenuItem.Size = new Size(37, 20); + fileToolStripMenuItem.Text = "File"; + + saveImageToolStripMenuItem.Name = "saveImageToolStripMenuItem"; + saveImageToolStripMenuItem.Size = new Size(133, 22); + saveImageToolStripMenuItem.Text = "Save Image"; + saveImageToolStripMenuItem.Click += SaveImageToolStripMenuItem_Click; + + clearGridToolStripMenuItem.Name = "clearGridToolStripMenuItem"; + clearGridToolStripMenuItem.Size = new Size(133, 22); + clearGridToolStripMenuItem.Text = "Clear Grid"; + clearGridToolStripMenuItem.Click += ClearGridToolStripMenuItem_Click; + + Controls.Add(menuStrip); + + // Configure form properties + ClientSize = new Size(GRID_SIZE * BOX_SIZE, GRID_SIZE * BOX_SIZE); + DoubleBuffered = true; + FormBorderStyle = FormBorderStyle.FixedSingle; + MaximizeBox = false; + Name = "MainForm"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Grid Toggler"; + Paint += MainForm_Paint; + MouseDown += MainForm_MouseDown; + MouseUp += MainForm_MouseUp; + MouseMove += MainForm_MouseMove; + ResumeLayout(false); + PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + } + } +} diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e07c1a9 --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ConsoleApp1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApp1")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ce05578d-0247-4c11-9319-5f1e77ccb4e1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")]