| ■No91541 (魔界の仮面弁士) に追記 > Control.Font プロパティに「Dispose 済みの Font」や「null」が渡された場合、 > 『既定のフォントがセットされる』という動作になっているようです。
そもそも Font プロパティで内部管理されているものは、 Font オブジェクトのインスタンスそのものではなく、 それが指し示すアンマネージなハンドルっぽい?
// Compact Framework の Font オブジェクトの内部ハンドルを得る static IntPtr GetHandle(Font f) { BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo field = typeof(Font).GetField("m_htx", bf); if (field == null || f == null) { return IntPtr.Zero; } else { return (IntPtr)field.GetValue(f); } }
private void button1_Click(object sender, EventArgs e) { using (var f1 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular)) using (var f2 = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular)) { // 別のインスタンスだけど、同じハンドルが得られている。 // String でいうところの 文字列インターンプールのようなものだろうか? var h1 = GetHandle(f1); var h2 = GetHandle(f2); MessageBox.Show((h1 == h2) ? "同じ" : "違う");
// 一方のインスタンスを破棄してみる f1.Dispose();
// 破棄した方からは IntPtr.Zero が返される。 var h3 = GetHandle(f1); var h4 = GetHandle(f2); MessageBox.Show((h3 == h4) ? "同じ" : "違う"); } }
|