0

我是新来的,但我会尽可能清楚地解释我的问题。我在带有垂直和水平滚动条的表单上放置红点,如果我将一个点放置在(50,590)并向右滚动,则该点会“跟随”移动。

我仍然无法发布图片,但我可以发布它们的链接,第一张图片是原始位置的点,第二张图片是我滚动到右 点原始位置后 的点,滚动后的点

我希望这些点在滚动时保持其原始位置,实际上我无法理解,而他们还没有这样做。

这是代码

Bitmap MyBitmap = new Bitmap(3000,3000);

Graphics MyGraphicObject;

Brush red = new SolidBrush(Color.Red);

private void Form1_Paint(object sender, PaintEventArgs e)
{
     MyGraphicObject = e.Graphics;
     MyGraphicObject.DrawImage(MyBitmap, 0, 0, MyBitmap.Width, MyBitmap.Height);
     MyGraphicObject.Dispose(); 
}

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
     MyGraphicObject = Graphics.FromImage(MyBitmap);
     MyGraphicObject.FillRectangle(red, e.X-2, e.Y-2, 4, 4);
}

你能帮我解决这个问题吗?

4

1 回答 1

0

有一个名为“拖动时显示窗口内容”的内置 Windows 设置,默认情况下在所有现代版本的 Windows 上打开。这样做是让 Windows 在您滚动时自动移动具有滚动条的窗口的内容。并且只为以前不可见的窗口部分生成绘制请求。

这就是使它看起来像您的位图在移动的原因。您需要通过强制重新粉刷整个窗口来修复它,而不仅仅是它的一部分。将此代码粘贴到您的表单类中:

    protected override void OnScroll(ScrollEventArgs se) {
        base.OnScroll(se);
        this.Invalidate(false);
    }

这将解决您的问题,您的位图现在重新绘制在同一位置。但是,并非没有从 Windows 设置中看到工件,一瞬间您会在滚动位置看到位图。视觉效果类似于看到你的位图在做 pogo。无法解决此问题,双缓冲无法解决此问题,并且您无法合理地关闭该设置。

顺便说一句,请修复代码中的错误,您不应该处理图形对象。你没有创造它。当您开始修补双缓冲时,这将在未来引起麻烦。删除该声明。

于 2012-12-17T12:36:38.227 回答