2012-02-29 5 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

+0

그레이트 스포트! 결정된. – Pateman

+1

HFONT는 창 중심적으로 들립니다. 적어도 창문이 아닌 다른 어떤 플랫폼에서도 Firemonkey가 작동하는 것은 의심 스럽습니다. –