オーナードローを使ってアニメーションさせると表示がちらついてしまう
お世話になります。
C#にて、配置したListBoxをオーナードローさせることで、簡単なアニメーションを
させようとしています。現在選択中のセルの中にのみアニメーションをさせればと
やっていますが、TimerでRefreshをさせるたびにListBoxがちらついてしまいます。
当然と言えば当然なのですが、そのあとDoubleBufferedをTrueにしてみたり
OnPaintBackgroundを空でオーバーライドしてみたりやってみたのですが、
どうしてもちらつきが出てしまいます。
ちらつきをせずにアニメーションをさせる方法はありますでしょうか。
下記がそのコードです。
public class AnimeList : ListBox
{
private Timer timer = new Timer();
private int iXpos = 0;
public TunesList()
{
this.ScrollAlwaysVisible = true;
this.Font = new Font("メイリオ", 8, FontStyle.Regular);
this.ItemHeight = 20;
this.DrawMode = DrawMode.OwnerDrawFixed;
this.DrawItem += new DrawItemEventHandler(this.listBox1_DrawItem);
this.DoubleBuffered = true;
this.timer.Interval = 100;
this.timer.Tick += new System.EventHandler(this.timer1_Tick);
this.timer.Enabled = true;
}
/// <summary>
/// セルの描画
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (this.DesignMode)
{
return;
}
//ListBoxが空のときにListBoxが選択されるとe.Indexが-1になる
if (e.Index < 0)
{
return;
}
//描画する文字列の取得
string s = ((ListBox)sender).Items[e.Index].ToString();
e.DrawBackground();
Brush b = null;
// 選択されていないセル
if ((e.State & DrawItemState.Selected) != DrawItemState.Selected)
{
e.Graphics.FillRectangle(Brushes.Black, e.Bounds);
b = new SolidBrush(Color.White);
//文字列の描画
e.Graphics.DrawString(s, this.Font, b, e.Bounds.X + 4, e.Bounds.Y);
}
// 選択中のセル
else
{
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
b = new SolidBrush(Color.Black);
//文字列の描画
e.Graphics.DrawString(s, this.Font, b, e.Bounds.X + 4 + this.iXpos, e.Bounds.Y);
}
//後始末
b.Dispose();
//フォーカスを示す四角形を描画
e.DrawFocusRectangle();
}
private void timer1_Tick(object sender, EventArgs e)
{
this.iXpos -= 2;
if(this.iXpos < -128)
{
this.iXpos = 0;
}
this.Refresh();
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// 何もしない
}
}
以上、よろしくお願いいたします。