首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制移动PictureBox

控制移动PictureBox
EN

Stack Overflow用户
提问于 2014-04-04 11:40:32
回答 2查看 2.3K关注 0票数 0

所以,我被塞在我的移动图片盒上;在我的表格2加载图片框开始移动的时候,这正是我想要的,但是它不在我的控制中,这就是我想要做的,但是我想要的是failed.....All,我想要的是由keys......Thanks控制的运动图片框的方向。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void Form2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Right) 
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X + 5, pictureBox1.Location.Y);
            }

            if (e.KeyCode == Keys.Up)
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y - 5);
            }

            if (e.KeyCode == Keys.Left)
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X - 5, pictureBox1.Location.Y);
            }

            if (e.KeyCode == Keys.Down)
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y + 5);
            }

        }

        private void timer1_Tick(object sender, EventArgs e)
        {

           pictureBox1.Location = new Point(pictureBox1.Location.X + 25, pictureBox1.Location.Y);
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-04 14:52:43

您需要一个变量来指示方框移动的方向:

代码语言:javascript
复制
    private enum Direction { None, Left, Right, Up, Down };
    private Direction currentDir = Direction.None;

计时器的滴答事件需要检查这个变量,以知道向哪个方向移动方框:

代码语言:javascript
复制
    private void timer1_Tick(object sender, EventArgs e) {
        int vel = 5;
        switch (currentDir) {
            case Direction.Left:  pictureBox1.Left -= Math.Min(vel, pictureBox1.Left); break;
            case Direction.Right: pictureBox1.Left += Math.Min(vel, this.ClientSize.Width - pictureBox1.Right); break;
            case Direction.Up:    pictureBox1.Top  -= Math.Min(vel, pictureBox1.Top); break;
            case Direction.Down:  pictureBox1.Top  += Math.Min(vel, this.ClientSize.Height - pictureBox1.Bottom); break;
        }
    }

您的KeyDown事件处理程序应该简单地设置变量:

代码语言:javascript
复制
    private void Form1_KeyDown(object sender, KeyEventArgs e) {
        switch (e.KeyData) {
            case Keys.Left:  currentDir = Direction.Left; break;
            case Keys.Right: currentDir = Direction.Right; break;
            case Keys.Up:    currentDir = Direction.Up; break;
            case Keys.Down:  currentDir = Direction.Down; break;
        }
    }

您还需要KeyUp事件,它应该停止再次移动框:

代码语言:javascript
复制
    private void Form1_KeyUp(object sender, KeyEventArgs e) {
        switch (e.KeyData) {
            case Keys.Left:  if (currentDir == Direction.Left)  currentDir = Direction.None; break;
            case Keys.Right: if (currentDir == Direction.Right) currentDir = Direction.None; break;
            case Keys.Up:    if (currentDir == Direction.Up)    currentDir = Direction.None; break;
            case Keys.Down:  if (currentDir == Direction.Down)  currentDir = Direction.None; break;
        }
    }
票数 3
EN

Stack Overflow用户

发布于 2014-04-04 11:47:05

计时器事件是在UI线程上引发的,因此键按事件被捕获得不够快。

在后台线程上运行计时器,它应该可以工作。请记住,计时器随后将进行跨线程调用,因此您需要使用Control.InvokeRequired。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22861825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档