【问题标题】:Delphi Xe2 with Firemonkey : Can you have a non-client area that is painted in a style other than the default Windows nonclient paint style?Delphi Xe2 with Firemonkey : 你能有一个非客户区以不同于默认 Windows 非客户端绘制样式的样式绘制吗?
【发布时间】:2012-02-19 06:16:01
【问题描述】:

这是我使用 firemonkey + Delphi XE2 制作的 delphi 应用程序示例。

如您所见,您可以使用 Firemonkey 中的视觉样式“样式书”来自定义窗口框架内大多数事物的外观。然而,窗口框架的外部是使用 Windows 决定的任何样式绘制的。现在,如果我使用 VCL 而不是 Firemonkey,我可以应用“VCL 样式”并以深色方案“皮肤”整个 VCL 应用程序。

我的猜测是 Delphi XE2 + Firemonkey 还不可能。任何人都可以展示如何做到这一点?

在设计时,表单的“预览”会显示一个漂亮的黑色边框。但是当我运行我的应用程序时,Windows XP 的“Luna”主题边框(下图中的蓝色部分)看起来很糟糕。具有讽刺意味的是,VCL 比 Firemonkey 更漂亮(在具有样式的 XE2 中)...

【问题讨论】:

  • 是的。我没有在 Windows 框架上找到运行时应用的 Firemonkey 样式的任何视频、图像或教程。我想这还不可能(或者至少没有“忍者”技能)
  • 似乎还不能将样式应用于 TMainMenu。

标签: delphi delphi-xe2 firemonkey


【解决方案1】:

您可以像往常一样创建一个 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 窗体:

请注意,我没有处理父窗口的大小调整 - 它也应该调整嵌入表单的大小,模拟 alClient 对齐方式。 这种方法似乎存在许多潜在问题 - 我认为 IDE 不允许您轻松地将 Firemonkey 表单与 VCL 表单混合使用是有原因的 - 它会警告可能的“编译错误或意外行为”。

【讨论】:

  • 好主意!也许在未来的 Delphi 版本中,他们可能会调整 VCL 样式的代码库,以允许对 firemonkey 应用程序的非客户区进行蒙皮,至少在 Windows 上是这样。
  • 同意,好主意!只有一个缺点:它不再是 Firemonkey 应用程序......
  • 现在在 XE3 及更高版本中开箱即用。 stackoverflow.com/questions/12719749/…
【解决方案2】:

Firemonkey 是跨平台的。总的来说,您不能在 FMX 框架本身内做任何依赖于平台的事情。但是,您可以调用底层平台(无论是 windows、OSX 还是 iOS)来访问特定于平台的功能。这应该在条件编译的代码中完成。

例如。

{$IF DCC}
  something;
{$ENDIF}

{$IF FPC}
  somethingelse;
{$ENDIF}

从另一个角度来看,您可能会在 TRectangle 上完成所有 FMX 工作(例如),然后使用 AddObject(或分配其父级)到 VCL 表单。

【讨论】:

    【解决方案3】:

    如果您将表单 BorderStyle 更改为 bsNone,您可以添加任何您想要的 chrome。当然,您需要手动处理最大化、最小化、关闭、调整大小等操作。

    【讨论】:

    • 这仍然行不通,因为它会从应用程序窗口列表中删除该窗口。 BorderStyle=bsNone 还在 Windows 上设置 WS_POPUP。
    猜你喜欢
    • 2021-12-15
    • 2011-07-12
    • 2013-05-18
    • 2011-11-19
    • 2012-09-25
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多