我在Windows窗体中有一些用户控件。我想知道
如果我设置主窗体的Font
属性,其子窗口将获得a)新Font
的副本,或b)对新{{1}的引用},或c)什么都没有?
是否需要处理字体?例如,我可以安全地执行以下代码吗?
form.Font = new Font(...);
当父母(Font
或Form
)被处置时,字体会自动处理吗?
谢谢,
吉尔伯特
答案 0 :(得分:4)
两者。 Font属性是它自己的.NET对象。然而,Winforms缓存本机Windows字体,它们的创建成本相当高。 .NET包装器对象非常小。
是。代码很好,Font属性设置器已经处理了以前分配的字体。
是的,它由UserControl处理。而这又由其父母自动处理。
答案 1 :(得分:1)
Font
属性时,其子控件既不会获取System.Drawing.Font
对象的深层副本,也不会获得对它的引用。在赋值时,父窗体创建非托管字体对象句柄。所有子控件都订阅了父级的FontChanged事件,因此他们有机会获取此句柄并在以后用于文本呈现。如果未明确设置控件的Font属性(或默认字体),则控件的Font
属性getter返回父级的Font。 System.Drawing.Font
对象分配给控件的Font
属性时,先前分配的System.Drawing.Font
对象将被最终确定并且垃圾 - 如果在您的应用程序中不再有对它的引用,则收集。所以是的,你可以安全地做到这一点。 System.Drawing.Font
属性的Font
对象在处理控件时不会被处置,或者另一个System.Drawing.Font
被分配给Font
属性。因此,您可以安全地创建单个System.Drawing.Font
对象并将其分配给多个控件,这些控件是动态创建和处理的。您还可以自由创建多种字体并定期将它们分配给控件以创建一些视觉效果。内部非托管字体句柄由Windows窗体管理。答案 2 :(得分:0)
答案 3 :(得分:0)
据我所知,控件的Font属性用于确定绘制控件时要使用的字体设置,但与该属性关联的GDI字体不用于绘制。控件将不关心分配给其Font属性的Font是在分配之后,还是在分配之前处置的。该控件显然能够使用Font对象的一些隐藏方面,即使在Disposed之后也可以使用它来确定字体的相应属性,但我不知道是否
如果除了将其提供给Font属性getter之外没有其他原因,控件肯定会保留对传入字体对象的引用。但是,我不知道在分配字体后是否更好地处理字体,或者最好是在表格中保留字体的副本并在处理表格本身时将其丢弃。