2

我有一个闪烁非常糟糕的 Winform 用户控件。控件的功能运行良好。它只是闪烁真的很糟糕。我正在将所有绘图都绘制到位图上,然后将DrawImage位图复制到屏幕上,所以我对发生的闪烁程度感到惊讶。这是我所拥有的摘录:

    private void ScrollPanel_Paint(object sender, PaintEventArgs e)
    {
        var c = (Calendar)Parent;

        Bitmap bmp = c.RequestImage();
        if (bmp == null)
            return;

        e.Graphics.DrawImage(bmp, new Rectangle(0, 0, ClientSize.Width, ClientSize.Height),
                             new Rectangle(0, _scrollOffset, ClientSize.Width, ClientSize.Height),
                             GraphicsUnit.Pixel);
        _bmpSize = bmp.Height;
        e.Graphics.Dispose();
        bmp.Dispose();
    }

    private void ScrollPanel_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _mouseDown = true;
            _oldMouseCoords = e.Location;
        }
    }

    private void ScrollPanel_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
            _mouseDown = false;
    }

    private void ScrollPanel_MouseMove(object sender, MouseEventArgs e)
    {
        if (_mouseDown && e.Location.Y < _oldMouseCoords.Y && _scrollOffset < _bmpSize - _scrollOffset - ClientSize.Height)
        {
            int offset = _oldMouseCoords.Y - e.Location.Y;
            _scrollOffset += offset;
            Refresh();
        }
        if (_mouseDown && e.Location.Y > _oldMouseCoords.Y && _scrollOffset > 0)
        {
            int offset = e.Location.Y - _oldMouseCoords.Y;
            _scrollOffset -= offset;
            Refresh();
        }
        _oldMouseCoords = e.Location;
    }

它应该做的是,当我用鼠标拖动时,它应该滚动位图,就是这样。就像我说的那样,功能一切正常。从Paint事件中可以看出,我所做的只是获取我的位图,然后将其直接复制到屏幕上。

任何帮助,将不胜感激。

4

1 回答 1

3

看看这个关于双缓冲的另一个问题,以确保你设置正确...... 启用双缓冲

根据我的经验,一旦设置了双缓冲,闪烁是由正在绘制的控件背景引起的,即使您选择自己进行所有绘制。我通过从正在绘制的控件派生我自己的控件类、覆盖 OnPaintBackground 方法并且不在该方法中调用基类实现来避免这种情况。

所以在你的情况下,我假设 ScrollPanel 是一个面板。我会从 Panel 派生一个类,并使用它来代替 Panel。然后我将覆盖 OnPaintBackground,并将该方法的主体留空。

完成所有这些后,我得到了与 WinForms 一样平滑的滚动。

于 2012-05-03T10:55:40.207 回答