如何使用按键上下移动面板

本文关键字:移动 上下 何使用 | 更新日期: 2024-10-22 13:20:25

我在窗体窗口上有一个picturebox。在这个图片框中,我想使用键上下移动面板(作为圆形面板),只有当我点击它时。

IE:有3个面板具有以下X、Y:

  • 面板1(5,5)面板2(10,5)面板3(15,5)

因此,如果我点击面板1,我会关注它,只关注它,然后如果我点击upKey或DownKey,我会在图片框中向上或向下移动这个面板。单击另一个对象可以将焦点留在面板上。

如果我点击面板2或面板3也是一样。

任何帮助和提示都将不胜感激。

谢谢

更新#2

我做了一些更改,现在我可以通过单击面板来向上或向下移动它。现在的问题是,如果我点击panel1来获得焦点并向上或向下移动,它会随着panel2的切换而移动。如果我点击面板1,我只想移动它。。为面板对象设置一个新的bool属性,在单击时启用或禁用它,这似乎不起作用,通过单击面板,然后单击向上/向下键,什么都不会发生。

下面是我更新的两个类的完整代码:

Class CircleButton(面板)

public class CircleButton : Panel
{
    //Properties to draw circle
    float radius;
    public float Radius
    {
        get { return radius; }
        set
        {
            radius = value;
            this.Size = new Size((int)Radius, (int)Radius);
        }
    }

    Point centre;
    public Point Centre
    {
        get { return centre; }
        set
        {
            centre = value;
            this.Location = Centre;
        }
    }
    public string Message { get; set; }
    bool active;
    public bool Active
    {
        get { return active; }
        set
        {
            active = value;
            this.Enabled = active;
        }
    }
    public CircleButton()
    {
        //Default Values
        this.BackColor = Color.Black;
        Radius = 1;
        Centre = new Point(0, 0);
        Active = false;
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        //Defines a graphic path and set it as the panel's region
        //For custom region use different path's
        if (centre != null)
        {
            GraphicsPath path = new GraphicsPath();
            path.AddEllipse(0, 0, radius, radius);
            this.Region = new Region(path);
            path.Dispose();
        }
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        Focus();
    }
}

表单类

public partial class FormView : Form
{      
    private int _x;
    private int _y;
    CircleButton panel;
    public FormView()
    {
        InitializeComponent();
        _x = 20 ;
        _y = 20 ;            
    }
    protected void panel_Click(object sender, EventArgs e)
    {
        //Display Message
        //panel = (CircleButton)sender;
        //MessageBox.Show(panel.Message);          
        panel.Focus();
        panel.Active = true;
        panel.PreviewKeyDown += new PreviewKeyDownEventHandler(panel_KeyDown);
    }
    private void panel_KeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (panel.Active == true)
        {
            if (e.KeyCode == Keys.Up)
            {
                _y -= 10;
                Invalidate();
            }
            if (e.KeyCode == Keys.Down)
            {
                _y += 10;
                Invalidate();
            }
        }
    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        panel = new CircleButton();
        panel.Centre = new Point(_x, _y);
        panel.Radius = 10;
        panel.BackColor = Color.Red;
        panel.Active = false;
        pictureBox1.Controls.Add(panel);
        panel.Click += new EventHandler(panel_Click) ;
        panel = new CircleButton();
        panel.Centre = new Point(_x+50, _y);
        panel.Radius = 10;
        panel.BackColor = Color.Black;
        panel.Active = false;
        pictureBox1.Controls.Add(panel);
        panel.Click += new EventHandler(panel_Click);
    }

}

我该怎么解决这个问题?

如何使用按键上下移动面板

private void Form1_KeyDown(object sender, KeyEventArgs e)   
    {
        if (isMoving == true)
        {
            if (e.KeyCode == Keys.Up)
            {
                _y -= 10;
                Invalidate();
            }
            if (e.KeyCode == Keys.Down)
            {
                _x -= 10;
                Invalidate();
            }
        }     
    }

您遇到的问题是您的if statements不在KeyDown event中。他们使用e.KeyCode的方式是正确的。如果你需要更多关于KeyDown和/或KeyPress事件的信息,我建议点击这个链接

我希望这有帮助,如果你有任何进一步的问题,请随时询问。