在.Net中创建和使用自已的私有字体

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 

派生自抽象类FontCollection的PrivateFontCollection可以帮你维护一个为你的应用程序定制的字体集。叫做私有字体集。一个私有字体集可以既包括已经安装到操作系统中的字体,也可以包括未安装的字体。

 

要添加一个私有字体到私有字体集,只需调用PrivateFontCollection的AddFontFile方法。

 

PrivateFontCollection对象的Families属性是一个FontFamily类型的数组,包含所有已经成功添加进去的字体。通过访问该属性可以得到一个FontFamily数组。如:

FontFamily[] fontFamilies = privateFontCollection.Families;

 

通过访问PrivateFontCollection的Length属性可以得到PrivateFontCollection中的FontFamily个数。需要注意的是,Length属性的值可能会小于你成功调用AddFontFile的次数。因为PrivateFontCollection会分析你添加的每一个文件,如果一个文件描述的字体与PrivateFontCollection中已经存在的某个字体属于同一个FontFamily,则不作为新字体添加。如:假如你添加ArialBd.ttf, Times.ttf和TimesDb.ttf到一个PrivateFontCollection,而Times.ttf和TimesDb.ttf属于同一个FontFamily,那么虽然你添加了三个文件, Length的值却为2。

  • 示例:

本例添加下列三个字体文件到一个PrivateFontCollection对象中:

· C:/systemroot/Fonts/Arial.ttf (Arial, regular)

· C:/systemroot/Fonts/CourBI.ttf (Courier New, bold italic)

· C:/systemroot/Fonts/TimesBd.ttf (Times New Roman, bold)

代码首先通过访问PrivateFontCollection对象的Families属性获得FontFamily数组。

然后,对于每一个FontFamily,代码通过将相应的FontStyle枚举值作为参数调用FontFamily的IsStyleAvailable方法来判断一个字体风格(regular、bold、italic、bold italic、underline和strikeout)是否支持。

接下来,如果给定的字体风格可用,代码就将该FontFamily对象的Name属性值(即字体名,注意不是FontFamily对象本身)作为第一个参数传给Font类构造函数创建一个该风格的字体。

当一个字体被创建成功后,它被传给Graphics对象的DrawString方法,从而写一个字符串到窗体上。

代码执行完毕后,窗体样子看起来象下图:

clip_image002

Arial.ttf字体文件仅描述了Arial的regular风格。必须注意的是,上图窗体中用Arial字体写出了几种不同的风格,不仅仅是regular。这是因为GDI+可以从regular模拟出bold、italic和bold italic风格。GDI+还能够从regular风格制造出下划线和删除线风格。相似地,GDI+也可以从bold或italic风格模拟出bold italic风格。所以,虽然TimesDb.ttf只描述了Times New Roman字体的bold风格,示例中还是写出了bold italic风格的字符串。

  • n 源码:

C#源码:

protected override void OnPaint(PaintEventArgs e)

