Reputation: 33
I want to install some fonts before setup start, is it possible?
Upvotes: 3
Views: 718
Reputation: 76693
To register font for a private use to a certain process (in your case the setup), you can use the Windows API function AddFontResourceEx
called with the FR_PRIVATE
flag specified in the fl
parameter. It will allow you to use the font just for your process. In the follwoing example script is shown, how to extract a font to the temporary folder, register it for the private use of the setup process and how to load it to the wizard form controls:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Files]
Source: "MyFont.ttf"; Flags: dontcopy
[Code]
#ifdef UNICODE
#define AW "W"
#else
#define AW "A"
#endif
const
FR_PRIVATE = $10;
FR_NOT_ENUM = $20;
function AddFontResourceEx(lpszFilename: string;
fl: DWORD; pdv: Cardinal): Integer;
external 'AddFontResourceEx{#AW}@gdi32.dll stdcall';
function RemoveFontResourceEx(lpFileName: string;
fl: DWORD; pdv: Cardinal): BOOL;
external 'RemoveFontResourceEx{#AW}@gdi32.dll stdcall';
var
FontFlags: DWORD;
[Code]
procedure InitializeWizard;
var
FontName: string;
begin
// extract the font file to the temporary folder
ExtractTemporaryFile('MyFont.ttf');
// this combination specifies the reservation of this font for use
// in the setup process and that this font cannot be enumerated
FontFlags := FR_PRIVATE or FR_NOT_ENUM;
// add the font resource
if AddFontResourceEx(ExpandConstant('{tmp}\MyFont.ttf'),
FontFlags, 0) <> 0 then
begin
// note, that this is the name of the font, which doesn't have
// to match to the font file name
FontName := 'My Font Name';
// the global setting of the WizardForm.Font property causes many
// of its child controls to inherit this font; except those listed
// below; their default font has changed and they lost the ability
// to inherit the font from their parent so we must do it manually
WizardForm.Font.Name := FontName;
WizardForm.WelcomeLabel1.Font.Name := FontName;
WizardForm.PageNameLabel.Font.Name := FontName;
WizardForm.FinishedHeadingLabel.Font.Name := FontName;
end;
end;
procedure DeinitializeSetup;
begin
// remove the font resource
RemoveFontResourceEx(ExpandConstant('{tmp}\MyFont.ttf'),
FontFlags, 0);
end;
Upvotes: 3