0

我正在编写一个纸牌游戏,当我在做视觉部分时,我在将面板内的卡片从一个地方移动到另一个地方时遇到了问题,当我尝试移动它时,图像会不停地闪烁并在每个地方移动。

这是我的代码......

public partial class Form1 : Form
{
    bool clicked = false;
    public Form1()
    {
        InitializeComponent();
        pictureBox1.ImageLocation = @"c:\kingHearts.png";
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        clicked = true;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (clicked)
            pictureBox1.Location = e.Location;
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        clicked = false;

    }
}

所以有什么问题,任何人都可以帮助PLZ....

4

3 回答 3

2

一种非常典型的模式,用于在运行时通过单击并拖动 ui 对象来移动,并且当控件位于窗体上或像 Panel 这样的容器中时,它将起作用

private bool pb_mouseIsDown;
private int oX;
private int oY;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    pb_mouseIsDown = true;
    oX = e.X;
    oY = e.Y;
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    pb_mouseIsDown = false;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (pb_mouseIsDown)
    {
        pictureBox1.Left += e.X - oX;
        pictureBox1.Top += e.Y - oY;
    }
}

注意:...在设计时:如果您为 MouseUp、MouseDown 和 MouseMove 定义事件处理程序,而控件“在”窗体上(控件的父级是窗体),然后将其剪切并粘贴到容器,如 Panel :您将在 IDE 中重新建立控件与 MouseDown、MouseUp 和 MouseMove 事件之间的绑定/链接,以使其正常工作。

于 2010-01-01T19:20:47.047 回答
0

e.Location返回鼠标相对于 PictureBox的位置。
您需要编写PointToClient(pictureBox1.PointToScreen(e.Location))以获取相对于表单的位置。

于 2010-01-01T19:13:24.530 回答
0

对于闪烁问题,可以将 this.DoubleBuffered 设置为 true。

但移动 PictureBox 或其他控件效率低下,最好将绘图代码写入 pictureBox1.Paint 事件或使用更快的东西,如 WPF、DirectX 或 OpenGL。

我不知道你想要达到什么样的效果,如果一切都是静态的并且你没有大的移动部件,那么当前的解决方案就足够了。

于 2010-01-01T19:23:12.590 回答