c# - 矩形的二维数组

标签 c# arrays winforms forms rectangles

我正在开发一个非常基本的绘图程序:一个由多个 RectangleShape 组成的 2D 网格,每个大约 20x30 像素,单击时根据用户 RGB 输入更改颜色,效果很好:

Color SelectedColor = new Color();
private void Pixel_1_1_Click(object sender, EventArgs e)    // on Rectangle click
{
    Pixel_1_1.FillColor = SelectedColor;    // change to currently desired color.
}

由于正方形的数量急剧增加,我正在寻找一种将“像素”矩形排列成二维数组的方法。 (我真的不想为屏幕上的每个 Rectangle 都创建一个 Pixel_Click 方法!)希望最终能够调用类似这样的方法:

private void Pixel_[x]_[y]_Click(object sender, EventArgs e)
{
    Pixel_[x]_[y].FillColor = SelectedColor;
}

我的 friend 建议使用匿名委托(delegate),但我不明白如何充分利用它来解决我的问题。

在 C# Windows 窗体中生成二维矩形数组的最佳方法是什么?生成后,如何使用单一方法访问 x 和 y 的变体值?

最佳答案

虽然您将每个矩形视为一个对象可能是正确的,但将每个矩形视为一个窗口控件可能是不正确的,特别是因为您有这么多矩形。

因此尝试创建您自己的矩形对象:

public class MyRect {
  public Color FillColor { get; set; }
  public Rectangle Rectangle { get; set; }

  public MyRect(Rectangle r, Color c) {
    this.Rectangle = r;
    this.FillColor = c;
  }
}

现在您只需要保留一个对象列表并在单个 Panel 控件(或 PictureBox)上绘制所有矩形:

private List<MyRect> myRectangles = new List<MyRect>();

public Form1() {
  InitializeComponent();

  myRectangles.Add(new MyRect(new Rectangle(10, 10, 64, 16), Color.Blue));
  myRectangles.Add(new MyRect(new Rectangle(20, 48, 16, 64), Color.Red));
}

private void panel1_Paint(object sender, PaintEventArgs e) {
  foreach (MyRect mr in myRectangles) {
    using (SolidBrush sb = new SolidBrush(mr.FillColor)) {
      e.Graphics.FillRectangle(sb, mr.Rectangle);
    }
  }
}

要处理矩形的“点击”事件,您只需处理容器控件的 MouseDownMouseClick 事件并自行确定哪个矩形被点击:

void panel1_MouseDown(object sender, MouseEventArgs e) {
  if (e.Button == MouseButtons.Left) {
    foreach (MyRect mr in myRectangles) {
      if (mr.Rectangle.Contains(e.Location)) {
        ChangeColor(mr, Color.Green);
      }
    }
    panel1.Invalidate();
  }
}

private void ChangeColor(MyRect mr, Color newColor) {
  mr.FillColor = newColor;
}

关于c# - 矩形的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312980/

相关文章:

c# - SilverLight 文件上传?

c# - RTP 数据包 - c# 代码

c# - 如何在C# MailMessage中设置电子邮件过期时间

winforms - Visual Studio - 在隐藏代码中搜索对象使用情况的快速方法

c# - dateTime 到 winform 中的短格式

c# - ASP.NET 重定向和结束页面

c++ - 指向对象和继承对象的指针数组

Java作业: Print Arrays with stored random numbers in it

c++ - 对用户生成的数组进行排序有垃圾数据

c# - 如何在 TextBox 中附加不间断空格?