`
sogotobj
  • 浏览: 647475 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

GDI+有个FontCollection类,一般情况下很少用到,很多人甚至连这些类是干什么的都不知道。FontCollection本身是个基类,它有两个派生类InstalledFontCollection和PrivateFontCollection,这两个类用好了,可以起到意想不到的作用。

InstalledFontCollection用来枚举当前系统已经安装的字体。有人经常问,为什么有些字体系统中已经存在,但使用FontFamily或Font类建立对象时往往失败,如MS Sans Serif、MS Serif等字体。这是因为GDI+只能使用矢量字体,使用InstalledFontCollection枚举一下,便知道哪些字体被GDI+支持。

PrivateFontCollection是用来建立你自己专用的字体集,我觉得这个类很方便,也很实用。有时候,程序中需要使用某些特殊字体,但往往考虑用户系统有可能没安装这些字体,便改变了方案,或者在用户使用说明书中要求用户安装某种字体,否则将达不到某种效果,甚至程序不能正常运行等。那么,这时候使用PrivateFontCollection,是你最好的选择方案之一。程序发布时,将字体文件打包进去,在需要用到这些字体时,程序自动安装字体到你的专用字体集(不会影响操作系统),供你使用。

下面的Delphi例子程序演示了InstalledFontCollection和PrivateFontCollection的使用,再次提醒,例子中使用的Gdiplus单元是本人自己改写的,与网上流通的不完全兼容,需要稍作改动才行(不能使用Wndows字体系统目录做测试,在对话框点击该目录字体,只是重新安装,不能打开。可以将字符文件拷贝到其它目录)。

unitFCMain;

interface

uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ExtCtrls,Gdiplus;

type
TMainForm
=class(TForm)
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
PaintBox1:TPaintBox;
ListBox1:TListBox;
ListBox2:TListBox;
Button1:TButton;
Button2:TButton;
OpenDialog1:TOpenDialog;
procedureFormCreate(Sender:TObject);
procedureFormDestroy(Sender:TObject);
procedureListBox1Click(Sender:TObject);
procedureButton1Click(Sender:TObject);
procedureButton2Click(Sender:TObject);
procedurePaintBox1Paint(Sender:TObject);
private
...{Privatedeclarations}
SFontCollect,FontCollect:TGpFontCollection;
PFontCollect:TGpPrivateFontCollection;
FontFamily:TGpFontFamily;
public
...{Publicdeclarations}
end;

var
MainForm:TMainForm;

implementation

usesGdipTypes;

...{$R*.dfm}
//枚举字体集FontCollect的所有字体名到List中
functionEnumFontFamily(List:TStrings;FontCollect:TGpFontCollection):Integer;
var
Familys:arrayofTGpFontFamily;
i:Integer;
begin
Result:
=FontCollect.GetFamilyCount;
ifResult=0thenExit;
SetLength(Familys,Result);
List.Clear;
fori:=0toResult-1do
Familys[i]:
=TGpFontFamily.Create;
FontCollect.GetFamilies(Familys);
fori:=0toResult-1do
begin
List.Add(Familys[i].GetFamilyName);
Familys[i].Free;
end;
end;
//通过打开文件对话框装入字体文件到专用字体集PFontCollect
procedureTMainForm.Button1Click(Sender:TObject);
var
i:Integer;
begin
ifnotOpenDialog1.ExecutethenExit;
try
fori:=0toOpenDialog1.Files.Count-1do
PFontCollect.AddFontFile(OpenDialog1.Files[i]);
EnumFontFamily(ListBox2.Items,PFontCollect);
except
onE:EGdiplusException
doShowMessage(e.GdipErrorString);
end;
end;

procedureTMainForm.Button2Click(Sender:TObject);
begin
Close;
end;

procedureTMainForm.FormCreate(Sender:TObject);
begin
SFontCollect:
=TGpInstalledFontCollection.Create;
ifEnumFontFamily(ListBox1.Items,SFontCollect)>0then
begin
ListBox1.ItemIndex:
=0;
ListBox1Click(ListBox1);
end;
PFontCollect:
=TGpPrivateFontCollection.Create;
end;

procedureTMainForm.FormDestroy(Sender:TObject);
begin
ifAssigned(FontFamily)then
FontFamily.Free;
PFontCollect.Free;
SFontCollect.Free;
end;
//选择系统或者专用字体集的字体名称,建立一个FontFamily供PaintBox1使用
procedureTMainForm.ListBox1Click(Sender:TObject);
begin
ifSender=ListBox1thenFontCollect:=SFontCollect
elseFontCollect:=PFontCollect;
ifAssigned(FontFamily)thenFontFamily.Free;
withSender
asTListBoxdo
FontFamily:
=TGpFontFamily.Create(Items[ItemIndex],FontCollect);
PaintBox1.Invalidate;
end;
//在PaintBox1显示字体来源及对各种风格的支持
procedureTMainForm.PaintBox1Paint(Sender:TObject);
const
StyleStr:array[
0..4]ofstring=
(
'Regular','Bold','Italic','Underline','StrikeOut');
var
I:Integer;
style:TFontStyles;
g:TGpGraphics;
font:TGpFont;
FontName,s:
string;
begin
ifnotAssigned(FontFamily)thenExit;
style:
=[];
g:
=TGpGraphics.Create(PaintBox1.Canvas.Handle);
try
forI:=0to4do
begin
ifnotFontFamily.IsStyleAvailable(style)then
Continue;
FontName:
=FontFamily.GetFamilyName;
font:
=TGpFont.Create(FontName,18,style,utPixel,FontCollect);
try
ifI=0then
begin
ifFontCollect=SFontCollectthen
s:
=FontName+''+'系统字体集'
else
s:
=FontName+''+'专用字体集';
g.DrawString(s,font,Brushs.Red,
0,10);
end;
g.DrawString(FontName
+''+StyleStr[I],font,Brushs.Blue,0,25*I+40);
style:
=[TFontStyle(I)];
finally
font.Free;
end;
end;
finally
g.Free;
end;
end;

end.

下面的运行结果表明安装了2种字体到专用字体集,并选择显示了1种字体效果:

如有错误请指正:maozefa@hotmail.com

分享到:
评论

相关推荐

    GDI+入门指导书------经典

    GDI+入门指导书------经典 非常适合于GDI+初学者

    GDI++ for DELPHI

    GDI++ for DELPHI是一个专为DELPHI开发者设计的图形设备接口(GDI)扩展库,它提供了丰富的图形绘制功能,使开发者能够利用更高级的图形处理技术来增强应用程序的界面美观度和交互性。GDI++是基于Windows API的GDI...

    GDI+_for_VCL基础

    GDI+ for VCL基础是关于在Delphi和C++Builder中使用GDI+图形库进行图形绘制和图像处理的专题。GDI+是微软在Windows XP系统中引入的一个增强图形设备接口,它扩展了传统的GDI(Graphics Device Interface),提供了更...

    GDI+图像程序设计(PDF & 源码 -电子工业出版社)

    ——在GDI+ Painter应用程序中添加颜色、钢笔和画笔 总结 第5章 颜色、字体和文本 5.1 访问Graphics对象 5.2 使用颜色 5.3 使用字体 5.4 使用文本和字符串 5.5 渲染文本的质量和性能 5.6 高级版式 5.7 一个...

    Delphi使用GDI+制作任意图片形状窗口

    为了实现上述功能,我们需要在Delphi中创建一个新的VCL Forms应用程序,然后导入GDI+的相关单元。在窗体的`OnCreate`事件中初始化GDI+,在`OnPaint`事件中绘制图片和处理透明度,在`OnNCCalcSize`事件中计算并设置...

    GDI+图形程序设计.zip

    GDI+提供了丰富的绘图功能,包括二维几何图形、曲线、文本、图像以及颜色管理等,使得开发者能够创建出具有高质量视觉效果的应用程序。 这本书《GDI+程序设计》显然是一个深入探讨GDI+技术的教程,它可能包含了GDI+...

    在Delphi XE10.2版本可用的GDI+库

    在Delphi XE10.2版本中,开发者可以利用GDI+库来增强图形处理功能,提升应用程序的视觉效果。GDI+是Microsoft提供的一个图形设备接口,它基于GDI(Graphics Device Interface),但提供了更多的图形绘制和图像处理...

    GDI+程序设计 GDI+程序设计 GDI+程序设计 GDI+程序设计

    GDI+(Graphics Device Interface Plus)是微软Windows操作系统中用于图形设备接口的增强版本,它为开发者提供了一套丰富的绘图工具,使得在Windows应用程序中创建、管理和显示图形变得更加便捷和高效。GDI+不仅继承...

    delphi gdi+遮罩动画字

    在本文中,我们将深入探讨如何在Delphi编程环境中利用GDI+库来创建遮罩动画文字效果。Delphi是一款强大的Windows应用程序...通过不断的实践和学习,可以更好地掌握GDI+在Delphi中的应用,为应用程序增添更多视觉魅力。

    Delphi GDI+

    Delphi GDI+是Delphi开发者用于构建高质量图形用户界面的强大工具集,它通过提供矢量图形、位图处理、文字渲染、颜色管理和图形变换等功能,极大地扩展了原生GDI的功能,帮助开发者创建出更为美观且功能丰富的应用...

    gdi++实现图像压缩-图像裁剪和缩放-图像格式转换-图像dpi修改.rar

    在Windows平台上,C++开发图形应用时,GDI++(也称为GDI+)是一个强大的图形库,它提供了丰富的功能,包括图像处理、绘制、文本渲染等。本压缩包文件包含的是利用GDI++实现的一些关键图像操作,如图像压缩、图像裁剪...

    GDI+程序设计(清华大学)

    书中不仅介绍了GDI+的基础知识,还着重讲解了如何将GDI+技术应用于实际开发中,尤其适合那些希望在应用程序中实现高级图形处理和自定义控件开发的中高级程序员。 另外,书中提到了.NET Framework对编程的变革作用,...

    GDI+图形程序设计

    通过阅读本书,读者不仅可以掌握GDI+的基本概念,还能学会如何在实际项目中应用这些技术,提升Windows应用程序的图形表现力。 《GDI+图形程序设计》的PDF文件包含了详细的章节结构,可能包括以下内容:GDI+概述、...

    WINDOWS GDI和GDI+编程实例剖析. - READ.doc

    示例程序中,通过MFC应用程序展示了GDI和GDI+的使用。GDI菜单下的“画线”功能演示了使用GDI进行线条绘制。GDI+菜单则包含了更多的功能,如“画线”使用GDI+绘制线条,“渐变画刷”展示了GDI+的色彩渐变效果,“基数...

    GDI+开发包 GDI+ SDK

    GDI+(Graphics Device Interface Plus)是微软推出的一种图形设备接口的增强版本,它为Windows应用程序提供了丰富的2D图形、图像处理和文本渲染能力。GDI+开发包,即GDI+ SDK,是用于帮助开发者利用GDI+功能进行...

    ( Delphi 7 )使用GDI+进行图形缩放、拖动,多种图片格式支持,仅简单示例

    使用GDI+进行图形缩放、拖动,多种图片格式支持,仅简单示例。 问题源贴:http://bbs.csdn.net/topics/390638094

    GDI+程序设计 (中文版pdf)

    第四部分讲述了GDI+功能在Web应用程序中的使用,如在Internet上提供GDI+图像、创建***服务器控件和使用GDI+创建Web服务等。这部分内容是将GDI+编程技能拓展到Web开发领域的关键指导。 书中还提供了一些示例代码,...

    GDI+开发包 GDI+安装详解

    其中,ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。 (2)在应用类中添加...

    GDI+程序设计_GDI+程序设计_

    通过GDI+,你可以创建自定义的控件,实现复杂的用户界面,或者在应用程序中添加图形输出功能。 1. **Graphics类**:这是GDI+的核心类,用于实际的绘图操作。你可以从Graphics对象上绘制线条、曲线、矩形、椭圆、...

    delphi gdi+ 必要的 pas 文件

    通过 Delphi GDI+ 的 PAS 文件,你可以实现高质量的图形用户界面,创建出具有专业视觉效果的应用程序。但需要注意的是,虽然这些非官方的 PAS 文件解决了兼容性问题,但可能没有得到官方的支持,所以在使用过程中...

Global site tag (gtag.js) - Google Analytics