正常情况下,panel里面的控件坐标是一panel的左上为参照的相对坐标,可是我昨天发现:如果panel的滚动条下拉的话它居然就以panel的显示部分最左上为相对坐标。如图蓝色部分:
怎么办啊?我是在程序运行是添加新的控件到panel上的,但是Location设置总出问题,帮帮我。 

解决方案 »

  1.   

    本来就是这样的啊.不然要滚动条干什么呢.看看这个吧ScrollableControl
      

  2.   

    你要适时的修改pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;就完全可以解决你的问题。楼主是搞GIS的?
      

  3.   

    通常不直接使用 ScrollableControl 类。ContainerControl 和 Panel 类继承此类。ScrollableControl 类充当需要滚动功能的控件的基类。若要控件根据需要显示滚动条,请将 AutoScroll 属性设置为 true,并将 AutoScrollMinSize 属性设置为所需的大小。如果将控件的大小调整得小于指定的最小大小,或者有一个子控件位于控件的边界之外,就会显示相应的滚动条。若要手动重写哪些滚动条是可见的,请设置 VScroll 和 HScroll 两个属性。如果这两个属性中的任何一个设置为 false,即使 AutoScroll 属性设置为 true,相应的滚动条也是不可见的。可以处理 Scroll 事件来了解用户或代码滚动工作区的条件。将控件添加到可滚动控件中时,必须加上或减去 AutoScrollPosition 的 x 坐标和 y 坐标,作为距离所添控件的 Location 属性的相应坐标的偏移量。如果添加的控件在滚动位置的上方或左侧,则必须在目标位置的基础上加上该偏移量。如果添加的控件在滚动位置的下方或右侧,则必须减去该偏移量。
      

  4.   

    给你段代码:        public void StretchImage()
            {
                pictureBox1.Left = 0;
                pictureBox1.Top = 0;
                panel1.AutoScroll = false;
                pictureBox1.Height = panel1.Height;
                pictureBox1.Width = panel1.Width;            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            }
      

  5.   

    你可以用PICtureBox作为显示地图的控件。
      

  6.   

    this.showPanel.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.showPanel_MouseWheel);showPanel.AutoScrollPosition = new Point(0, showPanel.VerticalScroll.Value - e.Delta);
    intY = 0 - showPanel.AutoScrollPosition.Y;
    添加的时候把相对偏移量考虑进去
      

  7.   

    学习一下,啥时候winform能像网页一样自动布局就好了
      

  8.   

    给你个比较笨的方法.你动态添加的时候 添加前 先添加一个label设置 保证没有任何控件的Location 小于 Label的Location 这样等于记录了一为原点的位置.
    Label.Text="";
    Label.Location =new Point(0,0);
    下面你再添家PANEL 如果滚动条滚动了 取位置X=Label.Location.X+Panel.X;
    Y=Label.Location.Y+Panel.Y;
      

  9.   

    事实上我用3楼的intY = 位置 - showPanel.AutoScrollPosition.Y; 不知道为什么还是不行。
    用6楼的方法,我懒得加什么事件,我直接intY = 位置 - showPanel.VerticalScroll.Value就搞定了,但愿以后不出什么麻烦啊!9楼的方法不是比较笨,是很聪明的方法,可是我太匆忙了。Thank you!