Windows窗体字体问题第1部分

时间:2011-02-28 22:44:47

标签: winforms fonts dispose

我在Windows窗体中有一些用户控件。我想知道

  1. 如果我设置主窗体的Font属性,其子窗口将获得a)新Font的副本,或b)对新{{1}的引用},或c)什么都没有?

  2. 是否需要处理字体?例如,我可以安全地执行以下代码吗?

    form.Font = new Font(...);

  3. 当父母(FontForm)被处置时,字体会自动处理吗?

  4. 谢谢,
    吉尔伯特

4 个答案:

答案 0 :(得分:4)

  1. 两者。 Font属性是它自己的.NET对象。然而,Winforms缓存本机Windows字体,它们的创建成本相当高。 .NET包装器对象非常小。

  2. 是。代码很好,Font属性设置器已经处理了以前分配的字体。

  3. 是的,它由UserControl处理。而这又由其父母自动处理。

答案 1 :(得分:1)

  1. 当设置主窗体的Font属性时,其子控件既不会获取System.Drawing.Font对象的深层副本,也不会获得对它的引用。在赋值时,父窗体创建非托管字体对象句柄。所有子控件都订阅了父级的FontChanged事件,因此他们有机会获取此句柄并在以后用于文本呈现。如果未明确设置控件的Font属性(或默认字体),则控件的Font属性getter返回父级的Font。
  2. Windows窗体执行任何其他属性在逻辑上的期望:当您将System.Drawing.Font对象分配给控件的Font属性时,先前分配的System.Drawing.Font对象将被最终确定并且垃圾 - 如果在您的应用程序中不再有对它的引用,则收集。所以是的,你可以安全地做到这一点。
  3. 分配给控件的System.Drawing.Font属性的
  4. Font对象在处理控件时不会被处置,或者另一个System.Drawing.Font被分配给Font属性。因此,您可以安全地创建单个System.Drawing.Font对象并将其分配给多个控件,这些控件是动态创建和处理的。您还可以自由创建多种字体并定期将它们分配给控件以创建一些视觉效果。内部非托管字体句柄由Windows窗体管理。

答案 2 :(得分:0)

  1. 如果子表单已打开,则不会获得副本。
    • 如果子表单确实继承了父字体,则对此进行一些扩展。我不认为在窗口打开后更改父字体会影响子字体。
  2. 垃圾收集器应该处理它。

答案 3 :(得分:0)

据我所知,控件的Font属性用于确定绘制控件时要使用的字体设置,但与该属性关联的GDI字体不用于绘制。控件将不关心分配给其Font属性的Font是在分配之后,还是在分配之前处置的。该控件显然能够使用Font对象的一些隐藏方面,即使在Disposed之后也可以使用它来确定字体的相应属性,但我不知道是否

  1. 使用提供的Font对象(如果未处理),或者每次必须绘制内容时创建自己的临时字体对象,然后立即处置临时对象。
  2. 使用提供的Font对象,如果没有处理,或者创建自己的私有字体对象,当重新分配Font属性或处理控件时,它将被处置。
  3. 在分配Font属性时从Font对象复制字体系列,大小等,并使用它自己创建的私有临时或持久Font对象执行所有操作。
  4. 每当需要绘制内容时,从指定的Font对象复制字体系列,大小等。

如果除了将其提供给Font属性getter之外没有其他原因,控件肯定会保留对传入字体对象的引用。但是,我不知道在分配字体后是否更好地处理字体,或者最好是在表格中保留字体的副本并在处理表格本身时将其丢弃。