是否可以在 WinForms 中以编程方式触发“假”滚动?
场景:
使用 System.Drawing 完成的带有各种绘图的表单(并且没有滚动条)。
我想要什么:
- 以编程方式告诉表单用户已向左滚动 10 个像素。
- 表单将现有绘图向左移动 10 个像素。
- 窗体生成一个带有 ClipRectangle 的绘制事件,其中仅包含右侧的 10 个现在为空的像素。
这是可能的还是我需要自己处理?
您可以将面板添加到比窗体大的窗体中。保持滚动条关闭,通过设置 Panel 的 VerticalScroll 和 HorizontalScroll 属性的 value 属性手动滚动面板。
然后将您的绘图添加到面板而不是表单。
this.panel1.VerticalScroll.Value = 50;
this.panel1.HorizontalScroll.Value = 100;
由于您使用的是 System.Drawing,因此您需要告诉绘图方法(OnPaint() 或您正在绘制的位置)以 -10 像素的 x 偏移量开始绘制。然后,您绘制的所有内容都将被该金额抵消。
将整个绘图向左移动 10 个像素会导致整个屏幕区域无效,而不仅仅是屏幕右侧的 10 个像素。有几种方法可以做到这一点:
1)将您的偏移量设置为 -= 10 像素。通过调用 Invalidate() 使整个屏幕无效。这将强制重绘整个屏幕,并且只要您正确编码了偏移量,就会重绘 10 像素以上的所有内容。2)对屏幕上的内容进行内存转储并从中制作图像。然后将该图像重绘到屏幕左侧 10 像素处。之后,只需使最右边的 10 个像素无效。
事实上,方法#2 比方法#1 慢很多。如果您没有数以百万计的东西需要绘制,那么重绘屏幕会非常快。
老实说,我不知道这是否可行,但我的猜测是,如果表单上没有滚动条,它就不会。
但是,我希望如果您的 PictureBox 控件的大小大于窗体的客户区域,并且您移动了它,它将仅使用特定的剪辑区域进行更新。
您可以尝试将绘图放在单独的容器中,然后将容器的位置移动到主窗体之外的位置。.location = -10,0 例如。这将产生一种错觉,即它从屏幕上移动了一定数量的像素。如果位置更改未成功执行此操作,您也可以始终触发自己的重绘事件。除此之外,您始终可以所有者绘制所有内容。