我正在编写一个纸牌游戏,当我在做视觉部分时,我将面板中的卡从一个地方移动到另一个地方时遇到问题,当我尝试移动它时,图像保持闪烁并移动到每个地方。
这是我的代码.....
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 ......
答案 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。
我不知道你想要达到哪些效果,如果一切都是静态的,你没有大的活动部件,那么当前的解决方案就足够了。