滚动期间面板背景不刷新(C#/VB.net)
我在C#和VB.net中有一个奇怪的滚动/背景错误。 当我创建一个面板并使用Autoscroll时,在滚动期间背景不会更新。 最后看起来真的很奇怪(视频:) 我用TabControl做了同样的尝试,背景像应该的那样滚动。 我尝试了外部滚动条,同样的情况也发生了。我也试过VB.net。 我认为这是一个来自视觉工作室的错误,如果有人能帮助我,我将不胜感激滚动期间面板背景不刷新(C#/VB.net),c#,vb.net,C#,Vb.net,我在C#和VB.net中有一个奇怪的滚动/背景错误。 当我创建一个面板并使用Autoscroll时,在滚动期间背景不会更新。 最后看起来真的很奇怪(视频:) 我用TabControl做了同样的尝试,背景像应该的那样滚动。 我尝试了外部滚动条,同样的情况也发生了。我也试过VB.net。 我认为这是一个来自视觉工作室的错误,如果有人能帮助我,我将不胜感激 谢谢,LG 如果您想使用滚动条滚动图像,只需扩展面板并覆盖OnPaintBackground即可轻松完成 请记住,如果执行此操作,则必须将控件设置
谢谢,LG 如果您想使用滚动条滚动图像,只需扩展
面板
并覆盖OnPaintBackground
即可轻松完成
请记住,如果执行此操作,则必须将控件设置为双缓冲(在下面的代码中为您执行此操作)
在本例中,我添加了一个“平铺”选项。因此,您可以使用一个大图像,或者使用无缝平铺并平铺它(通过BackgroundImageLayout
属性设置。所有其他选项都将绘制相同的图像)
C#
如何使用此功能
添加
,然后选择类
。命名类PanelEx.vb
Panel
的所有实例更改为PanelEx
我对C有点陌生,所以我真的不明白你刚才做了什么,通常我用VB。你能不能把这件事告诉我,或者你能上传这个项目?这是我要下载的项目:它只是一个简单的测试程序。问题出在视频中()。如果你能修改我的测试程序,那将非常有帮助。我真的很感激你能帮助我,谢谢你。哇,它真的起作用了。谢谢:)有没有办法在VB.net中做同样的事情?@zkevin--我已经10年没有写VB.net代码了,但我会试一试:)谢谢你,我真的很感谢你,再次感谢你!它工作得非常好,现在我终于可以继续我的程序了。谢谢:)实现面板的滚动事件,在事件处理程序中调用面板的Invalidate()方法。它确实像一个廉价的汽车旅馆一样闪烁,但是如果图像不是最佳的,这就是《汉帕桑》的主题——我下面的解决方案有什么问题吗?它一点也不闪烁,并且有平滑的滚动。
using System.Drawing;
using System.Windows.Forms;
public class PanelEx : Panel
{
public PanelEx()
{
DoubleBuffered = true;
}
protected override void OnPaintBackground(PaintEventArgs e)
{
if (BackgroundImage != null)
{
if (ImageLayout.Tile == BackgroundImageLayout)
{
for (int x = 0; x <= DisplayRectangle.Width;
x += BackgroundImage.Width)
{
for (int y = 0; y <= DisplayRectangle.Height;
y += BackgroundImage.Height)
{
e.Graphics.DrawImage(BackgroundImage,
new Point(x - HorizontalScroll.Value,
y - VerticalScroll.Value));
}
}
}
else
{
e.Graphics.DrawImage(BackgroundImage,
new Point(-HorizontalScroll.Value, -VerticalScroll.Value));
}
}
else
{
base.OnPaintBackground(e);
}
}
}
Public Class PanelEx
Inherits Panel
Public Sub New()
DoubleBuffered = True
End Sub
Protected Overrides Sub OnPaintBackground(e As PaintEventArgs)
If Not BackgroundImage Is Nothing Then
If BackgroundImageLayout = ImageLayout.Tile Then
Dim x As Integer, y As Integer
While x <= DisplayRectangle.Width
y = 0
While y <= DisplayRectangle.Height
e.Graphics.DrawImage(
BackgroundImage,
New Point(x - HorizontalScroll.Value,
y - VerticalScroll.Value))
y += BackgroundImage.Height
End While
x += BackgroundImage.Width
End While
Else
e.Graphics.DrawImage(BackgroundImage,
New Point(-HorizontalScroll.Value,
-VerticalScroll.Value))
End If
Else
MyBase.OnPaintBackground(e)
End If
End Sub
End Class