2009-12-24 118 views
0

当十个分量固定的控制位置我有一个大的自定义面板是Panel2即在父面板PANEL1滚动的左中部的标签label1的滚动面板

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

我会始终保持在是Panel2的可见光左中间LABEL1,滚动时也是如此。

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

如何实现?

这是我的代码:

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); 
     } 
    } 
} 

回答

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); 
    } 
1

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

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上它甚至不再暴露。

除此之外,没有很好的解决方法:不要将控件放在面板中。只要确保它位于面板的顶部。这对设计师来说可能有点棘手,把它放在面板的旁边(如果需要的话带到前面)并手工编辑位置属性。

+0

我认为,而不是我的例子中的pictureBox1我应该使用panel2 ...但。我试过你的代码 - 任何改变。我需要保持标签不是panel2(PictureBox在您的代码中) – serhio 2009-12-24 15:01:29

+0

Erm,我的建议是*不*将控件放在面板中。 – 2009-12-24 15:14:55

+0

在实际的例子中,我的面板是一个用户控件,它在其左侧生成*(创建并控制添加)一些标签。面板滚动,但我需要保持标签始终可见。我将用这些信息来完成这个问题。 – serhio 2009-12-28 09:24:06