如何使用按键上下移动面板
本文关键字:移动 上下 何使用 | 更新日期: 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事件的信息,我建议点击这个链接
我希望这有帮助,如果你有任何进一步的问题,请随时询问。