我是C#的新手,但我想通过在键盘TableLayoutPanel中按下键盘上的上下左右键来移动图片框(我在运行时创建了网格)。网格为23x23,边框为砖块图像(边框处的每个单元格在图像框中均包含砖块图像),中间为鼠标的图像框。我想要做的是通过按下上述控制键之一,将鼠标图像从另一个单元格的中央单元格(11x11)中移出。看来我无法掌握eventHandler ...的想法。该代码非常有效,直到我想移动图片框。我已经放置了整个代码,也许问题出在我没有注意到的地方,但是我认为问题是KeyDown + = new KeyEventHandler(Form2_KeyDown)或/结束了私有void Form2_KeyDown(object sender,KeyEventArgs e){ ...}。

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

namespace IndividualProject
{
  public partial class Form2 : Form
  {
    PictureBox picturebox5 = new PictureBox
    {
        Visible = true,
        Anchor = AnchorStyles.Top,
        SizeMode = PictureBoxSizeMode.Normal,
        Dock = DockStyle.Fill,
        Margin = new Padding(0)
    };

    public Form2()
    {
        InitializeComponent();
       // MaximizeBox = false;

        //size
        int h = Screen.PrimaryScreen.WorkingArea.Height / 2;
        int w = Screen.PrimaryScreen.WorkingArea.Width / 2;
        Size = new Size(w / 2 + w / 7, h + h / 4 + h / 7);

        //location
        StartPosition = FormStartPosition.CenterScreen;

        //form style
        FormBorderStyle = FormBorderStyle.FixedSingle;

        //menuStrip1.BackColor = Color.Beige;

        //lives and score container
        #region livesAndScore
        lasContainer.Size = new Size(Width / 2 + Width / 3 + Width / 7, Height / 13);
        lasContainer.BackColor = Color.Lavender;
        lasContainer.BorderStyle = BorderStyle.Fixed3D;
        lasContainer.Dock = DockStyle.Top;
        lasContainer.SplitterDistance = Width / 2 - Width / 69;
          //labels
        lives.Location = new Point(lasContainer.Panel1.Width / 12, lives.Height / 2);
        score.Location = new Point(lasContainer.Panel2.Width / 12, score.Height / 2);
          //picturebox
        live3.Location = new Point(lasContainer.Panel1.Width / 3, lives.Height / 2);
        live2.Location = new Point(lasContainer.Panel1.Width / 2, lives.Height / 2);
        live1.Location = new Point(lasContainer.Panel1.Width / 2 + lasContainer.Panel1.Width / 6, lives.Height / 2);
        #endregion livesAndScore

        //gamePanel
        gamePanel.Dock = DockStyle.Fill;
        gamePanel.BackColor = Color.SkyBlue;
        gamePanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; // REMOVE WHEN FINISHED !!!!!!!!!!!

        //making the grid
        #region grid
        gamePanel.ColumnCount = 23;
        gamePanel.RowCount = 23;
        gamePanel.ColumnStyles.Clear();
        gamePanel.RowStyles.Clear();
        int iIndex, jIndex = 0;

        for (iIndex = 0; iIndex < gamePanel.ColumnCount; iIndex++)
        {
            gamePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 4.34F));
            gamePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 4.34F));
        }
        #endregion grid

        while(jIndex < gamePanel.ColumnCount)
        {
            #region picturebox1
            PictureBox picturebox1 = new PictureBox
            {
                Visible = true,
                Anchor = AnchorStyles.Top,
                SizeMode = PictureBoxSizeMode.Normal,
                BackColor = Color.Sienna,
                Dock = DockStyle.Fill,
                Margin = new Padding(0)
            };
            if(jIndex < gamePanel.ColumnCount - 1)
            {
                gamePanel.Controls.Add(picturebox1, jIndex, 0);
                picturebox1.ImageLocation = @"..\..\ResourcesPh\brickblock.png";
            }
            #endregion picturebox1

            #region picturebox2
            PictureBox picturebox2 = new PictureBox
            {
                Visible = true,
                Anchor = AnchorStyles.Top,
                SizeMode = PictureBoxSizeMode.Normal,
                BackColor = Color.Sienna,
                Dock = DockStyle.Fill,
                Margin = new Padding(0)
            };
            if (jIndex < gamePanel.ColumnCount - 1)
            {
                gamePanel.Controls.Add(picturebox2, 0, jIndex + 1);
                picturebox2.ImageLocation = @"..\..\ResourcesPh\brickblock.png";
            }
            #endregion picturebox2

            #region picturebox3
            PictureBox picturebox3 = new PictureBox
            {
                Visible = true,
                Anchor = AnchorStyles.Top,
                SizeMode = PictureBoxSizeMode.Normal,
                BackColor = Color.Sienna,
                Dock = DockStyle.Fill,
                Margin = new Padding(0)
            };
            if(jIndex < gamePanel.ColumnCount - 1)
            {
                gamePanel.Controls.Add(picturebox3, gamePanel.ColumnCount - 1 - jIndex, gamePanel.RowCount - 1);
                picturebox3.ImageLocation = @"..\..\ResourcesPh\brickblock.png";
            }
            #endregion picturebox3

            #region picturebox4
            PictureBox picturebox4 = new PictureBox
            {
                Visible = true,
                Anchor = AnchorStyles.Top,
                SizeMode = PictureBoxSizeMode.Normal,
                BackColor = Color.Sienna,
                Dock = DockStyle.Fill,
                Margin = new Padding(0),
            };
            if(jIndex < gamePanel.ColumnCount - 1)
            {
                gamePanel.Controls.Add(picturebox4, gamePanel.ColumnCount - 1, gamePanel.RowCount - 1 - jIndex - 1);
                picturebox4.ImageLocation = @"..\..\ResourcesPh\brickblock.png";
            }
            #endregion picturebox4

            jIndex++;
        }

        //the starting point of the mouse
        #region mouseStartPoint
        //PictureBox picturebox5 = new PictureBox
        //{
        //    Visible = true,
        //    Anchor = AnchorStyles.Top,
        //    SizeMode = PictureBoxSizeMode.Normal,
        //    BackColor = Color.Sienna,
        //    Dock = DockStyle.Fill,
        //    Margin = new Padding(0)
        //};
        gamePanel.Controls.Add(picturebox5, 11, 11);
        picturebox5.ImageLocation = @"..\..\ResourcesPh\mouse.png";
        #endregion mouseStartPoint

        KeyDown += new KeyEventHandler(Form2_KeyDown);
    }

    private void Form2_KeyDown(object sender, KeyEventArgs e)
    {
        int x = 11, y = 11;

        if (e.KeyCode == Keys.Right)
            x += 1;
        if (e.KeyCode == Keys.Left)
            x -= 1;
        if (e.KeyCode == Keys.Up)
            y -= 1;
        if (e.KeyCode == Keys.Down)
            y += 1;

        gamePanel.Controls.Remove(picturebox5);
        gamePanel.Controls.Add(picturebox5, x, y);
        picturebox5.ImageLocation = @"..\..\ResourcesPh\mouse.png";
        Refresh();
    }

    private void howToPlayToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Hide();
        Form3 f3 = new Form3();
        f3.FormClosed += (s, args) => Close(); //event handler on closing Form2 after Form3 is opened
        f3.Show();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

  }
}


TableLayoutPanel Grid

最佳答案

每次单击时,您始终将起始位置设置回11、11。将声明移出该范围:

int x = 11, y = 11;

private void Form2_KeyDown(object sender, KeyEventArgs e) {

10-08 06:30
查看更多