【问题标题】:PictureBox Grid and selecting individual cells when clicked onPictureBox Grid 并在单击时选择单个单元格
【发布时间】:2013-05-23 15:04:00
【问题描述】:

我目前正在使用图片框和网格。我已经能够在图片框的顶部成功设置一个网格。现在我正在寻求帮助/指导,以编码一种选择每个单独单元格的方法。如何选择单个单元格并将其颜色显示为蓝色?这是指生命游戏。

网格代码:

 private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            int numOfCells = 200;
            int cellSize = 10;
            Pen p = new Pen(Color.Black);

            for (int i = 0; i < numOfCells; i++)
            {
                // Vertical
                g.DrawLine(p, i * cellSize, 0, i * cellSize, numOfCells * cellSize);
                // Horizontal
                g.DrawLine(p, 0, i * cellSize, numOfCells * cellSize, i * cellSize);
            }
        }

蓝色单元格是被点击的单元格:

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您将需要添加一些结构来处理单元格,而不是在paint 方法中处理所有内容。这是我拼凑起来的一个快速而肮脏的应用程序。它使用两个简单的类:Cell 和 Grid,其中包含一个 2D 的 Cells 数组。

    这里要理解的主要是表单类中的 Grid.SetDimentions 方法和 Form1_MouseDown 事件,它将鼠标位置映射到世界坐标。

    细胞类:

    using System.Drawing;
    
    public sealed class Cell
    {
        public bool Hover { get; set; }
        public enum CellState { Inactive, Intermediate, Active }
        public CellState State { get; private set; }
        public int Column { get; private set; }
        public int Row { get; private set; }
        public Rectangle Bounds { get; private set; }
    
        public Cell (int column, int row, CellState state = CellState.Inactive)
        {
            this.Column = column;
            this.Row = row;
        }
    
        public void SetDimensions (Rectangle bounds)
        {
            this.Bounds = bounds;
        }
    
        public void RotateState ()
        {
            switch (this.State)
            {
                case CellState.Active: { this.State = CellState.Inactive; break; }
                case CellState.Inactive: { this.State = CellState.Intermediate; break; }
                case CellState.Intermediate: { this.State = CellState.Active; break; }
            }
        }
    }
    

    网格类:

    using System.Drawing;
    
    public class Grid
    {
        public Cell [,] Cells { get; private set; }
        public Size Size { get; private set; }
        public Rectangle Bounds { get; private set; }
    
        public Grid (Size gridSize)
        {
            this.Size = gridSize;
            this.Cells = new Cell [this.Size.Width, this.Size.Height];
    
            for (int r=0; r < this.Size.Height; r++)
            {
                for (int c=0; c < this.Size.Width; c++)
                {
                    this.Cells [c, r] = new Cell(c, r);
                }
            }
        }
    
        public void SetDimensions (Rectangle bounds)
        {
            Size size;
    
            this.Bounds = bounds;
            size = new Size((int) (((float) bounds.Width) / ((float) this.Size.Width)), (int) (((float) bounds.Height) / ((float) this.Size.Height)));
    
            for (int r=0; r < this.Size.Height; r++)
            {
                for (int c=0; c < this.Size.Width; c++)
                {
                    this.Cells [c, r].SetDimensions(new Rectangle(bounds.Left + (size.Width * c), bounds.Top + (size.Height * r), size.Width, size.Height));
                }
            }
        }
    }
    

    表格:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public partial class Form1: Form
    {
        private Grid World { get; set; }
    
        public Form1 ()
        {
            this.InitializeComponent();
    
            this.World = new Grid(new Size(50, 50));
            this.World.SetDimensions(new Rectangle(0, 0, this.pictureBox1.ClientSize.Width, this.pictureBox1.ClientSize.Height));
        }
    
        private void Form1_Shown (object sender, EventArgs e)
        {
            this.pictureBox1.Invalidate();
        }
    
        private void Form1_Resize (object sender, EventArgs e)
        {
            this.World.SetDimensions(new Rectangle(0, 0, this.pictureBox1.ClientSize.Width, this.pictureBox1.ClientSize.Height));
    
            this.pictureBox1.Invalidate();
        }
    
        private void pictureBox1_MouseMove (object sender, MouseEventArgs e)
        {
            for (int r=0; r < this.World.Size.Height; r++)
            {
                for (int c=0; c < this.World.Size.Width; c++)
                {
                    this.World.Cells [c, r].Hover = this.World.Cells [c, r].Bounds.Contains(e.X, e.Y);
                }
            }
    
            this.pictureBox1.Invalidate();
        }
    
        private void pictureBox1_MouseClick (object sender, MouseEventArgs e)
        {
            for (int r=0; r < this.World.Size.Height; r++)
            {
                for (int c=0; c < this.World.Size.Width; c++)
                {
                    if (this.World.Cells [c, r].Bounds.Contains(e.X, e.Y))
                    {
                        this.World.Cells [c, r].RotateState();
                    }
                }
            }
        }
    
        private void pictureBox1_Paint (object sender, PaintEventArgs e)
        {
            for (int r=0; r < this.World.Size.Height; r++)
            {
                for (int c=0; c < this.World.Size.Width; c++)
                {
                    if (this.World.Cells [c, r].State == Cell.CellState.Active)
                    {
                        e.Graphics.FillRectangle(System.Drawing.Brushes.Blue, this.World.Cells [c, r].Bounds);
                    }
                    else if (this.World.Cells [c, r].State == Cell.CellState.Inactive)
                    {
                        e.Graphics.FillRectangle(System.Drawing.Brushes.White, this.World.Cells [c, r].Bounds);
                    }
                    else if (this.World.Cells [c, r].State == Cell.CellState.Intermediate)
                    {
                        e.Graphics.FillRectangle(System.Drawing.Brushes.Gray, this.World.Cells [c, r].Bounds);
                    }
    
                    if (this.World.Cells [c, r].Hover)
                    {
                        e.Graphics.DrawRectangle(System.Drawing.Pens.Red, this.World.Cells [c, r].Bounds);
                    }
                    else
                    {
                        e.Graphics.DrawRectangle(System.Drawing.Pens.Black, this.World.Cells [c, r].Bounds);
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 1970-01-01
      • 2015-04-14
      • 2020-12-06
      • 2019-01-30
      • 2018-04-09
      • 2022-12-03
      • 1970-01-01
      • 2018-02-28
      相关资源
      最近更新 更多