Delphi Xe2 с Firemonkey: может ли быть область, не относящаяся к клиенту, нарисована в стиле, отличном от стиля по умолчанию, не используемого в Windows? - PullRequest
14 голосов
/ 26 января 2012

Вот пример приложения delphi, которое я делаю с использованием firemonkey + Delphi XE2.

Как вы можете видеть, вы можете использовать визуальную стилистику в Firemonkey, чтобы настроить внешний вид большинства вещей внутриоконная рама.Однако внешняя часть оконной рамы рисуется в любом стиле, выбранном Windows.Теперь, если бы я использовал VCL вместо Firemonkey, я мог бы применить "VCL Styles" и "skin" для всего приложения VCL в темной цветовой схеме.

Я предполагаю, что это ДА НЕТ в Delphi XE2 +FireMonkey.Кто-нибудь может показать, как это сделать?

enter image description here

Во время разработки "превью" вашей формы показывает красивую черную рамку.Но когда я запускаю свое приложение, граница темы Windows XP "Luna" (синие части на рисунке ниже) выглядит ужасно.По иронии судьбы, VCL красивее (в XE2 со стилями), чем Firemonkey ...

Ответы [ 3 ]

4 голосов
/ 27 января 2012

Вы можете создать приложение VCL Forms, как обычно, со стилями, если хотите, во время выполнения, загрузить форму Firemonkey и установить форму VCL в качестве ее родителя:

uses
  FMX.Platform.Win, FMX.Forms,
  Unit2;

procedure TForm1.FormCreate(Sender: TObject);
var
  Form2: TForm2;
begin
  Form2 := TForm2.Create(nil);
  Form2.BorderStyle := FMX.Forms.TFmxFormBorderStyle.bsNone;
  Form2.SetBounds(0, 0, ClientWidth, ClientHeight);
  Winapi.Windows.SetParent(FmxHandleToHWND(Form2.Handle), Handle);
  Form2.Show;
end;

На следующем снимке экрана Form1 - основная форма приложения VCL (в стиле Carbon), а темно-серая область с кнопкой - встроенная форма Firemonkey:

Firemonkey form embedded in a VCL form

Обратите внимание, что я не занимаюсь изменением размеров родительского окна - оно также должно изменять размеры emebedded формы, эмулируя выравнивание alClient. Кажется, есть много потенциальных проблем с этим подходом - я думаю, что есть причина, по которой среда IDE не позволяет легко смешивать формы Firemonkey с формами VCL - она ​​предупреждает о возможных «ошибках компиляции или неожиданном поведении».

2 голосов
/ 27 января 2012

Firemonkey является кроссплатформенным. По большому счету вы не можете делать ничего, что зависит от платформы в самой среде FMX. Тем не менее, вы можете выполнять вызовы базовой платформы (будь то Windows, OSX или iOS), чтобы получить доступ к определенной функциональности платформы. Это должно быть сделано в условно скомпилированном коде.

например.

{$IF DCC}
  something;
{$ENDIF}

{$IF FPC}
  somethingelse;
{$ENDIF}

Глядя на это с другой точки зрения, вы можете выполнить всю работу с FMX над TRectangle (например), а затем использовать AddObject (или назначить его родительский элемент) для формы VCL.

0 голосов
/ 27 января 2012

Если вы измените формы BorderStyle на bsNone, вы можете добавить любой хром по вашему желанию. Вам, конечно, нужно будет вручную обрабатывать действия максимизации, минимизации, закрытия, изменения размера и т. Д.

...