8

我已经尝试了几个小时了,但是对于我的生活,我无法做到这一点。

我要做的只是移动在winform应用程序的图片框中找到的图像。我的图像大约为 1000x1000 像素,而我的框是任意的,例如 400x500,因此,例如,当我单击鼠标时,我希望图像向左移动 50。但图像框应保持相同大小。

然而,就我的一生而言,我无法让它发挥作用。我能够做的是以下几点:

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

        }

此功能适用于我的 kinect 手指跟踪应用程序。因此,当应用程序在屏幕上找到一个可见的取景器点时,图像就会居中。但是,我最终希望图像随着我的手指移动而移动,这将在我完成将图像向一侧移动几个像素的基本步骤后实现。

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

4

2 回答 2

15

我做了一些研究,显然在 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,但我希望这能让您走上正轨。

于 2012-09-27T16:34:55.710 回答
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;

        }
    }
于 2019-08-29T16:57:54.383 回答