【问题标题】:How to scroll on increasing picturebox size in windows form c#?如何在 Windows 窗体 c# 中滚动增加图片框的大小?
【发布时间】:2015-04-23 05:41:46
【问题描述】:

我有一个windows窗体的PictureBox控件,里面画了一个可移动的矩形,我的PictureBox的大小会根据矩形的位置而增加,当PictureBox的大小大于特定大小时会出现滚动条。

public void PicBox_MouseDown(object sender, MouseEventArgs e)
{

       if (rect.Contains(new Point(e.X, e.Y)))
       {
           mMove = true;
       }

       oldX = e.X;
       oldY = e.Y;
}

 public void Picbox_MouseUp(object sender , MouseEventArgs e)
 {
      mMove = false;
 }

 public void Picbox_MouseMove(object sender,MouseEventArgs e)
 {
      if (mMove)
      {
            picBox.Cursor = Cursors.Cross;
            rect.X = rect.X + e.X - oldX;
            rect.Y = rect.Y + e.Y - oldY;
      }
      oldX = e.X;
      oldY = e.Y;
      picBox.Invalidate();
 }

public void Picbox_MousePaint(object sender, PaintEventArgs e)
{
        picBox.Invalidate();
        picBox.Size = new Size((rect.Width + rect.X) + 10, (rect.Height + rect.Y) + 10);
        Draw(e.Graphics);  
}

在第一次显示带有图片框的表单时

拖动矩形后,pictureBox 的大小增加并出现滚动条

这里一切正常,但我的问题是无论图片框的大小是多少,滚动条在我向下拖动时都可以正常工作,但是当矩形被向上拖动时,如果图片框的边缘符合表格整个滚动条恢复正常,看下面的图片你就能明白我想说什么了

如何解决这个问题,有没有另一种方法可以根据 pictureBox 的宽度增加滚动?我是新手。

矩形的行为就好像 X 和 Y 坐标是相对于 winform 而不是图片框进行跟踪的。

我可以将图片框作为我的绘图的父级吗?

【问题讨论】:

  • 不确定您想要什么,但获得滚动 PB 的常用方法是将 PictureBox 放在 Panel 中,其中 AutoCcroll=true 用于 Panel 和 false 用于 PictureBox。
  • 当我垂直拖动矩形并将矩形的位置和高度分配给图片框的大小时,图片框的高度会增加,例如图片框.Size = Rectangle.Height + Rectangle.Y 所以当我向下拖动它并出现滚动条时,图片框的高度会增加,但是当我向上拖动它时,如您在最后一张图片中看到的那样,当图片框位于表单边缘上方时,滚动条就消失了。
  • 这就是你所拥有的,如果是的话,问题是什么,或者你想要的是什么? - 另外:Picbox_MousePaintDraw 是什么?拖动代码在哪里?
  • 当图片框在表单边缘上方时 是吗?您在哪里更改 Top 或 Y 值??
  • 当图片框高于边缘时是。我已经更新了代码,Draw 方法只是绘制矩形和节点

标签: c# .net winforms picturebox


【解决方案1】:

恐怕这是不可能的。

Winforms Scrollbars 中只会将已溢出其容器的事物带回到视图中。如果它们“下溢”,即如果它们的Top 和/或Left 值为负,则不会显示ScrollBars,即使它们出现(由于额外的溢出)它们也不会将它们带回来。

最小滚动位置为zero

所以你必须确保不要把事情变成负面的!

您可以通过添加虚拟控件来强制执行ScrollBars,但这只会让您将PictureBox 完全向上或离开视线,而不是向后滚动!

如果您真的非常非常非常非常想要,您可以检测到情况并手动添加ScrollBar 控件并对其进行编码以将PictureBox 向下/向右移动..

既然你在问,这里有一个例子可以玩。请注意,尽管使用 coded ScrollBars 有很多陷阱..

  • 其中之一是当真正的ScrollBar 也出现时如何处理这种情况?在示例中,我通过不将 ScrollBar 添加到面板而是通过覆盖它来解决它;因此,真正的 ScrollBar 在显示编码的滚动条时被隐藏。
  • 另一个问题是数字:内容应该移动多少像素?我不会让用户在任何地方滚动,而是向上滚动,当发生这种情况时,我将 PictureBox 一直向后移动,编码的 ScrollBar 消失了..
  • 作为最后一点警告,应该注意的是,编码ScrollBar 可以让您对您拥有的控件进行操作;但它不会让你真正滚动到负面领域!我猜这是你真正想要的。但我认为这是不可能的!

所以,我建议您不要使用下面的代码,除非您可以简单地将 PictureBox.Top 归零!

// a variable at class level:
VScrollBar vScroll = null;

// move into negative for testing:
pictureBox1.Top = -15;
// now check to see if we need a VScrollBar
scrollCheck();

void scrollCheck()
{
    if (pictureBox1.Top < 0)
    {
        if (vScroll == null )
        { vScroll = new VScrollBar(); vScroll.Parent = panel1.Parent;
        vScroll.Scroll += vScroll_Scroll; vScroll.BringToFront();
        }
        vScroll.Location = new Point(panel1.Right - vScroll.Width - 2, panel1.Top + 1);
        vScroll.Height = panel1.ClientSize.Height - 2;
        vScroll.Value = vScroll.Maximum;
        vScroll.Show();
        }
    else
    { vScroll.Hide(); }
}

void vScroll_Scroll(object sender, ScrollEventArgs e)
{
    int delta = e.NewValue - e.OldValue;
    if (delta < 0)
    {
        pictureBox1.Top = 0;
        scrollCheck();
    }
}

总而言之,我真的相信避免这种情况是最好的..

【讨论】:

  • 你能给我一个链接来学习使用滚动条以及如何根据另一个控件操作滚动条(教程)吗?
  • 我已经编写了一个示例,但我怀疑使用它是否会是一个好主意.. 负左和上区域的控件永远不会显示,无论您做什么,除非您将它们移回!
猜你喜欢
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多