滚动面板时保持控制位置固定

时间:2009-12-24 11:25:32

标签: .net winforms .net-2.0 scroll

我在大型自定义面板 panel2 的左中间有一个标签 label1 ,它在父面板 panel1 中滚动。

alt text http://lh4.ggpht.com/_1TPOP7DzY1E/SzNN2g9Sv4I/AAAAAAAAC1U/A_LlLOoejX8/s800/formScroll.png

即使滚动,我也始终将 label1 保持在panel2的可见左侧中间位置。

在实际示例中,我的面板是一个用户控件,生成左侧的一些标签。面板滚动,但我需要保持标签始终可见。

怎么可能实现?

这是我的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        this.InitializeComponent();
    }

    protected Point clickPosition;
    protected Point scrollPosition;

    private void panel2_MouseDown(object sender, MouseEventArgs e)
    {
        this.clickPosition = e.Location;
    }

    private void panel2_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            this.SuspendLayout();
            this.scrollPosition += (Size)clickPosition - (Size)e.Location;
            this.panel1.AutoScrollPosition = scrollPosition;
            this.ResumeLayout(false);
        }
    }
}

3 个答案:

答案 0 :(得分:1)

嗯,技术上可行,你只需要在面板滚动时调整控制位置。例如:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      mPicturePos = pictureBox1.Location;
    }
    Point mPicturePos;
    private void panel1_Scroll(object sender, ScrollEventArgs e) {
      pictureBox1.Location = mPicturePos;
    }
  }

但是,当您滚动面板时,您将看到控件将开始执行pogo。这里的问题是Windows太有帮助了。它使用快速bitblt滚动窗口本身的内容,然后仅为需要重新绘制的窗口部分发送绘制请求。

它由名为“拖动时显示窗口内容”的系统选项执行此操作,可在“控制面板”中“显示”小程序的“外观+效果”对话框中找到。您无法合理地关闭此选项,它具有系统范围的效果。在Win7上它甚至不再暴露。

除了简单的解决方法之外,没有好的解决方法:不要将控件放在面板中。只需确保它位于面板顶部。这在设计师中可能有点棘手,把它放在面板旁边(必要时带到前面)并手动编辑位置属性。

答案 1 :(得分:0)

Hai serhio,

看看这与你的问题有关..但是我不知道它是否能解决你的问题无论如何试一试Maintaining the size and position of the Control in the form

和这一个 Maintain scroll position of treeview

答案 2 :(得分:0)

    public Form1()
    {
        this.InitializeComponent();
        panel2.Paint += new PaintEventHandler(panel2_Paint);
    }

    void panel2_Paint(object sender, PaintEventArgs e)
    {
        label1.Location = 
            new Point(-panel1.AutoScrollPosition.X, label1.Location.Y);
    }