web-dev-qa-db-ja.com

パネルをダブルバッファリングするにはどうすればよいですか?

ルーレットホイールが付いたパネルがあり、ちらつきが止まるようにパネルをダブルバッファリングする必要があります。誰かが私を助けることができますか?

編集:

はい、試しました。

panel1.doublebufferedは存在せず、this.doublebufferedのみが存在します。また、フォームをバッファリングする必要はなく、パネルだけをバッファリングする必要があります。

16
T-Fox

PanelまたはPictureBoxから派生する必要があります。

バッファリングを有効にする方法によっては、これに影響があります。

This.DoubleBufferフラグを設定すると、問題がないはずです。

スタイルを手動で更新する場合は、WM_Paintでフォームを自分でペイントする必要があります。

本当に野心的な場合は、独自のバックバッファをビットマップとして維持および描画できます。


using System.Windows.Forms;

public class MyDisplay : Panel
{
    public MyDisplay()
    {
        this.DoubleBuffered = true;

        // or

        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        UpdateStyles();
    }
}
23
user79755

これを行う別の方法は、InvokeMemberメソッドを使用して、ダブルバッファーされたメンバーを呼び出すことです。

 typeof(Panel).InvokeMember("DoubleBuffered", BindingFlags.SetProperty    
            | BindingFlags.Instance | BindingFlags.NonPublic, null,
            panel2, new object[] { true }); 

このようにすることで、サブクラスを作成する必要がなくなります

11

DoubleBuffered-プロパティをPanelの派生クラスでパブリックにすることができます。

public class DoubleBufferedPanel : Panel
{        
    [DefaultValue(true)]
    public new bool DoubleBuffered
    {
        get
        {
            return base.DoubleBuffered;
        }
        set
        {
            base.DoubleBuffered = value;
        }
    }
}
5
Koopakiller

Winformパネルには DoubleBufferedプロパティ があります。

編集:私はそれが保護されていることに気づいたはずです。他の人はそれをサブクラス化する方法を説明しました。 :)

4
JP Alioto

User79775の答えを拡張するだけで、VB.netでこれを達成しようとしている場合は、次のようにします。

Imports System.Windows.Forms

Public Class MyDisplay
    Inherits Panel

    Public Sub New()
        Me.DoubleBuffered = True

        ' or

        SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        UpdateStyles()
    End Sub
End Class
0
Jyclop