鼠标单击数组中的矩形时出现问题

时间:2014-05-21 22:19:04

标签: c# arrays drawing mouse

所以,我试图在屏幕上创建一个网格,为此,我实现了一个矩形的多维数组。

当程序启动时,我使用for循环来增加x和y坐标以形成网格。

public Form1() {
    InitializeComponent();

    for (int x = 0; x < 12; x++) {
        for (int y = 0; y < 12; y++) {
            recArray[x, y] = new Rectangle(y * 50, x * 50, 100, 100);
        }

        Application.DoEvents();
    }
}

我的问题是试图找出用户何时点击了一个矩形,以及他/她点击过的数组中的哪个矩形。正如我给出正确的矩形时,我会将边框更改为红色。

我正在使用Visual Studio 2008,到目前为止这是我的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Quoridor {
    public partial class Form1 : Form {

        private Pen pen = Pens.Black;

        Rectangle[,] recArray = new Rectangle[12, 12];

        public Form1() {
            InitializeComponent();

            for (int x = 0; x < 12; x++) {
                for (int y = 0; y < 12; y++) {
                    recArray[x, y] = new Rectangle(y * 50, x * 50, 100, 100);
                }

                Application.DoEvents();
            }
        }

        protected override void OnPaint(PaintEventArgs e) {
            base.OnPaint(e);

            for (int x = 0; x < 12; x++) {
                for (int y = 0; y < 12; y++) {
                    e.Graphics.DrawRectangle(pen, recArray[x, y]);

                    Application.DoEvents();
                }
            }
        }

        private void Form1_Click(object sender, EventArgs e) {
            Point cursor = this.PointToClient(Cursor.Position);

            Refresh();
        }
    }
}

我正在把它变成一个真正的游戏,包括所有类。但请记住,这是我的第二个月编程,所以不要苛刻^ _ ^

1 个答案:

答案 0 :(得分:0)

首先,提出几点建议:

  • 您将计算出的y坐标存储为矩形的x位置,反之亦然。切换Rectangle构造函数的前两个参数来解决这个问题。
  • 使用MouseClick事件代替Click事件。前者为您提供MouseEventArgs,其中包含相对于Form的点击坐标。
  • 您的矩形目前正在重叠,因为它们是100 x 100但相距50像素。这似乎是无意的(因为点击通常会落在2个矩形上)。这也是您的网格看起来是13x13而不是12x12的原因。要解决此问题,请传递50而不是100作为Rectangle的宽度和高度。

然后,您可以按如下方式确定点击的Rectangle

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
    Rectangle clickedRectangle = FindClickedRectangle(e.Location);
    if (!clickedRectangle.IsEmpty)
        Console.WriteLine("X: {0} Y: {1}", clickedRectangle.X, clickedRectangle.Y);
}

private Rectangle FindClickedRectangle(Point point)
{
    // Calculate the x and y indices in the grid the user clicked
    int x = point.X / 50;
    int y = point.Y / 50;

    // Check if the x and y indices are valid
    if (x < recArray.GetLength(0) && y < recArray.GetLength(1))
        return recArray[x, y];

    return Rectangle.Empty;
}

请注意,我使用简单的计算确定单击的矩形,这是可能的,因为矩形位于网格中。如果您打算偏离网格布局,则循环遍历所有矩形并使用Rectangle.Contains(Point)进行测试是另一种解决方案。