FMXBridge.dll для Inno Setup

DLL FMXBridge.dll для Inno Setup 23.07

Нет прав для скачивания
Основное изменение - наконец разобрались с правильной схемой владения окнами.

Раньше была неправильная модель: FMX-окно считалось отдельным top-level окном, а Inno Setup выступал просто как внешний хозяин. Из-за этого начали появляться побочные эффекты с окнами, отображением в системе.

Сейчас сделано как в обычном приложении:

окно FMX имеет правильный Owner через Application;
убрана лишняя независимость окна от приложения;
поведение окна стало ближе к обычному FMX-приложению.

После этого пришлось заново пройтись по внутреннему позиционированию и размеру клиентской области. Исправлена работа с client area - теперь содержимое окна правильно располагается относительно реального клиентского пространства, а не относительно внешнего размера окна.

Отдельно вынесена работа с окном:

скрытие стандартного заголовка;
работа с рамками;
изменение поведения окна Windows.

Эти вещи теперь делаются на уровне FMX.Platform.Win, где им и место, а не через внешние обходные решения.

Также расширен BASS-модуль:

воспроизведение отдельных файлов;
загрузка папок с музыкой;
смена папки во время работы;
playlist;
callback прогресса;
управление воспроизведением.

Исправлено поведение служебных окон сообщений:

окна больше не появляются в AeroPeek.
  • Like
Реакции: Salamandra
Небольшое обновление

Добавлен новый компонент FPicShow - слайдшоу с поддержкой анимированных переходов между изображениями.

Основные возможности:
Настройка времени показа каждого слайда.
Настройка длительности анимации перехода.
Поддержка выбора конкретного эффекта перехода.
Режим случайного выбора эффектов.
Настраиваемая рамка (цвет и толщина).
Реализован на базе FireMonkey Canvas.

Управление:
AddImage
Clear
Start
Stop
SetEffect
SetRandom
SetDuration
SetDelay
SetBorder


Эффекты:
Доступны различные эффекты переходов:
Fade
Build up from...
Quarters...
Bars in...
Uneven shred from...
Criss Cross reveal from...
Starburst...
Speckle appear...
Diagonal sweep
Reveal from...
Random squares...
Blind...
Dissolve


Список эффектов можно получить программно, что позволяет заполнить FComboBox или FComboEdit без ручного перечисления.

Вместо таймера используется
code_language.pascal:
property AnimationValue: Single read FAnimationValue write FAnimationValue;
что позволило добиться плавных переходов.

Пример - Example_PicShow.iss

Все идеи эффектов были бессовестно взяты отсюда Delphi Area/PicShow
Небольшое обновление:

Добавлен компонент FPageControl.
Новая реализация страниц по принципу TabControl:

FPageControl - контейнер страниц.
FPageItem - отдельная страница.

Добавлена поддержка переключения страниц с анимацией:
pdNone - мгновенное переключение.
pdHorizontal - горизонтальная смена страниц.
pdVertical - вертикальная смена страниц.
pdFade - плавное изменение прозрачности.

Добавлены направления перехода:
pmNormal
pmReverse


Новые методы:
ActivePage(Index, Move)
NextPage(Move)
BackPage(Move)
FirstPage(Move)
LastPage(Move)


Добавлены настройки анимации:
Duration
Interpolation


Поддерживаемые типы интерполяции:
Все

Добавлено событие OnChange для отслеживания смены активной страницы.

code_language.pascal:
PageControl.FCreate(FormLayer.Handle);
PageControl.SetBounds(20, 75, 760, 310);
PageControl.Direction(pdHorizontal);
PageControl.Duration(0.8);
PageControl.Interpolation(itBack);
PageControl.OnChange(@PageChange);

Page1.FCreate(PageControl.Handle);
Page2.FCreate(PageControl.Handle);

PageControl.NextPage(pmNormal);

Функции по запросу:

Добавлен универсальный callback обработки Drag & Drop.
В текущей версии поддерживается компонентами FDropTarget и FListBox.

FDropTarget - загрузка например StyleBook простым перетаскиванием файла:
DropTarget.Filter('Styles (*.fsf;*.style)|*.fsf;*.style');
SetFileDropCallback(@FileDropped);

FListBox
- приём списка файлов с последующей обработкой каждого файла:
DropListBox.FileDropEnabled(True);
SetFileDropCallback(@FileDropped);
  • Like
Реакции: Giperson
Исправлено:

OnMouseDown (и аналогичные события) у кастомных контролов теперь передают корректный Sender. Ранее вместо объекта контрола передавался Self, из-за чего обработчики с case Sender of ... могли работать некорректно.
(Self > Sender)
Примеры в архиве:
Example_Botva2-Like.iss
Example_ShapeControls.iss
Добавлены новые интерфейсы:

FShapeArc - круговой прогресс-бар с поддержкой stroke, font, value, opacity, rotation, events и базовых layout-параметров.
FShapeSwitch - переключатель (on/off) с настройкой цветов, толщины, слайдера, состояния и событий OnChange.
FShapeButton - кнопка с текстом, стилем, скруглением, цветами, шрифтом и обработкой мыши/клика.
FShapeGradientButton - кнопка с градиентной заливкой, кастомной позицией градиента и расширенными визуальными настройками.
FShapeProgressBar - прогресс-бар с поддержкой градиентов, анимации, stroke, corner, value/min/max и событий.

расширены возможности кастомных Shape-контролов для тех кому нужно быстро и без участия -подключения стилями минимально офорить UI.
все как обычно - добавлена единая событийная модель (click/mouse/enter/leave)
есть визуальные параметры (opacity, rotation, hit-test, clipping, layout)

не требует создания собственных стилей через StyleBook;

shape.png



Добавлены новые компоненты к предыдущим обновлениям (FImageButton, FImageCheckbox):

FImageRadioButton - радиокнопка на основе спрайта с поддержкой группировки, кастомного текста, шрифтов, состояний hover/down и обработкой мыши. Реализована логика взаимоисключающих групп (GroupName) и событие изменения состояния.
FImageProgressBar - прогресс-бар на текстурах (back/fill) с поддержкой min/max/value и отрисовкой заполнения через спрайты.

унифицированы почти все базовые свойства управления (layout, input, events)
botva.png
  • Like
Реакции: MarsBar
Добавлены новые компоненты:

FImageButton, FImageCheckbox. По сути это графическая кнопка со спрайтом состояний, рассчитанная на сценарии, где внешний вид кнопки полностью задаётся изображением.

Идея простая: пользователь указывает одно изображение, а компонент автоматически разбирает его на состояния кнопки.
Формат спрайта:

- Обычное состояние
- Наведение мыши
- Нажатие
- Enabled = False

Изображения располагаются вертикально друг под другом.
Например, если кнопка должна отображаться размером: 120 x 25
то компонент автоматически ожидает спрайт: 120 x 100 и самостоятельно разделяет его на 4-8 кадра без дополнительных настроек и расчётов со стороны Inno Setup.

Основные возможности:
code_language.pascal:
function FCreate(FParent: NativeInt): NativeInt;
procedure SetImage(const FImage: WideString);
procedure Text(const AText: WideString);
procedure FontSetting(const FontName: WideString; FontSize: Single; FontColor: Cardinal);
procedure TextColor(FontColor: Cardinal);
procedure OnClick(Event: TNotifyEvent);
procedure OnChange(Event: TNotifyEvent);
procedure OnMouseEnter(Event: TNotifyEvent);
procedure OnMouseLeave(Event: TNotifyEvent);

Особенности:

автоматическое масштабирование изображения под размер кнопки;
поддержка текста поверх изображения;
настройка шрифта и цвета текста;
корректная обработка состояний Hover / Pressed / Disabled;
поддержка стандартного OnClick;
поддержка OnChange;
не требует style-файлов FMX;
не требует создания собственных стилей через StyleBook;
вся логика рендеринга находится внутри DLL.

Компонент создавался как более простой вариант для задач, где раньше обычно использовали botva.dll: подготовили изображение со всеми состояниями, загрузили его в кнопку и получили готовый элемент.

Добавлена новая функция:

code_language.pascal:
function ExtractIconFromResource(
  const ModuleFile, OutFile: WideString;
  ResourceIndex: Integer;
  IconSize: Integer
): Boolean;
Позволяет извлекать иконки напрямую из ресурсов Windows и сторонних DLL/EXE с сохранением в PNG.

Поддерживаемые размеры зависят от конкретного ресурса и обычно включают:
16x16
32x32
48x48
64x64
128x128
256x256

Пример получения нескольких системных иконок из imageres.dll.mun:
code_language.pascal:
Module := 'C:\Windows\SystemResources\imageres.dll.mun';

ImageIdx[1] := 31;
ImageIdx[2] := 27;
ImageIdx[3] := 103;
ImageIdx[4] := 105;
ImageIdx[5] := 175;
ImageIdx[6] := 107;