{

PointF pointF = new PointF(10, 0);

SolidBrush solidBrush = new SolidBrush(Color.Black);

int count = 0;

string familyName = "";

string familyNameAndStyle;

FontFamily[] fontFamilies;

PrivateFontCollection privateFontCollection = new PrivateFontCollection();

 

// Add three font files to the private collection.

privateFontCollection.AddFontFile("C://systemroot//Fonts//Arial.ttf");

privateFontCollection.AddFontFile("C://systemroot//Fonts//CourBI.ttf");

privateFontCollection.AddFontFile("C://systemroot//Fonts//TimesBD.ttf");

 

// Get the array of FontFamily objects.

fontFamilies = privateFontCollection.Families;

 

// How many objects in the fontFamilies array?

count = fontFamilies.Length;

 

// Display the name of each font family in the private collection

// along with the available styles for that font family.

for (int j = 0; j < count; ++j)

{

// Get the font family name.

familyName = fontFamilies[j].Name;

 

// Is the regular style available?

if (fontFamilies[j].IsStyleAvailable(FontStyle.Regular))

{

familyNameAndStyle = "";

familyNameAndStyle = familyNameAndStyle + familyName;

familyNameAndStyle = familyNameAndStyle + " Regular";

Font regFont = new Font(familyName, 16, FontStyle.Regular, GraphicsUnit.Pixel);

 

e.Graphics.DrawString(familyNameAndStyle, regFont, solidBrush, pointF);

 

pointF.Y += regFont.Height;

}

 

// Is the bold style available?

if (fontFamilies[j].IsStyleAvailable(FontStyle.Bold))

{

familyNameAndStyle = "";

familyNameAndStyle = familyNameAndStyle + familyName;

familyNameAndStyle = familyNameAndStyle + " Bold";

 

Font boldFont = new Font(familyName, 16, FontStyle.Bold, GraphicsUnit.Pixel);

e.Graphics.DrawString(familyNameAndStyle, boldFont, solidBrush, pointF);

pointF.Y += boldFont.Height;

}

 

// Is the italic style available?

if (fontFamilies[j].IsStyleAvailable(FontStyle.Italic))

{

familyNameAndStyle = "";

familyNameAndStyle = familyNameAndStyle + familyName;

familyNameAndStyle = familyNameAndStyle + " Italic";

Font italicFont = new Font(familyName, 16, FontStyle.Italic, GraphicsUnit.Pixel);

 

e.Graphics.DrawString(familyNameAndStyle, italicFont, solidBrush, pointF);

pointF.Y += italicFont.Height;

}

 

// Is the bold italic style available?

if (fontFamilies[j].IsStyleAvailable(FontStyle.Italic) && fontFamilies[j].IsStyleAvailable(FontStyle.Bold))

{

familyNameAndStyle = "";

familyNameAndStyle = familyNameAndStyle + familyName;

familyNameAndStyle = familyNameAndStyle + "BoldItalic";

 

Font italicFont = new Font(familyName, 16, FontStyle.Italic | FontStyle.Bold, GraphicsUnit.Pixel);

e.Graphics.DrawString(familyNameAndStyle, italicFont, solidBrush, pointF);

pointF.Y += italicFont.Height;

}

 

// Is the underline style available?

if (fontFamilies[j].IsStyleAvailable(FontStyle.Underline))

{

familyNameAndStyle = "";

familyNameAndStyle = familyNameAndStyle + familyName;

familyNameAndStyle = familyNameAndStyle + " Underline";

 

Font underlineFont = new Font(familyName, 16, FontStyle.Underline, GraphicsUnit.Pixel);

e.Graphics.DrawString(familyNameAndStyle, underlineFont, solidBrush, pointF);

pointF.Y += underlineFont.Height;

}

 

// Is the strikeout style available?

if (fontFamilies[j].IsStyleAvailable(FontStyle.Strikeout))

{

familyNameAndStyle = "";

familyNameAndStyle = familyNameAndStyle + familyName;

familyNameAndStyle = familyNameAndStyle + " Strikeout";

 

Font strikeFont = new Font(familyName, 16, FontStyle.Strikeout, GraphicsUnit.Pixel);

e.Graphics.DrawString(familyNameAndStyle, strikeFont, solidBrush, pointF);

pointF.Y += strikeFont.Height;

}

 

// Separate the families with white space.

pointF.Y += 10;

}

 

base.OnPaint(e);

}

 

Visual Basic 源码:

Dim pointF As New PointF(10, 0)

Dim solidBrush As New SolidBrush(Color.Black)

Dim count As Integer = 0

Dim familyName As String = ""

Dim familyNameAndStyle As String

Dim fontFamilies() As FontFamily

Dim privateFontCollection As New PrivateFontCollection()

' Add three font files to the private collection.

privateFontCollection.AddFontFile("C:/systemroot/Fonts/Arial.ttf")

privateFontCollection.AddFontFile("C:/systemroot/Fonts/CourBI.ttf")

privateFontCollection.AddFontFile("C:/systemroot/Fonts/TimesBD.ttf")

' Get the array of FontFamily objects.

fontFamilies = privateFontCollection.Families

' How many objects in the fontFamilies array?

count = fontFamilies.Length

' Display the name of each font family in the private collection

' along with the available styles for that font family.

Dim j As Integer

While j < count

' Get the font family name.

familyName = fontFamilies(j).Name

' Is the regular style available?

If fontFamilies(j).IsStyleAvailable(FontStyle.Regular) Then

familyNameAndStyle = ""

familyNameAndStyle = familyNameAndStyle & familyName

familyNameAndStyle = familyNameAndStyle & " Regular"

Dim regFont As New Font( _

familyName, _

16, _

FontStyle.Regular, _

GraphicsUnit.Pixel)

