4

この質問で説明したトリックを使用して、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.
4

1 に答える 1

3

この動作の原因は、ウィンドウマネージャが、ファイアモンキーウィンドウを子にしたことを認識していないため、ファイアモンキーウィンドウをアクティブ化すると、以前にアクティブだったウィンドウが非アクティブ化されることです。に記載されているように、フラグを手動でSetParent function設定する必要があります。使用例は次のとおりです。

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_POPUPで使用できないスタイルが設定されますWS_CHILD。その場合、必要なスタイルを取得して'または'鳴らすのではなく、明示的に設定してください。Fi

  ..
  LFMForm.BorderIcons := [];
  LFMForm.BorderStyle := TFmxFormBorderStyle.bsNone;
  LFMHWnd := FmxHandleToHWND(LFMForm.Handle);
  SetWindowLong(LFMHWnd, GWL_STYLE, WS_CHILDWINDOW or WS_BORDER);
  ..
于 2012-10-21T22:49:33.967 に答える