FontFamily 和Font 的区别

GDI+字体系列与字形详解
本文详细介绍了GDI+中字体系列的概念及其组成部分,包括如何通过字形、字号和单位创建字体对象,并提供了具体的示例代码。

GDI+ 将字样相同但字形不同的字体分组为字体系列。例如,下面是同一个字样(Arial),不同的字形 :

-------------------------------------------------------- 

Arial Regular 常规

Arial Bold 粗体

Arial Italic 斜体

Arial Bold Italic 粗斜体

-------------------------------------------------

GDI+ 使用四种字形形成字体系列:常规、粗体、倾斜和粗斜体。像 narrow 和 rounded 之类的形容词不被视为字形;而是作为字体系列名的一部分。如下,Arial,Arial Black,Arial Narrow 是三个不同的字样:

--------------------------------------------------------

Arial 

Arial Black

Arial Narrow


------------------------------------------------- 

在GDI+中,字样+字形+字号+单位构成了“字体”,在使用 GDI+ 绘制文本之前,您需要构造一个 FontFamily 对象(指定字样)和一个 Font (“字体”)对象。FontFamily 对象指定字样(例如 Arial,宋体,),而 Font 对象指定字号、字形和单位。

示例
长春电脑维修下面的示例构造一个字号为 48,以像素为单位、字形为“粗斜体”、字样为“宋体”的字体。在下面的代码中,传递给 Font 构造函数的第一个参数是 FontFamily 对象。第二个参数指定字体的大小,第三个参数确定字形,其单位由第四个参数确定(可以指定以像素,点...为单位)。

Pixel 为 GraphicsUnit 枚举的一个成员,Regular 是 FontStyle 枚举的一个成员。



 
  1. uses
  2. GDIPAPI,GDIPOBJ;
  3. procedure TForm1.FormPaint(Sender: TObject);
  4. var
  5. g:TGPGraphics;
  6. font:TGPFont;
  7. fontfamily:TGPFontFamily;
  8. sb:TGPSolidBrush;
  9. begin
  10. g:=TGPGraphics.Create(Canvas.Handle);
  11. fontfamily:=TGPFontFamily.Create('宋体'); //建立“字样”对象
  12. font:=TGPFont.Create(fontfamily,16,FontStyleBoldItalic,UnitPixel); //建立“字体”对象
  13. sb:=TGPSolidBrush.Create(aclRed);
  14. g.DrawString('小侃',-1,font,MakePoint(20.0,10.0),sb);
  15. sb.free;
  16. font.free;
  17. fontfamily.free;
  18. g.free;
  19. end;


