delphi – 如何在VCL表单中无缝嵌入FireMonkey表单?
发布时间:2020-12-15 09:14:45 所属栏目:大数据 来源:网络整理
导读:我使用 this question中描述的技巧在VCL应用程序中的TPanel上显示FireMonkey表单.我的问题是单击(控件)嵌入的表单导致VCL表单(包含该TPanel)被取消激活.最明显的结果是窗口边框一直在变色. 当在另一个的TPanel上显示VCL表单时,这不会发生;表格显然是“合并”
我使用
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,FMX.Types,FMX.Controls,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 中所述,您必须手动设置子标志.示例用法可以是:
var FMForm: TFMForm1; FMHWnd: HWND; begin FMForm := TFMForm1.Create(nil); FMForm.Left := 0; FMForm.Top := 0; FMHWnd := FmxHandleToHWND(FMForm.Handle); SetWindowLong(FMHWnd,GetWindowLong(FMHwnd,GWL_STYLE) or WS_CHILD); winapi.windows.SetParent(FMHWnd,Panel1.Handle); FMForm.Visible := True; 更新: .. LFMForm.BorderIcons := []; LFMForm.BorderStyle := TFmxFormBorderStyle.bsNone; LFMHWnd := FmxHandleToHWND(LFMForm.Handle); SetWindowLong(LFMHWnd,WS_CHILDWINDOW or WS_BORDER); .. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |