Проблема 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
 

Вложения

  • 1694422556792.png
    1694422556792.png
    261.3 KB · Просмотры: 6
Последнее редактирование:
На Windows 7 должно быть "закругление" без этих танцев.
а для Windows 10 возьмите изображение с закругленными краями и форму FCreateImageForm.
Только будьте осторожны при выборе FCreateImageForm. Не будет работать FVideoPlayer, проблемки с FTabControl (небольшие)
 
Последнее редактирование:
На 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
 
вот это точно везде будет 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
 
Fluent на Windows 10 по умолчанию не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?
 
Последнее редактирование:
Fluent на Windows 10 не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?

Понятно, спасибо.
Это придется просто каждый раз картинку закругленную делать.
 
Fluent на Windows 10 по умолчанию не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?
@audiofeel. Ты может ответишь @tihiy_don?
 
Fluent на Windows 10 по умолчанию не будет rounded. Выбирайте FCreateImageForm. Закругляйте края у PNG и тогда на всех системах форма будет с закругленными краями. И зачем вам Fluent, если картинка на всю форму?
Это типа как в ботве только альфу не надо?
 
Это типа как в ботве только альфу не надо?
Rounded ему на всех системах нужен
я не уверен что что то будет работать 100%
даже TWin11FormCornerType. Проверять нужно а не на чем. Все равно найдется тот кто напишет - а ни черта не работает...
 
TWin11FormCornerType штука конечно хорошая. Но что будет если у пользователя стоит план электропитания - экономия? будет это работать? Я не знаю.
Поэтому предложил вариант с ImageForm. У картинки план электропитания углы не выпрямит обратно же :)
Снимок экрана 2023-09-11 230718.png
типа такого?
 
Последнее редактирование:
Еще странное заметил, в делфи можно вызвать из одной формы другую, в фмх нет.
 
Форматирование (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.
 
Форматирование (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;
 
Назад
Сверху