문제
내 프로그램에서 일부 글꼴을 임시로 로드해야 합니다.dll 리소스 파일을 사용하는 것이 좋습니다.
해결책
그리고 여기 델파이 버전이 있습니다:
procedure LoadFontFromDll(const DllName, FontName: PWideChar);
var
DllHandle: HMODULE;
ResHandle: HRSRC;
ResSize, NbFontAdded: Cardinal;
ResAddr: HGLOBAL;
begin
DllHandle := LoadLibrary(DllName);
if DllHandle = 0 then
RaiseLastOSError;
ResHandle := FindResource(DllHandle, FontName, RT_FONT);
if ResHandle = 0 then
RaiseLastOSError;
ResAddr := LoadResource(DllHandle, ResHandle);
if ResAddr = 0 then
RaiseLastOSError;
ResSize := SizeOfResource(DllHandle, ResHandle);
if ResSize = 0 then
RaiseLastOSError;
if 0 = AddFontMemResourceEx(Pointer(ResAddr), ResSize, nil, @NbFontAdded) then
RaiseLastOSError;
end;
다음과 같이 사용됩니다:
var
FontName: PChar;
FontHandle: THandle;
...
FontName := 'DEJAVUSANS';
LoadFontFromDll('Project1.dll' , FontName);
FontHandle := CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH,
FontName);
if FontHandle = 0 then
RaiseLastOSError;
다른 팁
나는 찾았다 이것 구글과 함께.아래에 관련 코드를 잘라내어 붙여넣었습니다.
리소스 파일에 글꼴을 추가해야 합니다.
34 FONT "myfont.ttf"
다음 C 코드는 DLL 리소스에서 글꼴을 로드하고 사용이 끝나면 메모리에서 해제합니다.
DWORD Count; HMODULE Module = LoadLibrary("mylib.dll"); HRSRC Resource = FindResource(Module,MAKEINTRESOURCE(34),RT_FONT); DWORD Length = SizeofResource(Module,Resource); HGLOBAL Address = LoadResource(Module,Resource); HANDLE Handle = AddFontMemResourceEx(Address,Length,0,&Count); /* Use the font here... */ RemoveFontMemResourceEx(Handle); FreeLibrary(Module);
다음은 실행 파일 내부에서 글꼴을 로드/사용 가능하게 만드는 일부 코드입니다(즉, 글꼴은 일반적으로 Windows에 설치해야 하는 것이 아니라 리소스로 포함되었습니다).
참고로 글꼴은 다음에서 사용할 수 있습니다. 어느 귀하의 프로그램이 이를 제거할 때까지 적용하십시오.이것이 얼마나 유용할지는 모르겠지만 저는 몇 번 사용해 보았습니다.나는 글꼴을 dll에 넣은 적이 없지만(나는 이 'exe에 포함' 접근 방식을 선호합니다) 그것이 상황을 너무 많이 바꿀 것이라고는 상상하지 않습니다.
procedure TForm1.FormCreate(Sender: TObject); var ResStream : TResourceStream; sFileName : string; begin sFileName:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF'; ResStream:=nil; try ResStream:=TResourceStream.Create(hInstance, 'Swisfont', RT_RCDATA); try ResStream.SaveToFile(sFileName); except on E:EFCreateError Do ShowMessage(E.Message); end; finally ResStream.Free; end; AddFontResource(PChar(sFileName)); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); end; procedure TForm1.FormDestroy(Sender: TObject); var sFile:string; begin sFile:=ExtractFilePath(Application.ExeName)+'SWISFONT.TTF'; if FileExists(sFile) then begin RemoveFontResource(PChar(sFile)); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); DeleteFile(sFile); end; end;
제휴하지 않습니다 StackOverflow