1

ダブルバッファリングがよく話題になることは知っていますが、どれだけ検索してさまざまなアプローチを試しても、ちらつきなしでコントロールを再描画することはできません。これが私のコードです:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Emgu.UI
{
    public class DoubleBufferedPictureBox : Control
    {
        const BufferedGraphics NO_MANAGED_BACK_BUFFER = null;

        BufferedGraphicsContext GraphicManager;
        BufferedGraphics ManagedBackBuffer;

        public Bitmap Bitmap { get; set; }
        public Rectangle DrawRectangle { get; set; }

        public DoubleBufferedPictureBox()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);

            GraphicManager = BufferedGraphicsManager.Current;
            GraphicManager.MaximumBuffer =
                   new Size(Width + 1, Height + 1);
            ManagedBackBuffer =
                GraphicManager.Allocate(CreateGraphics(),
                                               ClientRectangle);

            Resize += DoubleBufferedPictureBox_Resize;
        }

        void DoubleBufferedPictureBox_Resize(object sender, EventArgs e)
        {
            if (ManagedBackBuffer != NO_MANAGED_BACK_BUFFER)
                ManagedBackBuffer.Dispose();

            GraphicManager.MaximumBuffer =
                  new Size(Width + 1, Height + 1);

            ManagedBackBuffer =
                GraphicManager.Allocate(CreateGraphics(),
                                                ClientRectangle);
            Refresh();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            ManagedBackBuffer.Graphics.DrawImage(Bitmap, DrawRectangle);
            ManagedBackBuffer.Render(pe.Graphics);
        }

    }
}

何か案は?

4

5 に答える 5

2

.Net 2.0 を使用していますか? もしそうなら、古い頑固なWin32コントロールが埋め込まれていても、次のウィンドウスタイルがうまくいくことがわかりました。それも高速です!

// Note the >>> Optimized <<< DoubleBuffer
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);

常にWM_PAINT メッセージ内から描画するようにしてください。そうしないと、ちらつきます。他に何も必要ありません。すべてが自動です。

于 2009-02-04T22:17:14.280 に答える
2

何てことだ...

コメントで述べたように、pictureBox は、私が作成していない別の Control に含まれています (ただし、ソースはあります)。ちらつきは、次の 2 つの行によって引き起こされていることがわかります。

if (pictureBox.Width != _displayedImage.Width) pictureBox.Width = _displayedImage.Width;
if (pictureBox.Height != _displayedImage.Height) pictureBox.Height = _displayedImage.Height;

PictureBoxが実際に親コントロールにドッキングされているためだと思います...

とにかく、すべての回答に感謝します。

于 2009-02-04T19:12:06.713 に答える
0

親コントロール(フォーム?)のペイントもダブルバッファリングされていますか?

カスタムコントロールはちらつきなしでペイントできますが、親コントロールがペイントされていてダブルバッファリングされていない場合は、ちらつきが発生します。

間違ったことをダブルバッファリングしている可能性があります。

于 2009-02-04T17:02:07.287 に答える
0

コントロールのDoubleBufferedプロパティをtrueに設定してみましたか?

于 2009-02-04T16:43:00.570 に答える
0

問題はMSDNの OnPaint メソッドにあると思います。ManagedBackBuffer.Render メソッドを呼び出すときは、Graphics プロパティではなく CreateGraphics() を渡す必要があります。

于 2009-02-04T17:11:03.680 に答える