gpt4 book ai didi

delphi - 如何将FireMonkey表单无缝嵌入VCL表单中?

转载 作者:行者123 更新时间:2023-12-03 15:30:58 26 4
gpt4 key购买 nike

我使用了 this question 中描述的技巧在 VCL 应用程序的 TPanel 上显示 FireMonkey 表单。我的问题是,单击(控制)嵌入表单会导致 VCL 表单(包含 TPanel)被停用。最明显的结果是窗口边框的颜色一直在变化。

当在另一个 TPanel 上显示 VCL 表单时,不会发生这种情况;这些形式显然是“合并”的。我应该怎样做才能使用 FireMonkey 达到类似的结果?我希望 FireMonkey 表单上的控件可用,但保持父表单处于激活状态。

更新 1

VCL

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, FMX.Forms, Vcl.Forms,
Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, FMX.Platform.Win;

type
TMainForm = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.dfm}

uses FireMonkeyForms;

procedure TMainForm.Button1Click(Sender: TObject);
var
LFMForm: FireMonkeyForms.TForm1;
LFMHWnd: HWND;
begin
LFMForm := FireMonkeyForms.TForm1.Create(nil);
LFMForm.Left := 0;
LFMForm.Top := 0;
LFMForm.Height := Panel1.ClientHeight;
LFMForm.Width := Panel1.ClientWidth;
LFMForm.BorderStyle := TFmxFormBorderStyle.bsNone;
LFMForm.BorderIcons := [];
LFMHWnd := FmxHandleToHWND(LFMForm.Handle);
SetWindowLong(LFMHWnd, GWL_STYLE, GetWindowLong(LFMHwnd, GWL_STYLE) or WS_CHILD);
Winapi.Windows.SetParent(LFMHWnd, Panel1.Handle);
LFMForm.Visible := True;
end;

end.

FireMonkey
unit FireMonkeyForms;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Layouts, FMX.Memo;

type
TForm1 = class(TForm)
Label1: TLabel;
Memo1: TMemo;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

end.

最佳答案

该行为的原因是窗口管理器不知道您已将 firemonkey 窗口设置为子窗口,因此当您激活 firemonkey 窗口时,它会停用先前事件的窗口。正如 SetParent function 中所述您必须手动设置 child 标志。一个示例用法可以是:

var
FMForm: TFMForm1;
FMHWnd: HWND;
begin
FMForm := TFMForm1.Create(nil);
FMForm.Left := 0;
FMForm.Top := 0;

FMHWnd := FmxHandleToHWND(FMForm.Handle);
SetWindowLong(FMHWnd, GWL_STYLE, GetWindowLong(FMHwnd, GWL_STYLE) or WS_CHILD);
winapi.windows.SetParent(FMHWnd, Panel1.Handle);
FMForm.Visible := True;

更新:如果您必须删除 fmx 表单的边框,则设置 BorderStyle 会设置您不能与 WS_CHILD 一起使用的 WS_POPUP 样式。在这种情况下,明确设置您需要的样式,而不是获取和“或”调用它们。 FI.

  ..
LFMForm.BorderIcons := [];
LFMForm.BorderStyle := TFmxFormBorderStyle.bsNone;
LFMHWnd := FmxHandleToHWND(LFMForm.Handle);
SetWindowLong(LFMHWnd, GWL_STYLE, WS_CHILDWINDOW or WS_BORDER);
..

关于delphi - 如何将FireMonkey表单无缝嵌入VCL表单中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13002691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com