2012-10-03 38 views
2

我目前正在使用pictureBox和一個網格。我已經能夠成功地在pictureBox上設置網格。現在我正在尋求幫助/指導編碼方式來選擇每個單獨的細胞。我如何選擇單個單元格並以藍色顯示其顏色?這是關於生命的遊戲。PictureBox Grid並點擊時選擇單個單元格

代碼爲網格:

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); 
      } 
     } 

藍細胞是點擊的那些:

enter image description here

回答

0

您將要添加一些結構細胞,而不是處理一切工作在塗料方法。這裏是一個快速和骯髒的應用程序,我扔在一起。它使用兩個簡單的類:包含單元格的二維數組的單元格和網格。

這裏要理解的主要問題是Grid.SetDimentions方法和Form1_MouseDown事件在表單類中將鼠標位置映射到世界座標。

Cell類:

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); 
       } 
      } 
     } 
    } 
} 
相關問題