winform在图片框内移动图像

时间:2012-09-26 14:13:45

标签: c# winforms

我一直试图这样做几个小时,但是对于我的生活,我无法做到这一点。

我要做的只是移动winform应用程序中图片框中的图像。我的图像大约是1000x1000像素,我的盒子就像400x500那样任意,所以,例如,当我点击鼠标时,我希望图像向左移动50。但图像框应保持相同的大小。

然而,对于我的生活,我无法让它发挥作用。我能做的是以下几点:

     if (kinectController.hands[0].fingertips.Count == 1)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

        }

此功能适用于我的kinect手指追踪应用。因此,当应用程序在屏幕上找到可见的单个查找点时,图像将居中。然而,我最终希望图像随着我的手指移动而移动,一旦我计算出将图像移动到一侧的基本步骤,就会出现这种情况。

对此有任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:14)

我做了一些研究,显然在PictureBox中移动图像并不是一件容易的事,至少我找不到任何能使这成为可能的东西(不是说没有办法做到这一点)虽然)。

然而,我提出了一些“解决方法”,看看这是否符合您的需求。要做到这一点:

  • 创建一个Panel控件,并将其调整为您的大部分图像 想要展示
  • 在该面板内放置一个PictureBox控件,其中包含您的图像 并将SizeMode属性设置为AutoSize。

现在,将此代码放在您的表单中

private bool Dragging;
private int xPos;
private int yPos;
private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { Dragging = false; }
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) { 
        Dragging = true;
        xPos = e.X;
        yPos = e.Y;
    }
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
    Control c = sender as Control;
    if (Dragging && c!= null) {
        c.Top = e.Y + c.Top - yPos;
        c.Left = e.X + c.Left - xPos;
    }
}

现在,无论何时单击并拖动PictureBox,它都不会实际移动其中的图像,而是在面板中的PictureBox控件。再一次,不完全是你想要的,我不确定这会如何转换为Kinect,但我希望这能让你走上正轨。

答案 1 :(得分:1)

信誉欠佳,无法发表评论,但如果有人需要对图像的移动进行更多控制,以使图像不能越过边界,我想补充一下本·布莱克(Ben Black):

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        Control c = sender as Control;
        if (Dragging && c != null)
        {
            int maxX = pictureBox1.Size.Width * -1 + panel.Size.Width;
            int maxY = pictureBox1.Size.Height * -1 + panel.Size.Height;

            int newposLeft = e.X + c.Left - xPos;
            int newposTop = e.Y + c.Top - yPos;

            if (newposTop > 0)
            {
                newposTop = 0;
            }
            if (newposLeft > 0)
            {
                newposLeft = 0;
            }
            if (newposLeft < maxX)
            {
                newposLeft = maxX;
            }
            if (newposTop < maxY)
            {
                newposTop = maxY;
            }
            c.Top = newposTop;
            c.Left = newposLeft;

        }
    }