Welcome

首页 / 软件开发 / C# / C#发现之旅:WinForm.NET中开发具有固定背景图片的可滚动控件

C#发现之旅:WinForm.NET中开发具有固定背景图片的可滚动控件2011-04-27 博客园 袁永福在WinForm.NET开发中,可以使用一个Panel或UserControl作为一个带滚动条的容器放置 图形或其他控件。我们可以设置控件的BackgroundImage属性来设置控件的背景图片,但这个 背景图片是会随着控件内容的滚动而滚动的,而且还出现背景破碎的不良效果。现笔者在开 发实践中遇到控件的背景图片不随着控件的滚动而滚动。

在B/S开发中,开发者可以 使用“background-attachment:fixed”的CSS样式来固定HTML文档的背景图片, 使之不随着内容的滚动而滚动。但在WinForm.NET开发中却没这个功能。

于是袁某人 又开始路漫漫其修远兮,到处上下而求索,居然得出了一个解决方法,在此使用发现问题, 分析问题和解决问题的步骤来一一道来,希望能为遇到相同问题的人一点启发。

发现 问题

首先说说WinForm.NET滚动时背景也随之滚动的原理。如下图所示,笔者在一 个窗体上放置一个Panel控件,设置了一个尺寸较大的背景图片,然后设置控件的AuotScroll 值为true,设置控件的AutoScrollMinSize属性值为背景图片的大小,则这个控件就会如下图 所示的显示滚动条。

笔者向 下拖拽控件的垂直滚动条,使得控件的内容发生滚动。在默认情况下,Windows操作系统会自 动实现控件客户区视图的滚动,例如滚动操作导致了100个像素的滚动距离,Windows会自动 的将控件客户区显示的内容向上平移100个像素,于是控件下方新腾出来100个像素高度的客 户区,这个客户区就是控件的无效矩形,Windows操作系统会向控件发送WM_PAINT消息,导致 触发控件的Paint事件,从而调用程序代码来重新绘制这100个像素高度的区域。