2012-02-29 48 views

回答

2

不知道它是否适用于FireMonkey,但是当我想将自定义字体加载到我的标准Delphi应用程序时,此代码适用于我。

unit UExternalFonts; 

interface 

uses 
    Windows, SysUtils, Messages, Classes, Generics.Collections; 

type 
    { .: TExternalFonts :. } 
    TExternalFonts = class sealed(TList<HFONT>); 

var 
    ExternalFonts: TExternalFonts; 

function AddExternalFont(const AFileName: String): HFONT; overload; 
function AddExternalFont(const AStream: TStream): HFONT; overload; 

implementation 

{ .: DoCleanup :. } 
procedure DoCleanup(); 
var 
    I: Integer; 
begin 
    for I := ExternalFonts.Count -1 downto 0 do 
    begin 
    RemoveFontMemResourceEx(ExternalFonts[I]); 
    ExternalFonts.Delete(I); 
    //SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); 
    end; 
end; 

{ .: AddExternalFont :. } 
function AddExternalFont(const AFileName: String): HFONT; overload; 
var 
    FS: TFileStream; 
begin 
    Result := 0; 

    if not FileExists(AFileName) then 
    exit; 

    FS := TFileStream.Create(AFileName, fmOpenRead + fmShareExclusive); 
    try 
    Result := AddExternalFont(FS); 
    finally 
    FS.Free(); 
    end; 
end; 

{ .: AddExternalFont :. } 
function AddExternalFont(const AStream: TStream): HFONT; overload; 
var 
    MS: TMemoryStream; 
    Temp: DWORD; 
begin 
    Result := 0; 

    if not Assigned(AStream) then 
    exit; 

    Temp := 1; 
    MS := TMemoryStream.Create(); 
    try 
    MS.CopyFrom(AStream, 0); 

    Result := AddFontMemResourceEx(MS.Memory, MS.Size, nil, @Temp); 
    if (Result <> 0) then 
     ExternalFonts.Add(Result); 
    //SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); 
    finally 
    MS.Free(); 
    end; 
end; 

initialization 
    ExternalFonts := TExternalFonts.Create(); 

finalization 
    DoCleanup(); 
    ExternalFonts.Free(); 

end. 
+0

DoCleanup()的工作原理?我的意思是,在循环的后半部分,您将开始删除不存在的索引。 – arthurprs 2012-03-04 19:57:51

+0

很棒的地方!固定。 – Pateman 2012-03-04 20:08:31

+1

HFONT听起来非常以Windows为中心。我怀疑这对Firemonkey是否有效,至少在Windows以外的任何平台上都是如此。 – 2012-03-05 13:04:00