移动Panel的滚动条到窗口中间
2010-04-08 16:06
288 查看
一个组态软件项目,其中一个用来组态图形页的视图窗口需要实现这样一个功能:在该窗口第一次被显示出来时,要求滚动条移动到中间位置。
按照软件的设计结构,只要移动一个Panel的滚动条即可。
要移动滚动条,只要改变Panel的AutoScrollPosition属性即可。
那么,现在的问题是,怎么确定中间位置?
AutoScrollPosition的值是一个Point,那么,现在的问题就是想办法计算出该Point的X和Y值。这才是难点所在。
要说明这个问题,我这里不得不啰嗦啰嗦C#中窗口的滚动条管理机制。
对于一个拥有滚动条的窗口,该窗口的DisplayRectangle属性将被启用,DisplayRectangle描述了该窗口的“虚拟显示区”,也就是通过移动滚动条可以看到的窗口的最大绘图区。用户实时能够看到的那一块区域(实际显示区),使用窗口的Size属性(我们这里只在客户区绘图,所以用它的ClientSize属性)来给出(宽度CX和高度CY)。如下图所示:
.png]
移动滚动条,实际上就是平移实际显示区,也就是改变实际显示区的位置(X,Y坐标)。
由上,把滚动条移动到窗口的中间位置,就是把实际显示区平移到虚拟显示区的中间。计算方法如下:
this.AutoScrollPosition = new Point((this.DisplayRectangle.Width -
this.ClientSize.Width) / 2, (this.DisplayRectangle.Height -
this.ClientSize.Height) / 2);
问题解决得似乎很轻松,不是么?好,让我们试一下活吧。
从Panel派生一个新的类,叫ScrollPanel,然后重载其OnVisibleChanged方法。弄完后,你的代码应该看起来象这个样子:
.png]
不要忘记将ScrollPanel的AutoScroll属性设置成True.
好,现在用ScrollPanel创建一个实例m_panel,把它Dock到你的窗口中,最后在m_panel中嵌入一个比窗口客户区大得多的控件(比如StaticText).
代码看起来象这样:
.png]
运行你的程序吧,滚动条乖乖地等在了窗口的中间:
.png]
问题解决了吗?似乎是。如果你的窗口上只有一个Dock属性为Fill的Panel,那么,恭喜你,马马虎虎可以了。但如果不幸你在这个窗口上与Panel并列又放置了另一个能够获得焦点的控件,然后在这两个控件间切换一下焦点,怎么样?啊哈,Panel的滚动条复位到左、上角了?!困惑吗?我将在《如何阻止滚动条的自动复位并防止闪烁》中解决这个问题。
按照软件的设计结构,只要移动一个Panel的滚动条即可。
要移动滚动条,只要改变Panel的AutoScrollPosition属性即可。
那么,现在的问题是,怎么确定中间位置?
AutoScrollPosition的值是一个Point,那么,现在的问题就是想办法计算出该Point的X和Y值。这才是难点所在。
要说明这个问题,我这里不得不啰嗦啰嗦C#中窗口的滚动条管理机制。
对于一个拥有滚动条的窗口,该窗口的DisplayRectangle属性将被启用,DisplayRectangle描述了该窗口的“虚拟显示区”,也就是通过移动滚动条可以看到的窗口的最大绘图区。用户实时能够看到的那一块区域(实际显示区),使用窗口的Size属性(我们这里只在客户区绘图,所以用它的ClientSize属性)来给出(宽度CX和高度CY)。如下图所示:
.png]
移动滚动条,实际上就是平移实际显示区,也就是改变实际显示区的位置(X,Y坐标)。
由上,把滚动条移动到窗口的中间位置,就是把实际显示区平移到虚拟显示区的中间。计算方法如下:
this.AutoScrollPosition = new Point((this.DisplayRectangle.Width -
this.ClientSize.Width) / 2, (this.DisplayRectangle.Height -
this.ClientSize.Height) / 2);
问题解决得似乎很轻松,不是么?好,让我们试一下活吧。
从Panel派生一个新的类,叫ScrollPanel,然后重载其OnVisibleChanged方法。弄完后,你的代码应该看起来象这个样子:
.png]
不要忘记将ScrollPanel的AutoScroll属性设置成True.
好,现在用ScrollPanel创建一个实例m_panel,把它Dock到你的窗口中,最后在m_panel中嵌入一个比窗口客户区大得多的控件(比如StaticText).
代码看起来象这样:
.png]
运行你的程序吧,滚动条乖乖地等在了窗口的中间:
.png]
问题解决了吗?似乎是。如果你的窗口上只有一个Dock属性为Fill的Panel,那么,恭喜你,马马虎虎可以了。但如果不幸你在这个窗口上与Panel并列又放置了另一个能够获得焦点的控件,然后在这两个控件间切换一下焦点,怎么样?啊哈,Panel的滚动条复位到左、上角了?!困惑吗?我将在《如何阻止滚动条的自动复位并防止闪烁》中解决这个问题。
相关文章推荐
- 让弹出窗口在屏幕中间显示,没有滚动条,并且点击某行,窗口大小不变化.
- 在CListView中用SetScrollPos改变滚动条的位置后,窗口中显示的内容如何也跟着移动实现。
- 让 Panel 在滚动条拉动时画面就移动
- 禁用Panel容器滚动条自动移动位置的功能
- ie6下如何使得广告窗口不会因为滚动条的滚动而移动
- winform 移动窗口中的控件,panel
- 关于winform中panel中控件不随滚动条移动的解决办法。
- 在自动显示滚动条的窗口中,如何判断滚动条已显示
- 位置固定的层_总在最上面和总在最下面和总在中间_这里的滚动条是div的不是body的
- C# WinForm中Panel实现用鼠标操作滚动条的实例方法
- 在浏览器窗口大小变化时,自动出现或隐藏滚动条,隐藏横向滚动条,仅保留纵向的
- 将窗口移动到前端, BringWindowToTop() 的问题
- 转:用层模拟可移动的小窗口
- SWT编写界面窗口时让窗口处于屏幕中间
- 学习笔记--MFC在滚动条窗口如何使所图的图形不产生偏移
- QT笔记之自定义窗口拖拽移动
- js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
- 浏览器窗口滚动条设置
- leetcode 424. Longest Repeating Character Replacement 典型移动窗口解决问题
- js弹出可移动窗口实例_现用