【问题标题】:problem with moving picturebox移动图片框的问题
【发布时间】:2010-01-01 19:00:51
【问题描述】:

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

这是我的代码.....

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;

    }
}

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

【问题讨论】:

    标签: c# playing-cards


    【解决方案1】:

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

    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 事件之间的绑定/链接,以使其正常工作。

    【讨论】:

    • 感谢 BillW 它的工作原理。但我还有一个想法,如果我想将卡停靠在 realeas 上的其他面板上,我使用了以下但我错过了条件......? private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if() // 什么条件应该是“包含”!! { 图片框1.Left = panel1.Left;图片框1.顶部=面板1.顶部; } }
    • @Waleedoo,当鼠标上升时,在“卡片”移动后,只有“卡片”得到鼠标向上:您需要编写代码来测试哪个“卡片插槽”“适合”在。”使用 'Rectangle 类的 'InterSectsWith 方法来检查重叠: if (pictureBox1.Bounds.IntersectsWith(panel1.Bounds)) { // 找到匹配 } 一个典型的策略:制作一个 List :在那个上面做一个 'foreach列表以查找它应该“对齐”到哪个卡容器:如果不匹配:将卡卡回其原始位置。 “捕捉”匹配很简单:只需将卡片的边界设置为匹配“插槽”的边界。
    【解决方案2】:

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

    【讨论】:

    • 部分问题解决了,但是当我点击图片并移动它时,鼠标一直停留在图片的左上角..有没有解决这个问题的方法...???
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 2012-10-22
      • 1970-01-01
      • 2010-10-08
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多