C# 如何在windows窗体c中滚动增加picturebox大小?

C# 如何在windows窗体c中滚动增加picturebox大小?,c#,.net,winforms,picturebox,C#,.net,Winforms,Picturebox,我有一个windows窗体中的PictureBox控件,其中有一个可移动的矩形图形,当PictureBox大小大于某个特定大小时,我的PictureBox大小将根据矩形的位置而增加滚动条 public void PicBox_MouseDown(object sender, MouseEventArgs e) { if (rect.Contains(new Point(e.X, e.Y))) { mMove = true; }

我有一个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的大小将增大,并显示滚动条

这里一切正常,但我的问题是,无论pictureBox的大小有多大,向下拖动时滚动条工作正常,但当矩形向上拖动时,如果pictureBox的边缘与形状相交,则整个滚动条将重置为正常,通过看下面的图片,你将能够理解我想说的话

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

矩形的作用就好像是相对于winform而不是pictureBox跟踪X和Y坐标一样


我可以制作pictureBox作为绘画的母版吗?

恐怕这是不可能的

Winforms中,滚动条只会将溢出容器的内容重新显示出来。如果它们“下溢”,即如果它们的
顶部
和/或
左侧
值为负值,则不会显示
滚动条
,即使它们显示了(由于额外的溢出),它们也不会将它们带回来

最小滚动位置为

所以你必须确保不要让事情变得消极

您可以通过添加虚拟控件来强制执行
滚动条
,但这只允许您将
图片框
完全向上或向左滚动,而不是向后滚动

如果您真的想这样做,您可以检测情况并手动添加
滚动条
控件,并对其进行编码,以将
图片框
向下/向右移动

既然你问了,下面是一个例子。请注意,尽管使用有许多陷阱

  • 其中一个问题是,当真正的
    滚动条也出现时,如何处理这种情况?在这个例子中,我解决它的方法不是将滚动条添加到面板上,而是覆盖它;因此,当编码的滚动条显示时,真实的滚动条被隐藏
    
  • 另一个问题是数字:内容应该移动多少像素?我不让用户在任何地方滚动,而是向上滚动,当这种情况发生时,我将PictureBox向后移动,编码的滚动条消失
  • 作为最后一点警告,应该注意的是,一个编码的
    滚动条允许您对您拥有的控件执行操作;但是它不允许你真正进入负面领域我想这就是你真正想要的。但我认为这是不可能的
    
因此,我建议您不要使用下面的代码,除非您可以简单地将
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();
    }
}
//类级别的变量:
VScrollBar vScroll=null;
//进入阴性状态进行测试:
图1.Top=-15;
//现在检查一下我们是否需要一个VScrollBar
滚动检查();
无效滚动检查()
{
如果(图1.Top<0)
{
如果(vScroll==null)
{vScroll=new VScrollBar();vScroll.Parent=panel1.Parent;
vScroll.Scroll+=vScroll_Scroll;vScroll.BringToFront();
}
vScroll.Location=新点(面板1.Right-vScroll.Width-2,面板1.Top+1);
vScroll.Height=panel1.ClientSize.Height-2;
vScroll.Value=vScroll.max;
vScroll.Show();
}
其他的
{vScroll.Hide();}
}
void vScroll_Scroll(对象发送器,ScrollEventArgs e)
{
int delta=e.NewValue-e.OldValue;
if(δ<0)
{
pictureBox1.Top=0;
滚动检查();
}
}

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

不确定你想要什么,但是获得滚动PB的通常方法是将PictureBox放入面板中,面板的AutoCroll=true,PictureBox的AutoCroll=false。垂直拖动矩形时,PictureBox的高度会增加,我将矩形的位置和高度指定给PictureBox的大小,例如PictureBox。大小=矩形.Height+Rectangle.Y因此,当我向下拖动图片框并显示滚动条时,图片框的高度会增加,但当我向上拖动图片框时,正如您在上一张图像中所看到的,当图片框位于表单边缘上方时,滚动条会消失。这就是您所拥有的吗?如果是,问题是什么,或者这就是您想要的吗另外:什么是
Picbox\u鼠标点
绘图
?拖动代码在哪里?当picturebox位于窗体边缘上方时,是否为?在何处更改顶部或Y值??当图片框位于边缘上方时,更改为“是”。我已经更新了代码,Draw方法只是绘制矩形和节点。你可以给我一个链接,学习如何使用滚动条以及如何根据另一个控件操作滚动条(教程)?我已经编写了一个示例,但我怀疑使用它是否是一个好主意..左上区域的控件将永远不会显示,不管你做什么,除非你把它们移回去!