Проблема FMXInno - Закругление формы (Решено)

Xenium

Новичок
Коллеги, всем доброго времени суток!
Есть замечательный модуль FMXInno, необходимо сделать закругленную форму для Win7\10.

Пробовал делать так:

Код:
procedure InstallerFormDesigning;
var
  RegisterWizardform : HWND;
  FormRegion : LONGWORD;
begin
  FormRegion := CreateRoundRectRgn(0, 0, 952, 527, 6, 6);

#ifdef BackgroundImage
  ExtractTemporaryFile('Img1.jpg');
  ExtractTemporaryFile('Img2.jpg');
  ExtractTemporaryFile('Img3.jpg');
  InstallerForm.FCreateNormal(WizardForm.Handle);

  InstallerForm.SetCursor(ExtractAndLoad('Dark.Cur'));
  OverlayRect.FCreate(InstallerForm.Handle);
  OverlayRect.Align(Contents);
  OverlayRect.FillPicture(ExtractAndLoad('overlay_dark.png'), wmTileStretch);
  OverlayRect.Opacity(StrToFloat('{#OverlayImageOpacity}'));
  InstallerForm.AddMousedownControls(OverlayRect.Handle);
#else
  InstallerForm.FCreateFluent(WizardForm.Handle, FDark, False, FluentFormOpacity, FluentFormBrightness);
  InstallerForm.SetCursor(ExtractAndLoad('Dark.Cur'));
#endif
  ExtractTemporaryFile('Img4.jpg');
  SetWindowRgn(InstallerForm.Handle, FormRegion, True);
  InstallerForm.LoadStyleFromFile(ExtractAndLoad(ExtractFileName('{#ThemeFile}')));

Все равно остается квадрат.
Если делать чисто для WizardForm - она закругляется, FMX-же не хочет.

Кто может помочь с решением?
Скрин ниже.
1694422630144.png
 

Вложения

Последнее редактирование:

audiofeel

Старожил
На Windows 7 должно быть "закругление" без этих танцев.
а для Windows 10 возьмите изображение с закругленными краями и форму FCreateImageForm.
Только будьте осторожны при выборе FCreateImageForm. Не будет работать FVideoPlayer, проблемки с FTabControl (небольшие)
 
Последнее редактирование:

Xenium

Новичок
На Windows 7 должно быть "закругление" без этих танцев.
а для Windows 10 возьмите изображение с закругленными краями и форму FCreateImageForm.
Только будьте осторожны при выборе FCreateImageForm. Не будет работать FVideoPlayer, проблемки с FTabControl (небольшие)

цитата BLACKFIRE69

Код:
  FormRegion := CreateRoundRectRgn(0, 0, 952, 527, 6, 6);

  ExtractTemporaryFile('Img1.jpg');
  ExtractTemporaryFile('Img2.jpg');
  ExtractTemporaryFile('Img3.jpg');
  ExtractTemporaryFile('Img4.jpg');
  ExtractTemporaryFile('Tile1_Icon.png');
  InstallerForm.FCreateImageForm(WizardForm,ExpandConstant('{tmp}\Tile1_Icon.png'),9)
  InstallerForm.LoadStyleFromFile(ExtractAndLoad(ExtractFileName('{#ThemeFile}')));
  SetWindowRgn(InstallerForm.Handle, FormRegion, True);
                                                        
  InstallerForm.SetCursor(ExtractAndLoad('Dark.Cur'));

Что не так делаю?
Можно пример реализации какой-то?
1694445737199.png
 

Xenium

Новичок
вот это точно везде будет Rounded
и в семерке и в десятке
Немного не то... Но решение интересное. (Заливаем форму картинкой)
Не пойму каким образом, но с 10го раза оно заработало как надо, только вот форму нельзя двигать теперь.

Код:
  FormRegion := CreateRoundRectRgn(0, 0, 952, 527, 6, 6);

  ExtractTemporaryFile('Img1.jpg');
  ExtractTemporaryFile('Img2.jpg');
  ExtractTemporaryFile('Img3.jpg');
  ExtractTemporaryFile('Img4.jpg');
  ExtractTemporaryFile('Tile1_Icon.png');
  InstallerForm.FCreateNormal(WizardForm.Handle)

  InstallerForm.LoadStyleFromFile(ExtractAndLoad(ExtractFileName('{#ThemeFile}')));
  SetWindowRgn(InstallerForm.Handle, FormRegion, True);
                                                        
  InstallerForm.SetCursor(ExtractAndLoad('Dark.Cur'));

