Windows窗体字体问题第2部分

时间:2011-03-01 00:28:25

标签: winforms fonts dispose

继续上一个问题(link

如果我想将新用户控件的字体分配给其创建者的字体,该怎么办?我应该这样做a):

newControl = new MyControl(...);
...    
newControl.Font = this.Font;

或b)?

newControl = new MyControl(...);
...
newControl.Font = (Font)this.Font.Clone();

如果答案是a),如果创建者的字体被处理掉(例如,用户关闭的窗口),新用户控件的字体会发生什么?

谢谢,

吉尔伯特

2 个答案:

答案 0 :(得分:0)

如果你试图对你的应用程序强制执行一个恒定的外观/感觉...比如所有表格中使用字体X,大小Y,颜色Z的所有标签,我会从标签中定义我自己的类,并声明这些元素具有只读GETTER调用而没有SETTER。这将防止设计者甚至序列化这些信息。因此,您在根类中更改了字体信息ONCE,并且您使用标签的所有位置都将强制使用该字体。您可能必须根据更改调整路线,但所有视觉方面都将保留。另外,我也用文本框,组合框,多行文本框,按钮,复选框完成了这项工作。效果很好。因此,当我以只读方式启动给定元素时,应用程序的构建会产生一系列关于只读属性的错误。因此,我会快速扫描并删除设计器的序列化元素并进行清理。奇迹般有效。如果这是你想要做的,我可以提供更多关于我如何实现它的示例代码。

答案 1 :(得分:0)

Font类实际上封装了两件事:

  • 文字样式

  • 可用于绘制具有该样式的文本的GDI句柄

Font类封装的文本样式是不可变的;句柄是“一次性不可变的”,这意味着它永远不会封装除了创建它之外的任何GDI句柄,但是一旦处置Font它就会停止封装任何字体句柄(它变得真正不可变) ,虽然没用,但在那一点上。)

设置框架中控件的Font属性将导致它抓住两件事:

  • 用于设置属性的Font对象的标识,Font属性getter仅使用

  • 文本样式,控件将用于创建自己的私有Font对象。

因为每个Framework控件都会固有地克隆用于设置其Font属性的任何Font实例,所以在使用它来设置另一个控件{{1}之前,通常不需要用户代码来克隆字体。 } property。