Я пытаюсь разместить изображение на пользовательской странице. Я могу показать пользовательскую страницу или изображение на заранее определенной странице, но не на пользовательской странице.

Я думаю, что проблема с Parent := CustomPage.ID;.

Parent := WizardForm.SelectTasksPage; работает, хотя.

Как это сделать правильно?

procedure ImageOnClick(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExec('', 'http://test.com', '', '', SW_SHOW, ewNoWait, ErrorCode);
end;

var
  CustomPage: TWizardPage;
  BtnImage: TBitmapImage;

procedure InitializeWizard;
begin
  CustomPage := CreateCustomPage(wpLicense, 'Heading', 'Sub heading.');

  ExtractTemporaryFile('image.bmp');

  BtnImage := TBitmapImage.Create(WizardForm);
  with BtnImage do
  begin
    Parent := CustomPage.ID;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\image.bmp');
    AutoSize := True;
    Left := 90;
    Top := WizardForm.SelectTasksPage.Top + WizardForm.SelectTasksPage.Height - Height - 8;
    Cursor := crHand;
    OnClick := @ImageOnClick;
  end;
end;
4
778899 29 Апр 2017 в 17:00

3 ответа

Лучший ответ

Вот для чего TWizardPage.Surface типа TNewNotebookPage.

with BtnImage do
begin
  Parent := CustomPage.Surface;
  { ... }
end;

Кроме того, никогда не используйте абсолютные координаты и размеры. Ваша раскладка сломается, когда мастер будет отображаться на дисплее с высоким DPI / масштабированием, что довольно часто встречается в настоящее время с дисплеями «сетчатки». Используйте ScaleX и ScaleY. По той же причине у вас должны быть готовы изображения с разными разрешениями (см. Inno Setup WizardImageFile выглядит плохо с масштабированием шрифтов в Windows 7 ) . Или хотя бы масштабировать / растягивать растровое изображение.

CustomPage := CreateCustomPage(wpLicense, 'Heading', 'Sub heading.');

ExtractTemporaryFile('image.bmp');

BtnImage := TBitmapImage.Create(WizardForm);
with BtnImage do
begin
  Parent := CustomPage.Surface;
  Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\image.bmp');
  AutoSize := True;
  AutoSize := False;
  Height := ScaleX(Height);
  Width := ScaleY(Width);
  Stretch := True;
  Left := ScaleX(90);
  Top := WizardForm.SelectTasksPage.Top + WizardForm.SelectTasksPage.Height -
         Height - ScaleY(8);
  Cursor := crHand;
  OnClick := @ImageOnClick;
end;

Макет при 100% увеличении (96 DPI):

Layout on 100% zoom (96 DPI)

Макет при 150% увеличении (144 DPI):

Layout on 150% zoom (144 DPI)

Макет при 150% увеличении (144 DPI) с масштабированием смещения / размеров и растяжением изображения:

Layout on 150% zoom (144 DPI) with offset/sizes scaling and image stretching

3
Martin Prikryl 16 Апр 2020 в 07:39

Похоже на ответ Мартина Прикрыла. Чтобы иметь дело с различными настройками DPI и размещением растрового изображения:

  1. настроить вашу машину на 100% DPI
  2. создайте растровое изображение с размером (шириной / высотой) для размещения на странице / форме InnoSetup
  3. получить эти ширину и высоту (щелкните правой кнопкой мыши / свойства в вашем файле BMP)
  4. используйте код ниже
  5. настройте ваш компьютер на 150% DPI и создайте растровое изображение, чтобы оно подходило для 150% DPI, и используйте его вместо первого (который подходит для 100% DPI), таким образом, он будет хорошо смотреться на 100% и на 200%.

Код:

WarningImage := TBitmapImage.Create(RisksForm);
WarningImage.Parent := RisksForm;
WarningImage.Bitmap.LoadFromFile(ExpandConstant('{app}')+'uninstall-warning-large.bmp');
WarningImage.Left := ScaleX(24);
WarningImage.Top := ScaleY(120);
WarningImage.Width := ScaleX(544);
WarningImage.Height := ScaleY(211);
WarningImage.Stretch := True;

Измените 544 с шириной вашего растрового изображения и 211 с высотой вашего растрового изображения (из шага 3)

Stretch: = True позволяет растровому изображению расширять (если оно меньше) или уменьшать (если оно больше) свойства ширины / высоты

Постскриптум Конечно, вы можете использовать несколько файлов и использовать один в зависимости от настроек DPI пользователя (настройки DPI с настройкой Inno), но растровые изображения не содержат сжатий, поэтому мне не нравится эта идея.

0
vinsa 26 Мар 2019 в 19:05

Вы можете использовать библиотеку Botva2 http://krinkels.org/threads/botva2.1931/ используйте гугл переводчик, если вы не понимаете по-русски вы можете создать какой-то удивительный установщик, используя этот изображение f.e Пример Botva2

[code]
#include "botva2.iss"
var SomeImage : Longint;
procedure InitializeWizard();
begin 
{Your Custom page Code Goes Here}
SomeImage := ImgLoad(WizardForm.Handle,'Image.bmp',0,0,854,480,true,true)‌​; 
end;
 procedure CurPageChanged(CurPageID: Integer); 
begin 
ImgSetVisibility(SomeImage,false); 
if (CurPageID = CustomPage.ID) ImgSetVisibility(SomeImage,true);
end;
0
Prince Gupta 30 Апр 2017 в 01:33