<think> 我们有两个概念需要区分:FontFamily Font。根据引用[1],我们可以这样理解: 在GDI+中,字体系统由两部分构成: 1. **FontFamily(字体系列)**:定义字体的**家族名称**,如"Arial"、"宋体"等。它代表一组具有相似设计的字体。 2. **Font(字体)**:基于特定FontFamily,并包含**具体样式属性**(如字号、字形、单位)的完整字体定义。 ### 核心区别对比表 | 特性 | FontFamily | Font | |--------------------|---------------------------------------|---------------------------------------| | **定义对象** | 字体家族名称(如"Arial") | 具体字体实例 | | **包含属性** | 字体家族名称 | 字号、字形、单位等 | | **依赖关系** | 独立存在 | 必须基于FontFamily创建 | | **用途** | 标识字体家族 | 实际用于绘制文本 | ### 深入解析 #### 1. FontFamily:字体家族容器 - 一个FontFamily对应**一组设计风格相近的字体变体** - 主要作用:**提供字体分类基础**(引用[1]) - 示例创建: ```csharp FontFamily arialFamily = new FontFamily("Arial"); ``` #### 2. Font:具体字体实例 - 封装**完整的字体描述**,包括: - 关联的FontFamily - 字号(如12pt) - 字形(加粗/斜体等,见引用[2]) - 单位(像素/点等) - 示例创建: ```csharp Font boldArial = new Font(arialFamily, 12, FontStyle.Bold, GraphicsUnit.Point); ``` ### 关键关系图示 ```mermaid graph TD A[FontFamily] -->|提供基础| B(Font对象) B --> C[字号] B --> D[字形] B --> E[单位] ``` ### 应用场景差异 - **FontFamily使用场景**: - 检查系统是否安装某字体:`FontFamily.Families.Contains()` - 获取字体度量信息(如行高) - **Font使用场景**: - 控件字体设置:`label.Font = new Font(...)` - GDI+文本绘制:`graphics.DrawString(..., font, ...)` ### 在WPF中的特殊说明 引用[3]展示了WPF中字体应用的特殊性: - 直接通过`FontFamily`属性引用字体文件: ```xaml <Label FontFamily="pack://application:,,,/Fonts/#Font Awesome 6 Free"/> ``` - 此时**无需创建Font对象**,因为WPF字体系统更抽象 --- ### 总结本质区别 - `FontFamily` ≈ **"字体姓氏"**(定义家族归属) - `Font` ≈ **"身份证"**(唯一确定一个字体实例的所有属性) --- §§ 相关问题 §§ 1. 如何在C# GDI+中动态创建斜体字体? 2. WPF与WinForms处理字体有哪些核心差异? 3. 如何检测系统中是否安装了特定字体? 4. 为什么修改Font对象属性后需要调用Dispose()? 5. 如何在.NET中实现图标字体(如FontAwesome)的嵌入使用? [^1]: GDI+字体构成原理 [^2]: 字体样式枚举定义 [^3]: WPF中图标字体应用实例 </think> 在C#中,`FontFamily``Font`是处理字体的两个核心类型,它们的主要区别如下: ### 1. **概念层级与职责差异** - **FontFamily(字体系列)** 表示**字体家族名称**,如"Arial"、"宋体"等,定义字体的**基本视觉风格**。 ```csharp FontFamily arialFamily = new FontFamily("Arial"); // 只指定字体家族 ``` 核心特性: - 仅包含**字体名称**(如"Times New Roman") - **不包含**字体大小、样式等具体属性[^1] - **Font(字体对象)** 表示**完整的字体定义**,包含: ```csharp Font boldArial = new Font("Arial", 12, FontStyle.Bold); // 包含家族+大小+样式 ``` 核心特性: - 必须基于`FontFamily`创建 - 包含**字号**(如12pt) - 包含**字形**(如粗体、斜体)[^2] - 包含**单位**(像素/点等) ### 2. **依赖关系** ```mermaid graph TD A[FontFamily] -->|提供基础| B(Font) B --> C[具体尺寸] B --> D[具体样式] B --> E[绘制单位] ``` - 创建`Font`必须指定`FontFamily`(直接或间接) - `FontFamily`可独立存在(仅标识字体家族) ### 3. **实际应用场景** **FontFamily 适用场景**: - 检查系统字体支持:`FontFamily.Families` - 获取字体基本信息(如行高) - WPF中引用图标字体(如FontAwesome)[^3] ```xaml <Label FontFamily="pack://application:,,,/Fonts/#Font Awesome 6"/> ``` **Font 适用场景**: - 控件字体设置: ```csharp label1.Font = new Font("宋体", 10, FontStyle.Underline); ``` - GDI+图形绘制: ```csharp graphics.DrawString("文本", new Font("Arial", 12), Brushes.Black, point); ``` ### 4. **内存管理差异** - `FontFamily`通常**无需手动释放** - `Font`对象必须**显式调用Dispose()**(因封装非托管资源) ```csharp using(Font tempFont = new Font(...)) { // 使用字体... } // 自动释放资源 ``` ### 关键总结表 | 特性 | FontFamily | Font | |---------------------|--------------------------|--------------------------| | **表示内容** | 字体家族名称 | 完整字体定义 | | **包含属性** | 名称 | 家族+大小+样式+单位 | | **创建依赖** | 独立存在 | 必须基于FontFamily | | **资源释放** | 无需特殊处理 | 需Dispose() | | **典型用途** | 字体枚举、WPF图标字体 | 控件设置、图形绘制 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值