アプリケーションのリソース リークをデバッグしていて、GDI オブジェクト リークをテストするテスト アプリを作成しました。OnPaint では、新しいアイコンと新しいビットマップを破棄せずに作成します。その後、ケースごとにタスク マネージャーで GDi オブジェクトの増加を確認します。ただし、アプリのメイン ウィンドウを再描画し続けると、アイコンの GDI オブジェクトの数が増えますが、ビットマップの変更はありません。アイコンがビットマップと同じようにクリーンアップされない特定の理由はありますか?
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 1. icon increases number of GDI objects used by this app during repaint.
//var icon = Resources.TestIcon;
//e.Graphics.DrawIcon(icon, 0, 0);
// 2. bitmap doesn't seem to have any impact (only 1 GDI object)
//var image = Resources.TestImage;
//e.Graphics.DrawImage(image, 0, 0);
}
}
テスト結果:
- アイコンとビットマップなし - 30 個の GDI オブジェクト
- ビットマップ - 31 GDI オブジェクトでは、数値は変わりません。
- アイコン付き - 31 で、ウィンドウを再描画すると数が増えます。