现在的位置: 首页 > 综合 > 正文

移动Panel的滚动条到窗口中间

2013年02月05日 ⁄ 综合 ⁄ 共 1087字 ⁄ 字号 评论关闭

一个组态软件项目,其中一个用来组态图形页的视图窗口需要实现这样一个功能:在该窗口第一次被显示出来时,要求滚动条移动到中间位置。

 

按照软件的设计结构,只要移动一个Panel的滚动条即可。

 

要移动滚动条,只要改变Panel的AutoScrollPosition属性即可。

 

那么,现在的问题是,怎么确定中间位置?

 

AutoScrollPosition的值是一个Point,那么,现在的问题就是想办法计算出该Point的X和Y值。这才是难点所在。

 

要说明这个问题,我这里不得不啰嗦啰嗦C#中窗口的滚动条管理机制。

 

对于一个拥有滚动条的窗口,该窗口的DisplayRectangle属性将被启用,DisplayRectangle描述了该窗口的“虚拟显示区”,也就是通过移动滚动条可以看到的窗口的最大绘图区。用户实时能够看到的那一块区域(实际显示区),使用窗口的Size属性(我们这里只在客户区绘图,所以用它的ClientSize属性)来给出(宽度CX和高度CY)。如下图所示:

image

移动滚动条,实际上就是平移实际显示区,也就是改变实际显示区的位置(X,Y坐标)。

 

由上,把滚动条移动到窗口的中间位置,就是把实际显示区平移到虚拟显示区的中间。计算方法如下:

this.AutoScrollPosition = new Point((this.DisplayRectangle.Width -
this.ClientSize.Width) / 2, (this.DisplayRectangle.Height -
this.ClientSize.Height) / 2);

 

问题解决得似乎很轻松,不是么?好,让我们试一下活吧。

 

从Panel派生一个新的类,叫ScrollPanel,然后重载其OnVisibleChanged方法。弄完后,你的代码应该看起来象这个样子:

image

不要忘记将ScrollPanel的AutoScroll属性设置成True.

 

 

好,现在用ScrollPanel创建一个实例m_panel,把它Dock到你的窗口中,最后在m_panel中嵌入一个比窗口客户区大得多的控件(比如StaticText).
代码看起来象这样:

image

 

运行你的程序吧,滚动条乖乖地等在了窗口的中间:

image

 

问题解决了吗?似乎是。如果你的窗口上只有一个Dock属性为Fill的Panel,那么,恭喜你,马马虎虎可以了。但如果不幸你在这个窗口上与Panel并列又放置了另一个能够获得焦点的控件,然后在这两个控件间切换一下焦点,怎么样?啊哈,Panel的滚动条复位到左、上角了?!困惑吗?我将在《如何阻止滚动条的自动复位并防止闪烁》中解决这个问题。

抱歉!评论已关闭.