FMXBridge.dll для Inno Setup

DLL FMXBridge.dll для Inno Setup 16.06

Нет прав для скачивания
Добавлены новые компоненты:

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 · Просмотры: 4
Добавлена функция захвата мыши для 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 · Просмотры: 31
Небольшой апдейт с добавлением новых функций и расширением существующих возможностей.

Добавлена функция определения Windows 11
code_language.pascal:
function IsWindows11: Boolean;
  external 'IsWindows11@files:FMXBridge.dll stdcall delayload';

code_language.pascal:
if IsWindows11 then
begin
  FMXForm.FCreateTabbedForm(WizardForm.Handle, IsWinDark, True);
end
else
begin
  if IsWinDark then
    FMXForm.FCreateBlurForm(WizardForm.Handle, ColorSetOpacity($FF000000, 0.7), True)
  else
    FMXForm.FCreateBlurForm(WizardForm.Handle, ColorSetOpacity($FFFFFFFF, 0.7), True);
end;

if IsWinDark then
  FMXForm.LoadStyleFromFile(ExtractAndLoad('dark.style'), GetWinAccentColor)
else
  FMXForm.LoadStyleFromFile(ExtractAndLoad('light.style'), GetWinAccentColor);

12.png

1b.png

Добавлен новый компонент FNumberBox
числовая обёртка с расширенными настройками:

Основные методы:
code_language.pascal:
procedure DecimalDigits(FDigits: Integer);
procedure HorzIncrement(FValue: Single);
procedure VertIncrement(FValue: Single);
procedure VerticalMode(FEnabled: Boolean);
procedure Max(FMax: Single);
procedure Min(FMin: Single);
procedure Value(FValue: Single);
procedure ValueType(FFloat: Boolean);

function GetHorzIncrement: Single;
function GetVertIncrement: Single;
function IsVerticalMode: Boolean;
function GetValue: Single;

Расширена обёртка FUserInfo
Обновлён интерфейс пользователя: (по запросу, требовалось локализация типа учётки)
code_language.pascal:
type
  FUserInfo = interface(IUnknown)
    '{FF655E8A-2C5A-4DF4-80EB-81CBAFD100C1}'
    function Name: WideString;
    function Domain: WideString;
    function ProfilePath: WideString;
    function UserType: TUserType;
    function IsElevated: Boolean;
  end;
Добавлена типизация учётных записей:
code_language.pascal:
TUserType = (utUnknown, utUser, utAdmin, utGuest, utSystem);
И функция преобразования:
code_language.pascal:
function UserTypeToStr(AType: TUserType): string;
begin
  case AType of
    utUser:   Result := 'User';
    utAdmin:  Result := 'Admin';
    utGuest:  Result := 'Guest';
    utSystem: Result := 'System';
  else
    Result := 'Unknown';
  end;
end;

Прочие изменения
Небольшие внутренние правки и стабилизация работы компонентов.
Добавлены новые возможности:
FComboBox
метод StyledSettings
метод FontSetting (настройка шрифта и цвета элементов ComboBox)

code_language.pascal:
 procedure StyledSettings(FStyledSettings: TStyledSettings);
 procedure FontSetting(const FontName: WideString; FontSize: Single; FontColor: TAlphaColor);

демонстрационный пример: Example_ComboBox.iss

Вложения

  • a1.png
    a1.png
    83.7 KB · Просмотры: 35
  • Like
Реакции: Giperson и Salamandra
Добавлен компонент: FUWPTiles

Основные возможности:

Создание и управление контейнером плиток
Полный контроль расположения и размеров
Добавление и настройка Tile-элементов
Управление стилями, текстом и изображениями
Поддержка событий клика и взаимодействия
Работа напрямую через NativeInt handle

Позиция и размер:
FCreate(FParent: NativeInt): NativeInt
Left
Top
Width
Height
SetBounds(FLeft, FTop, FWidth, FHeight: Single)
Position(X, Y: Single)
Align(Al: TAlignLayout)
Margins(FLeft, FTop, FRight, FBottom: Single)
Padding(FLeft, FTop, FRight, FBottom: Single)

Управление слоем:
BringToFront
SendToBack
Offset(X, Y: Single)
Opacity(FOpacity: Single)
RotationAngle(FValue: Single)
RotationCenter(X, Y: Single)

Работа с Tile:
AddTile(const FImage, FTitle, FText: WideString; FWidth, FHeight: Single; Rounded: Boolean): NativeInt
TileGetObject(FTile: NativeInt): NativeInt
TileHandle(FTile: NativeInt): NativeInt
TileEnabled(FTile: NativeInt; FEnable: Boolean)
TileVisible(FTile: NativeInt; FVisible: Boolean)
TileOnClick(FTile: NativeInt; Event: TNotifyEvent)

Внешний вид Tile:
TileFillColor(FTile: NativeInt; FColor: TAlphaColor)
TileFillPicture(FTile: NativeInt; const FImage: WideString; WrapMode: TWrapMode)
TileBorderColor(FTile: NativeInt; FColor: TAlphaColor)
TileBorderThickness(FTile: NativeInt; FThickness: Single)
TileCornerStyle(FTile: NativeInt; XRadi, YRadi: Single; FCorners: TCorners; CornerType: TCornerType)

Текст и шрифты:
TileTitleFontSetting(FTile: NativeInt; const FontName: WideString; FontSize: Single; FontColor: TAlphaColor)
TileTextFontSetting(FTile: NativeInt; const FontName: WideString; FontSize: Single; FontColor: TAlphaColor)

Обновление и рендер:
BeginUpdate
EndUpdate
RecalcSize
Repaint

Состояние компонента:
Enabled(FEnabled: Boolean)
Visible(FVisible: Boolean)
HitTest(FEnabled: Boolean)
IsVisible: Boolean

Получение данных:
GetLeft: Single
GetTop: Single
GetWidth: Single
GetHeight: Single
GetObject: NativeInt
Handle: NativeInt


Оригинал
OSInfo: исправление нестабильности и некорректных значений.

Внесены изменения в реализацию получения информации о системе:
  • Данные (Caption / Version / Build) теперь инициализируются один раз в конструкторе объекта, вместо чтения при каждом вызове метода.
  • Устранена проблема, при которой значения могли “перемешиваться” при использовании интерфейса (зависимость от порядка методов / vtable).
  • Получение GetWinBuildNumber (build-номера) переведено на RtlGetVersion - теперь используется фактическая версия ядра, а не данные из реестра.
Добавлен компонент: FRatingBar

Основные возможности:

Отображение рейтинга (звезды).
Поддержка дробных значений.
Настройка количества звезд.
Управление максимальным значением.
Кастомизация внешнего вида (цвет, обводка, отступы).
Полный контроль через код (позиция, размеры, события).

Позиция и размер:
Left, Top, Width, Height
SetBounds
Position
Align
Margins / Padding

Внешний вид:
Color // цвет звезд
BackgroundColor // фон
StrokeColor // обводка
StrokeSetting // толщина и стиль линий
Opacity
RotationAngle

Настройки рейтинга:
NumberOfStars(FNumber: Integer) // количество звезд
MaximumRating(FMax: Single) // максимум (например 5.0)
Value(FValue: Single) // текущее значение
Space(FSpace: Single) // расстояние между звездами

События:
OnClick
OnMouseDown
OnMouseUp
OnMouseEnter
OnMouseLeave

Прочее:
Enabled
Visible
HitTest
BringToFront / SendToBack
SetTag / GetTag
Handle


Оригинал
Пример в инсталяторе
Назад
Сверху