1694447105288.png
 

audiofeel

Старожил
Fluent на Windows 10 по умолчанию не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?
 
Последнее редактирование:

Xenium

Новичок
Fluent на Windows 10 не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?
Понятно, спасибо.
Это придется просто каждый раз картинку закругленную делать.
 

Crachlow

Старожил
Fluent на Windows 10 по умолчанию не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?
@audiofeel. Ты может ответишь @tihiy_don?
 

Crachlow

Старожил
Fluent на Windows 10 по умолчанию не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?
Это типа как в ботве только альфу не надо?
 

audiofeel

Старожил
Это типа как в ботве только альфу не надо?
Rounded ему на всех системах нужен
я не уверен что что то будет работать 100%
даже TWin11FormCornerType. Проверять нужно а не на чем. Все равно найдется тот кто напишет - а ни черта не работает...
 

Crachlow

Старожил
TWin11FormCornerType штука конечно хорошая. Но что будет если у пользователя стоит план электропитания - экономия? будет это работать? Я не знаю.
Поэтому предложил вариант с ImageForm. У картинки план электропитания углы не выпрямит обратно же :)
Снимок экрана 2023-09-11 230718.png
типа такого?
 
Последнее редактирование:

Crachlow

Старожил
Еще странное заметил, в делфи можно вызвать из одной формы другую, в фмх нет.
 

BLACKFIRE69

Новичок
Форматирование (BB-код):
type
  { Win11 Form Corner Type }
  TWin11FormCornerType    = (ctw11Sharp, ctw11Rounded, ctw11SemiRounded, ctw11SysDefault);

procedure SetWin11FormCorners(const HandleHWND: HWND; const FCornerType: TWin11FormCornerType);

this function requires Windows 11 build 22000 or newer since it was introduced in Windows 11 build 22000.
 

Xenium

Новичок
Форматирование (BB-код):
type
  { Win11 Form Corner Type }
  TWin11FormCornerType    = (ctw11Sharp, ctw11Rounded, ctw11SemiRounded, ctw11SysDefault);

procedure SetWin11FormCorners(const HandleHWND: HWND; const FCornerType: TWin11FormCornerType);

this function requires Windows 11 build 22000 or newer since it was introduced in Windows 11 build 22000.
Hi!
The following order works perfectly.
Win 7\10 tested.

Код:
PROCEDURE shape_form_round(aForm : TForm; edgeSize : INTEGER);
VAR
  FormRegion : LONGWORD;
BEGIN
  FormRegion := CreateRoundRectRgn(0, 0, aForm.Width, aForm.Height, edgeSize, edgeSize);
  SetWindowRgn(aForm.Handle, FormRegion, TRUE);
END;

***
procedure InitializeWizard();
begin
...
shape_form_round(WizardForm, 6);
InstallerFormDesigning;
end;

+


procedure InstallerFormDesigning;
var
  FormRegion : LONGWORD;
begin
FormRegion := CreateRoundRectRgn(0, 0, 952, 527, 6, 6);
...

  InstallerForm.FCreateNormal(WizardForm.Handle)
  SetWindowRgn(InstallerForm.Handle, FormRegion, True);
...
end;
Всем спасибо за помощь!
Итого имеем 2 решения:

1)Делаем форму через картинку ImageForm .
2)Через код SetWindowRgn.
 

Хамик

Старожил
8-)
code_language.pascal:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Code]
type
  HRGN = Longword;

function SetWindowRgn(bWnd: HWND; bRgn: HRGN; bRedraw: boolean): integer; external 'SetWindowRgn@User32.dll stdcall';
function CreateRoundRectRgn(x1, y1, x2, y2, w, h: integer): HRGN; external 'CreateRoundRectRgn@Gdi32.dll stdcall';


procedure InitializeWizard();
begin
  SetWindowRgn(WizardForm.Handle, CreateRoundRectRgn(5, 5, WizardForm.Width, WizardForm.Height, 30, 30), true);
end;
 
Сверху