e.Graphics.DrawString( _

familyNameAndStyle, _

regFont, _

solidBrush, _

pointF)

pointF.Y += regFont.Height

End If

' Is the bold style available?

If fontFamilies(j).IsStyleAvailable(FontStyle.Bold) Then

familyNameAndStyle = ""

familyNameAndStyle = familyNameAndStyle & familyName

familyNameAndStyle = familyNameAndStyle & " Bold"

Dim boldFont As New Font( _

familyName, _

16, _

FontStyle.Bold, _

GraphicsUnit.Pixel)

e.Graphics.DrawString( _

familyNameAndStyle, _

boldFont, _

solidBrush, _

pointF)

pointF.Y += boldFont.Height

End If

' Is the italic style available?

If fontFamilies(j).IsStyleAvailable(FontStyle.Italic) Then

familyNameAndStyle = ""

familyNameAndStyle = familyNameAndStyle & familyName

familyNameAndStyle = familyNameAndStyle & " Italic"

Dim italicFont As New Font( _

familyName, _

16, _

FontStyle.Italic, _

GraphicsUnit.Pixel)

e.Graphics.DrawString( _

familyNameAndStyle, _

italicFont, _

solidBrush, pointF)

pointF.Y += italicFont.Height

End If

' Is the bold italic style available?

If fontFamilies(j).IsStyleAvailable(FontStyle.Italic) And _

fontFamilies(j).IsStyleAvailable(FontStyle.Bold) Then

familyNameAndStyle = ""

familyNameAndStyle = familyNameAndStyle & familyName

familyNameAndStyle = familyNameAndStyle & "BoldItalic"

Dim italicFont As New Font( _

familyName, _

16, _

FontStyle.Italic Or FontStyle.Bold, _

GraphicsUnit.Pixel)

e.Graphics.DrawString( _

familyNameAndStyle, _

italicFont, _

solidBrush, _

pointF)

pointF.Y += italicFont.Height

End If

' Is the underline style available?

If fontFamilies(j).IsStyleAvailable(FontStyle.Underline) Then

familyNameAndStyle = ""

familyNameAndStyle = familyNameAndStyle & familyName

familyNameAndStyle = familyNameAndStyle & " Underline"

Dim underlineFont As New Font( _

familyName, _

16, _

FontStyle.Underline, _

GraphicsUnit.Pixel)

e.Graphics.DrawString( _

familyNameAndStyle, _

underlineFont, _

solidBrush, _

pointF)

pointF.Y += underlineFont.Height

End If

' Is the strikeout style available?

If fontFamilies(j).IsStyleAvailable(FontStyle.Strikeout) Then

familyNameAndStyle = ""

familyNameAndStyle = familyNameAndStyle & familyName

familyNameAndStyle = familyNameAndStyle & " Strikeout"

Dim strikeFont As New Font( _

familyName, _

16, _

FontStyle.Strikeout, _

GraphicsUnit.Pixel)

e.Graphics.DrawString( _

familyNameAndStyle, _

strikeFont, _

solidBrush, _

pointF)

pointF.Y += strikeFont.Height

End If

' Separate the families with white space.

pointF.Y += 10

End While

 

C#嵌入字体资源到项目实践总结 近期因项目需要,用C#开发了一套自定义控件,需要用到一个开源图标字体库。以前从来没有接触过,各种踩坑,总算弄好了。在此总结分享,希望可以让初次接触的童鞋少走一些弯路。 废话不说了,直接进入正题。 1. 嵌入字体文件 将字体文件拖入项目管理界面中的资源中,注意资源类型是文件类型。 2. 将资源库中的字体加载到一个公共类中,以备调用 public static class KUIManager { public static PrivateFontCollection PFCA 阅读详情

相关推荐

