移动图片框的问题

时间:2010-01-01 19:00:52

标签: c# playing-cards

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

这是我的代码.....

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 ......

3 个答案:

答案 0 :(得分: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;
    }
}

注意:...在设计时:如果为控件“打开”Form(控件的父级是Form),则为MouseUp,MouseDown和MouseMove定义事件处理程序,然后剪切并粘贴它进入一个容器,就像一个Panel:你将重新建立控件与IDE中的MouseDown,MouseUp和MouseMove事件之间的绑定/链接,以使其工作。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

但是移动PictureBox或其他Control是低效的,更好的方法是将绘图代码写入pictureBox1.Paint事件或使用更快的东西,如WPF,DirectX或OpenGL。

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