Question

I want to install some fonts before setup start, is it possible?

Was it helpful?

Solution

How to use external font for the wizard without its installation ?

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;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top