[C#]从外部文件引入字体文件并显示到控件

看来我对字体方面的了解还是不够多啊。 从网上找了段代码,本以为拷里头就完事呢,结果发现到加载字体文件都没问题,这些我在VB6时代都干过。 但是当我打算把该字体应用到程序时,却自动变回了系统默认字体。 这表示我没有给予正确的参数。好吧我承认我不知道那应该是什么! ……………… 好吧,从网上找来的代码永远是那么的不靠谱! 经我仔细的思索,我认为他把从文件加载的字体名称代入到建立字体对象

electricperi的专栏 3184

C# System.Drawing.Text 使用自定义字体或本地字体

使用自定义字体:        PrivateFontCollection prc = new PrivateFontCollection();        prc.AddFontFile("自定义字体路径");        Font f = new Font(prc.Families[0], 12);使用本地字体:        InstalledFontCollection fc = ne...

Ray 7861

C#将个性化字体放在资源文件内供程序调用

看下面这个类似LED效果的界面,只需把界面上的文本字体改成:Quartz MS 即可实现这个效果。 很多时候,客户的电脑并没有安装这个字体,比如XP的电脑上都没有这个字体,怎么把这个字体嵌入到资源文件,能让程序调用,在XP上也能正常显示呢? WPF的实现方法: 在 C:\Windows\Fonts\文件夹内找到 Quartz MS.TTF字体

蓝山咖啡的博客 1万+

GDI+ 在Delphi程序的应用 -- FontCollection

         GDI+有个FontCollection类,一般情况下很少用到,很多人甚至连这些类是干什么的都不知道。FontCollection本身是个基类,它有两个派生类InstalledFontCollectionPrivateFontCollection,这两个类用好了,可以起到意想不到的作用。        InstalledFontCollection用来枚举当前系统已经安装的

闲人阿发伯的业余编程心得 5082

在VB.NET中更改字体属性

Bold is "read-only" in VB.NET. This article tells you how to change that. 在VB.NET中,粗体为“只读”。 本文告诉您如何更改它。 In VB6, it was dead easy to change a font to bold. You simply coded something like Label1.F...

cumao2792的博客 2590

掌握.NET框架下的高级排版与字体管理

本文将深入探讨.NET Framework类库中System.Drawing.Text命名空间所提供的高级排版功能,重点介绍如何使用FontCollection类族来管理字体,并展示如何创建一个简单的文本编辑器来利用这些字体管理特性。

weixin_33240461的博客 914

掌握.NET字体、文本打印操作

本文将深入探讨.NET框架下字体、文本打印操作的核心概念实践应用。我们将会学习如何创建管理字体对象,如何利用.NET的命名空间来处理字体集合,并且如何使用不同的字体样式渲染技术来优化用户界面的文本显示。此外,我们还将通过一个实际的文本编辑器示例来加深对这些概念的理解。

weixin_42612405的博客 471

ESP32点阵字体.NET字体制作工具

点阵字体在 ESP32 等设备中起着重要的作用,然而,生成这些字体并不总是那么简单。幸运的是,有了像 IotByteFont 这样的工具,我们可以更容易地生成我们需要的点阵字体。通过理解点阵字体的原理,以及如何使用 IotByteFont,我希望你现在可以更好地处理你的 ESP32 项目中的字体问题。

桑榆肖物 1769

[VB.NET]空心字体

空心字体 实例说明在本实例中,我们将制作一个能够显示空心字的应用程序。程序运行结果如图91-1所示。<!--google_ad_client = "pub-8333940862668978";/* 728x90, 创建于 08-11-30 */google_ad_slot = "4485230109";google_ad_width = 728;google_ad_

VB.NET学习网-VB.NET实例、VB.NET教程、VB.NET源码下载 1317

【ASP.NET】手把手创建一个ASP.NET项目以及MVC模式的介绍

本文演示如何在 Visual Studio 工具上创建一个 ASP.NET 项目以及 MVC 模式下的项目文件的介绍。相信大家看完就会对 ASP.NET 框架有一个初步的认识。这部分介绍 ASP.NET 项目 MVC 模式下的文件信息 以上就是 ASP.NET项目的创建演示MVC模式的介绍,希望对大家有所帮助。

好学若饥,谦卑若愚。 1万+

读取私有字体信息并进行相关判断及Asp.Net 如何在Server端如何使用非系统默认安装字体

读取私有字体信息并进行相关判断   private void Font_IsStyleAvailable()        {            Graphics graphics = CreateGraphics();            graphics.Clear(Color.White);            Pen pen = new Pen(Color.Gray);

607

深入.NET字体、文本打印操作详解

本文通过《深入.NET》书籍中的Chapter 6章节,探讨了如何在.NET框架中进行字体、文本打印操作。通过具体的代码示例,介绍了如何在Windows Forms应用程序中使用RichTextBox控件、设置字体样式以及如何响应用户界面事件。同时,展示了如何在表单加载时初始化控件,以及如何创建使用字体设置对话框。本章内容对于理解掌握.NET中的文本处理用户界面设计具有重要的指导意义。

weixin_42612405的博客 437

在diagrams.net使用外部或自定义字体

如果您不想使用 diagrams.net 中默认可用的字体,您可以使用您自己的自定义字体或外部字体,例如 Google 的字体或存储在您自己的服务器上的网络字体。当您需要匹配出版物的风格指南、公司的企业形象或在信息图表中添加兴趣重点时,这非常有用。 通过提供 URL 可以轻松指定不同的系统字体使用 Google 字体,甚至使用您自己的网络字体。 如何使用不同的系统字体 系统字体是存储在您的计算机或系统上的字体。要使用不同的系统字体,您需要知道字体的名称。 单击要更改的形状或文本。 在右侧格式面板的“文

学无止境 5536

Word控件Spire.Doc 【脚注】字体(2): 在C#, VB.NET中设置Word字体

功能类库Spire 系列文档处理组件均由中国本土团队研发,不依赖第三方软件,不受其他国家的技术或法律法规限制,同时适配国产操作系统如中科方德、中标麒麟等,兼容国产文档处理软件 WPS(如 .wps/.et/.dps 等格式。Spire.Doc for .NET是一个专业的.NET Word组件,使用户可以在Word文档中设置字体。Spire.Doc是一个专业的Word组件,可用于生成、加载、编写、编辑保存.NET、SilverlightWPF的Word文档。

励志做最业余的专业博主,控件产品可以私我~ 1097

.NET框架下的字体、文本打印操作

本章深入探讨了.NET框架中字体、文本打印操作的关键类命名空间。通过详细阐述如何使用.NET提供的类来操作字体文本、处理事件以及创建自定义控件,使读者能够快速掌握这些复杂操作的高效方法。同时,本章还介绍了如何通过Visual Studio .NET环境简化编程活动,提升开发效率。

weixin_42612405的博客 352

vb.net 教程 5-3 使用未安装的字体

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 有时候会在程序内用到计算机上没有安装的字体,当然,我们必须要有字体文件。 以下是使用自定义字体文件的代码,使用前请先新建一个窗体,上面有一个按钮(button1)一个标签(label1), 同时需要在代码最顶端添加 Imports System.Drawing.Text 在Button1.Click事件中添加如下代码: Dim g As Graphics = Me.Crea...

chinaherolts2008的博客 426

深入探讨.NET中的字体与颜色处理

本章主要讲述了.NET环境下如何使用SystemPensSystemBrushes类来高效创建图形对象,以及如何利用ColorConverterColorTranslator类进行颜色转换。同时,介绍了GDI+字体的分类.NET框架中字体的处理,包括TrueType、OpenType等字体的特性。

weixin_28809949的博客 461

.NET中实现可变字体

接下来,介绍了如何实现可变字体的功能,通过使用字体对话框让用户选择字体的名称、大小样式,并根据用户的选择动态更新字体对象。在上面的示例中,我们创建了一个名为MainForm的Windows窗体应用程序,并在窗体的绘图事件(MainForm_Paint)中使用Graphics类绘制文本。然后,我们创建了一个Brush对象(使用黑色刷子)来指定文本的颜色。用户选择字体对话框中的字体后,我们将所选字体赋值给selectedFont变量,并调用Refresh方法来刷新窗体,从而触发绘图事件,更新文本的字体样式。

XsfFsharp的博客 168

使用C#.NET中的CheckedListBox控件进行项字体设置

然后,我们创建一个新的字体对象,将其属性修改为所需的字体样式(在示例中,我们将字体样式设置为粗体)。这是一个简单的示例,演示了如何在C#.NET使用CheckedListBox控件设置项的字体。在上述示例中,我们首先在窗体的构造函数中添加了一些示例项。然后,我们在更改字体的按钮的单击事件处理程序中执行实际的字体更改操作。通过运行上述示例,当用户选中一个或多个项并单击"Change Font"按钮时,选中的项将以粗体显示。方法接受两个参数,第一个参数是项的索引,第二个参数是要应用的字体

XsfFsharp的博客 312
下一篇: 移动Panel的滚动条到窗口中间
gwinner
博客等级 码龄24年 10粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值