ルーレットホイールが付いたパネルがあり、ちらつきが止まるようにパネルをダブルバッファリングする必要があります。誰かが私を助けることができますか?
編集:
はい、試しました。
panel1.doublebufferedは存在せず、this.doublebufferedのみが存在します。また、フォームをバッファリングする必要はなく、パネルだけをバッファリングする必要があります。
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();
}
}
これを行う別の方法は、InvokeMemberメソッドを使用して、ダブルバッファーされたメンバーを呼び出すことです。
typeof(Panel).InvokeMember("DoubleBuffered", BindingFlags.SetProperty
| BindingFlags.Instance | BindingFlags.NonPublic, null,
panel2, new object[] { true });
このようにすることで、サブクラスを作成する必要がなくなります
DoubleBuffered
-プロパティをPanel
の派生クラスでパブリックにすることができます。
public class DoubleBufferedPanel : Panel
{
[DefaultValue(true)]
public new bool DoubleBuffered
{
get
{
return base.DoubleBuffered;
}
set
{
base.DoubleBuffered = value;
}
}
}
Winformパネルには DoubleBufferedプロパティ があります。
編集:私はそれが保護されていることに気づいたはずです。他の人はそれをサブクラス化する方法を説明しました。 :)
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