1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

任意のコントロールでダブルバッファリングを有効化する

Last updated at Posted at 2022-12-29

ダブルバッファリングとは

↓詳しく知りたい人向け

コントロールが描画される時、通常は、背景が描画されてから、前景が描画されます。この描画を直接画面に行うと、背景が描画された時に一瞬前景が消えるため、ちらついて見えてしまいます。
ダブルバッファリングを有効にすると、コントロールの描画はまずメモリバッファー(オフスクリーンバッファー)に行われます。そしてすべて描画し終えたところで、メモリバッファーの画像が画面にコピーされます。このようにダブルバッファリングでは画面に描画されるのは1度だけなので、ちらつきを抑えることができます。
ただしダブルバッファリングはそれだけメモリを消費しますので、環境や使い方などによってはパフォーマンスを低下させる可能性もあります。

https://dobon.net/vb/dotnet/control/doublebuffered.html から引用させて頂きました。

簡単に説明すると、ダブルバッファリングを有効化しないとコントロールの描画などを行ったときにちらつきが発生する可能性があるから、ダブルバッファリングを有効化しようってことです。
※メモリやCPUの消費が増える可能性もある

ダブルバッファリングを有効化するための関数

using System;
using System.Reflection;
using System.Windows.Forms;
/// 中略

/// <summary>
/// 任意のコントロールのダブルバッファリングを有効化・無効化します。
/// </summary>
/// <param name="control">任意のコントロール</param>
/// <param name="IsDoubleBuffered">有効 or 無効</param>
void ControlDoubleBuffered(Control control, bool IsDoubleBuffered)
{
    control.GetType().InvokeMember(
    "DoubleBuffered"
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
            null,
            control,
            new object[] { IsDoubleBuffered });
}

使い方

例:

/// 中略
ControlDoubleBuffered(this, true);
ControlDoubleBuffered(pictureBox1, true);

最後に

この関数を使うと、どのコントロールでも、簡単にダブルバッファリングが有効かできて便利だと思います。
ListViewとか、PictureBoxに描画するときとかに結構ちらつくので、ダブルバッファリングはなるべく使った方がいいと思います。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?