Inno Setup WizardImageFile looks bad with font scaling on Windows 7

前端 未结 1 1769
深忆病人
深忆病人 2020-12-03 13:23

Bitmap for Inno Setup WizardImageFile (and WizardSmallImageFile) looks terrible because when Windows 7 has the large system fonts enabled, the Wiza

相关标签:
1条回答
  • 2020-12-03 13:38

    These are bitmap images, they naturally scale badly. You are just lucky that your own images do not look that bad when scaled.

    You have to prepare your own set of images for common scaling factors.

    Common scaling factors used nowadays are 100%, 125%, 150% and 200%. So you should have four sizes for the images, like:

    WizardImage 100.bmp
    WizardImage 125.bmp
    WizardImage 150.bmp
    WizardImage 200.bmp
    WizardSmallImage 100.bmp
    WizardSmallImage 125.bmp
    WizardSmallImage 150.bmp
    WizardSmallImage 200.bmp
    

    Inno Setup can automatically select the best version of the image since 5.6. Just list your versions of the images in the WizardImageFile and WizardSmallImageFile. You can use wildcards:

    [Setup]
    WizardImageFile=WizardImage *.bmp
    WizardImageFile=WizardSmallImage *.bmp
    

    On older versions of Inno Setup (or if your need to customize the selection algorithm or when you have additional custom images in the wizard), you would have to select the images programatically.

    The following example does more or less the same what Inno Setup 5.6:

    [Setup]
    ; Use 100% images by default
    WizardImageFile=WizardImage 100.bmp
    WizardSmallImageFile=WizardSmallImage 100.bmp
    
    [Files]
    ; Embed all other sizes to the installer
    Source: "WizardImage *.bmp"; Excludes: "* 100.bmp"; Flags: dontcopy
    Source: "WizardSmallImage *.bmp"; Excludes: "* 100.bmp"; Flags: dontcopy
    
    [Code]
    
    function GetScalingFactor: Integer;
    begin
      if WizardForm.Font.PixelsPerInch >= 192 then Result := 200
        else
      if WizardForm.Font.PixelsPerInch >= 144 then Result := 150
        else
      if WizardForm.Font.PixelsPerInch >= 120 then Result := 125
        else Result := 100;
    end;
    
    procedure LoadEmbededScaledBitmap(Image: TBitmapImage; NameBase: string);
    var
      Name: String;
      FileName: String;
    begin
      Name := Format('%s %d.bmp', [NameBase, GetScalingFactor]);
      ExtractTemporaryFile(Name);
      FileName := ExpandConstant('{tmp}\' + Name);
      Image.Bitmap.LoadFromFile(FileName);
      DeleteFile(FileName);
    end;
    
    procedure InitializeWizard;
    begin
      { If using larger scaling, load the correct size of images }
      if GetScalingFactor > 100 then 
      begin
        LoadEmbededScaledBitmap(WizardForm.WizardBitmapImage, 'WizardImage');
        LoadEmbededScaledBitmap(WizardForm.WizardBitmapImage2, 'WizardImage');
        LoadEmbededScaledBitmap(WizardForm.WizardSmallBitmapImage, 'WizardSmallImage');
      end;
    end;
    

    You might want to do the same for the SelectDirBitmapImage, the SelectGroupBitmapImage and the PreparingErrorBitmapImage.


    See also:

    • How to detect and "fix" DPI settings with Inno Setup?
    • Inno Setup Placing image/control on custom page
    0 讨论(0)
提交回复
热议问题