带Firemonkey的Delphi Xe2:您是否可以使用非默认Windows非客户端绘画样式绘制的非客户区?

时间:2012-01-26 02:25:30

标签: delphi delphi-xe2 firemonkey

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

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

我的猜测是,这与Delphi XE2 + Firemonkey无关。谁能说明如何做到这一点?

enter image description here

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

3 个答案:

答案 0 :(得分:4)

您可以像往常一样创建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表单混合的原因 - 它警告可能的"编译错误或意外行为"

答案 1 :(得分:2)

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

例如

{$IF DCC}
  something;
{$ENDIF}

{$IF FPC}
  somethingelse;
{$ENDIF}

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

答案 2 :(得分:0)

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