【问题标题】:winform move an image inside a pictureboxwinform在图片框内移动图像
【发布时间】:2019-10-26 15:24:34
【问题描述】:

我已经尝试了几个小时了,但我这辈子都做不到。

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

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

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

        }

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

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      没有足够的声誉来发表评论,但如果有人需要更多地控制移动的图像,我想添加 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;
      
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2014-04-26
        • 2019-06-15
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 2012-10-22
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多