以下のようなカスタムコントロールを作成しました。
public partial class TextBoxEx : TextBox
{
public TextBoxEx()
{
InitializeComponent();
Font = Utility.normalFont;
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
//A utility class to initialize font.
class Utility
{
internal static Font normalFont = new Font("Arial", 18);
}
Form1 と Form2 の 2 つのフォームがあります。この TextBoxEx が Form2 に追加されます。Form1 のボタンをクリックすると、Form2 が表示されます。
Form2 を継続的に表示して閉じると、アプリケーションで GDI リークが発生します。GDI検出ツール(Bear.exe)で解析したところ、フォントがGDIリークの原因であることが判明しました。
私の質問は、
- TextBoxEx の Dispose() メソッドを呼び出してもフォントが解放されない理由 (Form2 を閉じているときに、TextBoxEx の Dispose() メソッドが自動的に呼び出されます)。
- フォントが原因の GDI リークを解決するにはどうすればよいですか? (Font.Dispose() は TextBoxEx の Dispose() メソッドで呼び出すことはできません。コンストラクターで「パラメーターが無効です」という例外がスローされるため)。