我正在开发一个非常基本的绘图程序:一个由多个 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);
}
}
}
要处理矩形的“点击”事件,您只需处理容器控件的 MouseDown
或 MouseClick
事件并自行确定哪个矩形被点击:
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/