在WinForms中,是否有可能通过编程方式触发“虚拟”滚动条?

3
在WinForms中,是否有可能通过编程方式触发“虚假”滚动?
场景如下: 一个包含各种System.Drawing绘图的窗体(没有滚动条)。
我想要的是:
1. 通过编程方式告诉窗体用户向左滚动了10个像素。 2. 窗体将现有的绘图向左移动10个像素。 3. 窗体生成一个Paint事件,其中ClipRectangle仅包含现在为空的右侧10个像素。
这是否可行,还是需要自己处理?
4个回答

3
你可以在表单中添加一个比表单更大的面板。关闭滚动条,通过设置面板的VerticalScroll和HorizontalScroll属性的值手动滚动面板。然后将你的绘图添加到面板而不是表单中。
 this.panel1.VerticalScroll.Value = 50;
this.panel1.HorizontalScroll.Value = 100;

1

我真的不知道那是否可行,但我的猜想是如果表单上没有滚动条,它就不会起作用。

然而,我期望如果您有一个PictureBox控件,其大小大于表单的客户区域,并且您移动它,它将仅更新特定的剪辑区域。


1
你可以尝试将绘图放在一个单独的容器中,然后只需移动容器的位置到主窗体之外的位置。例如,.location = -10,0。这将创建一种假象,即它移动了屏幕上的某些像素。如果位置更改无法成功实现此操作,您还可以始终触发自己的重绘事件。除此之外,您也可以自己绘制所有内容。

1

由于您正在使用System.Drawing,您需要告诉绘图方法(OnPaint()或者您正在绘制的任何地方)从-10像素的x偏移开始绘制。然后您绘制的所有内容都将被该数量偏移。

将整个绘图向左移动10像素会导致使整个屏幕区域无效,而不仅仅是屏幕右侧的10像素。有几种方法可以解决这个问题:

1)将偏移量设置为-= 10像素。通过调用Invalidate()来使整个屏幕无效。这将强制重新绘制整个屏幕,并且只要您正确编码了偏移量,就会将所有内容重绘10像素。 2)对屏幕上的内容进行内存转储,并将其制作成图像。然后将该图像向左移动10像素到屏幕外。之后,只需使最右侧的10像素无效即可。

事实上,方法#2比方法#1慢得多。如果您没有数百万需要绘制的东西,那么重新绘制屏幕会非常快速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接