for i := 1 to 6 do
begin
  ImageFile[i] := ExpandConstant('{tmp}\') + IntToStr(i) + '.png';

  if ExtractIconFromResource(Module, ImageFile[i], ImageIdx[i], 64) then
    Image[i].LoadPicture(ImageFile[i], iwOriginal);
end;

Вложения

  • 1.png
    1.png
    29.8 KB · Просмотры: 12
Добавлена функция захвата мыши для FMX-контролов.
code_language.pascal:
procedure TFForm.SetCaptured(FControl: NativeInt);
begin
  if FControl = 0 then
    Exit;

  TControlAccess(Pointer(FControl)).Capture;
end;

После начала перетаскивания элемент продолжает получать события мыши, даже если курсор вышел за его границы.
Это позволяет без проблем перемещать панели, формы и другие элементы интерфейса.
Например, теперь можно создавать внутри главного окна собственные перемещаемые псевдо-окна и свободно перетаскивать их мышью по рабочей области.

Пример тут = cpi-v7
Добавлена возможность полностью кастомизировать процесс деинсталляции и использовать FMX-компоненты в окне удаления приложения.

Для этого достаточно заменить стандартные объявления функций:
code_language.pascal:
function InitLayoutHandle: FLayout;
  external 'InitLayoutHandle@files:FMXBridge.dll stdcall delayload';
на версии для деинсталлятора:
code_language.pascal:
function InitLayoutHandleUn: FLayout;
  external 'InitLayoutHandle@{tmp}\FMXBridge.dll uninstallonly stdcall delayload';

Аналогично и для остальных компонентов (Form, Label, ProgressBar, Timer и т.д.).

Это позволяет сделать свое окно деинсталляции с любыми элементами FMX: надписями, прогресс-барами, индикаторами и другим оформлением.
Добавлен новый интерфейс FTile для работы с плитками.

Поддерживаются:
создание и удаление плиток;
позиционирование и выравнивание;
настройка размеров и отступов;
фоновые изображения;
цвет, рамка и скругление углов;
текст и параметры шрифта;
прозрачность и поворот;
обработка событий мыши;
работа с тегами и подсказками.
code_language.pascal:
type
  FTile = interface(IUnknown)
    '{0669FD3A-DBAB-4AA9-890A-BC1BFD47EE09}'
    function FCreate(FParent: NativeInt): NativeInt;
    procedure Cursor(FCursor: TCursor);
    procedure Left(FLeft: Single);
    procedure Top(FTop: Single);
    procedure Height(FHeight: Single);
    procedure Width(FWidth: Single);
    procedure SetBounds(FLeft, FTop, FWidth, FHeight: Single);
    procedure Position(X, Y: Single);
    procedure Align(Al: TAlignLayout);
    procedure Margins(FLeft, FTop, FRight, FBottom: Single);
    procedure Padding(FLeft, FTop, FRight, FBottom: Single);
    procedure SetHint(const FText: WideString);
    procedure SetClipParent(FValue: Boolean);
    procedure SetClipChildren(FValue: Boolean);
    procedure BringToFront;
    procedure SendToBack;
    procedure SetTag(FTag: Integer);
    procedure TileColor(FColor: TAlphaColor);
    procedure TilePicture(const FImage: WideString; WrapMode: TWrapMode);
    procedure TileStrokeColor(FColor: TAlphaColor);
    procedure TileThickness(FThickness: Single);
    procedure TileCurve(XRadi, YRadi: Single);
    procedure Text(const FText: WideString);
    procedure FontSetting(const FontName: WideString; FontSize: Single; FontColor: TAlphaColor);
    procedure TextSetting(FHorzAlign, FVertAlign: TTextAlign);
    procedure TextBackColor(FColor: TAlphaColor);
    procedure TextColor(FontColor: TAlphaColor);
    procedure Opacity(FOpacity: Single);
    procedure RotationAngle(FValue: Single);
    procedure RotationCenter(X, Y: Single);
    procedure Enabled(FEnabled: Boolean);
    procedure Visible(FVisible: Boolean);
    procedure HitTest(FEnabled: Boolean);
    function IsVisible: Boolean;
    function GetText: WideString;
    function GetTag: Integer;
    function GetLeft: Single;
    function GetTop: Single;
    function GetHeight: Single;
    function GetWidth: Single;
    function GetObject: NativeInt;
    procedure OnClick(Event: TNotifyEvent);
    procedure OnMouseDown(Event: TMouseEventF);
    procedure OnMouseEnter(Event: TNotifyEvent);
    procedure OnMouseLeave(Event: TNotifyEvent);
    procedure OnMouseUp(Event: TMouseEventF);
    function Handle: NativeInt;
  end;

Интерфейс был запрошен пользователями (заморскими) достаточно давно, но до реализации руки дошли только сейчас.

43.png
Исправлено отображение миниатюры окна в панели задач на Windows 11 - ранее изображение могло выглядеть "размытым"/"сжатым" из-за некорректного расчёта клиентской области. Добавлена корректировка обработки с учётом системных границ окна, что устраняет искажения и обеспечивает более чёткий превью.
code_language.pascal:
WM_NCCALCSIZE

Отключено применение акцентного цвета к заголовку окна в Windows 11. Ранее верхняя полоса автоматически окрашивалась в системный цвет. Теперь заголовок остаётся нейтральным.
code_language.pascal:
DwmSetWindowAttribute(DWMWA_CAPTION_COLOR)

Улучшена загрузка и отображение иконки в FTitleBar. Ранее при использовании иконок большого размера они могли выглядеть "сжатыми" и пиксельными.
Теперь выбирается наиболее подходящий размер фрейма из .ico с учётом DPI, что в большинстве случаев даёт чёткое и корректное отображение без искажений.
code_language.pascal:
Factory: IWICImagingFactory;
Decoder: IWICBitmapDecoder;
Frame: IWICBitmapFrameDecode;
Converter: IWICFormatConverter;

Вложения

  • 32.png
    32.png
    516.7 KB · Просмотры: 37
Назад
Сверху