Prechádzať zdrojové kódy

Use builtin dir and group images which look better and also dont depend on a hard-coded (and undocumented?) icon index from shell32.dll.

Martijn Laan 4 rokov pred
rodič
commit
8a56729ce6

+ 13 - 0
Components/BitmapImage.pas

@@ -41,6 +41,7 @@ type
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
+    procedure InitializeFromResource(const hInstance: HINST; const ResourceName: PChar; const AWidth, AHeight: Integer; const BkColor: TColor);
   published
     property Align;
     property Anchors;
@@ -81,6 +82,18 @@ begin
   RegisterComponents('JR', [TBitmapImage]);
 end;
 
+procedure TBitmapImage.InitializeFromResource(const hInstance: HINST; const ResourceName: PChar; const AWidth, AHeight: Integer; const BkColor: TColor);
+begin
+  { Set sizes (overrides any scaling) }
+  Width := AWidth;
+  Height := AHeight;
+
+  { Load bitmap }
+  Bitmap.Handle := LoadBitmap(hInstance, ResourceName);
+  ReplaceColor := RGB(255, 0, 255);
+  ReplaceWithColor := BkColor;
+end;
+
 constructor TBitmapImage.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);

BIN
Projects/Images.res


+ 1 - 3
Projects/NewDisk.pas

@@ -80,9 +80,7 @@ begin
   OKButton.Caption := SetupMessages[msgButtonOK];
   CancelButton.Caption := SetupMessages[msgButtonCancel];
 
-  DiskBitmapImage.Bitmap.Handle := LoadBitmap(HInstance, 'DISKIMAGE');  {don't localize};
-  DiskBitmapImage.ReplaceColor := RGB(255, 0, 255);
-  DiskBitmapImage.ReplaceWithColor := Color;
+  DiskBitmapImage.InitializeFromResource(HInstance, 'DISKIMAGE', 48, 48, Color); {don't localize}
 
   TryEnableAutoCompleteFileSystem(PathEdit.Handle);
 

+ 3 - 69
Projects/Wizard.pas

@@ -731,71 +731,6 @@ constructor TWizardForm.Create(AOwner: TComponent);
   using the FormCreate event, because if an exception is raised in FormCreate
   it's not propagated out. }
 
-  procedure LoadSelectDirAndGroupImages;
-
-    procedure IconToBitmapImage(const AIcon: HICON; const Ctl: TBitmapImage; const BkColor: TColor);
-    begin
-      if AIcon <> 0 then begin
-        try
-          with Ctl.Bitmap do begin
-            Width := 32;
-            Height := 32;
-            Canvas.Brush.Color := BkColor;
-            Canvas.FillRect(Rect(0, 0, 32, 32));
-            DrawIconEx(Canvas.Handle, 0, 0, AIcon, 32, 32, 0, 0, DI_NORMAL);
-          end;
-        finally
-          DestroyIcon(AIcon);
-        end;
-      end;
-    end;
-
-  var
-    FileInfo: TSHFileInfo;
-    Path: String;
-  begin
-    { Set sizes (overrides any scaling) }
-    SelectDirBitmapImage.Width := 32;
-    SelectDirBitmapImage.Height := 32;
-    SelectGroupBitmapImage.Width := 32;
-    SelectGroupBitmapImage.Height := 32;
-
-    try
-      { We have to extract the icons ourself using ExtractIcon because the
-        icons SHGetFileInfo returns differ in size depending on whether
-        "Use large icons" is turned on, and we don't want that.
-        Note: We *could* avoid SHGetFileInfo altogether and pass 'shell32.dll'
-        and a hard-coded index directly to ExtractIcon, but I'm worried that
-        might not work in a future Windows version. }
-      if (SHGetFileInfo('c:\directory', FILE_ATTRIBUTE_DIRECTORY, FileInfo,
-          SizeOf(FileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICONLOCATION) <> 0) and
-         (FileInfo.szDisplayName[0] <> #0) then
-        IconToBitmapImage(ExtractIcon(HInstance, FileInfo.szDisplayName,
-          FileInfo.iIcon), SelectDirBitmapImage, SelectDirPage.Color);
-
-      if WindowsVersionAtLeast(6, 0) then begin
-        { On Windows Vista and 7, use the "Taskbar and Start Menu Properties"
-          icon as there is no longer a separate icon for Start Menu folders }
-        IconToBitmapImage(ExtractIcon(HInstance,
-          PChar(AddBackslash(WinSystemDir) + 'shell32.dll'), 39),
-          SelectGroupBitmapImage, SelectProgramGroupPage.Color);
-      end
-      else begin
-        Path := GetShellFolder(False, sfPrograms, False);
-        if Path = '' then
-          Path := GetShellFolder(True, sfPrograms, False);
-        if Path <> '' then begin
-          if (SHGetFileInfo(PChar(Path), 0, FileInfo, SizeOf(FileInfo),
-              SHGFI_ICONLOCATION) <> 0) and (FileInfo.szDisplayName[0] <> #0) then
-            IconToBitmapImage(ExtractIcon(HInstance, FileInfo.szDisplayName,
-              FileInfo.iIcon), SelectGroupBitmapImage, SelectProgramGroupPage.Color);
-        end;
-      end;
-    except
-      { ignore any exceptions }
-    end;
-  end;
-
   function SelectBestImage(WizardImages: TList; TargetWidth, TargetHeight: Integer): TBitmap;
   var
     TargetArea, Difference, SmallestDifference, I: Integer;
@@ -936,10 +871,9 @@ begin
   WizardBitmapImage2.Stretch := (shWizardImageStretch in SetupHeader.Options);
   WizardSmallBitmapImage.Bitmap := SelectBestImage(WizardSmallImages, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height);
   WizardSmallBitmapImage.Stretch := (shWizardImageStretch in SetupHeader.Options);
-  PreparingErrorBitmapImage.Bitmap.Handle := LoadBitmap(HInstance, 'STOPIMAGE');
-  PreparingErrorBitmapImage.ReplaceColor := RGB(255, 0, 255);
-  PreparingErrorBitmapImage.ReplaceWithColor := PreparingPage.Color;
-  LoadSelectDirAndGroupImages;
+  SelectDirBitmapImage.InitializeFromResource(HInstance, 'DIRIMAGE', 32, 32, SelectDirPage.Color); {don't localize}
+  SelectGroupBitmapImage.InitializeFromResource(HInstance, 'GROUPIMAGE', 32, 32, SelectProgramGroupPage.Color); {don't localize}
+  PreparingErrorBitmapImage.InitializeFromResource(HInstance, 'STOPIMAGE', 16, 16, PreparingPage.Color); {don't localize}
 
   { Initialize wpWelcome page }
   RegisterExistingPage(wpWelcome, WelcomePage, nil, '', '');