我们正在开发的主要程序是完整的VCL设计,非常大,部分约20年 . 在下一个版本中,它将在考虑UWP指南和触摸控制的情况下获得更现代的UI .

由于我们已经开始使用应用程序开发,我们考虑使用FMX构建一个可以在不同平台上使用的通用框架 . 在Windows版本中,我们希望集成大多数VCL表单,因为重新实现它们对我们来说并不值得 . 此外,Windows版本将为我们的旧产品提供更多功能和支持 . 所以我们只想重新设计应用程序的那些部分,这些部分也应该是移动版本的一部分 .

首先,我们考虑将应用程序拆分为两个单独的Windows可执行文件 . 但在我们的新UI设计中,我们不想使用模态对话框 . 因此,我们希望使用可以嵌入VCL表单的FMX容器 .

What I've done

在我的项目中,我创建了一个FMX多设备应用程序,其中包含一个主窗体和一个包含VCL窗体的DLL . DLL导出函数来创建和销毁VCL表单,以及一个返回创建的VCL表单句柄的函数 .

在FMX应用程序的主窗体中,加载DLL并创建VCL表单 . 获取VCL表单的句柄后,通过调用Win32 API的 SetParent() 函数将其嵌入到主表单中:

HWND vclFormHandle = GetVclFormHandleFromDll();
HWND fmxFormHandle = WindowHandleToPlatform(Handle)->Wnd;
SetParent(vclFormHandle, fmxFormHandle);

Questions

  • 可以使用鼠标控制嵌入式VCL表单 . 此外,可以使用键盘编辑文本 . 但是通过Tab键在控件之间切换,或通过Return键执行Button单击,都不起作用 . 为了在VCL表单中工作,我添加了一个这样的钩子:
HHOOK hKeyBoardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardProc, HInstance, NULL);

RESULT CALLBACK KeyBoardProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    // key event -> vcl controls       
    return CallNextHookEx(hKeyBoardHoof, nCode, wParam, lParam);
}

在深入研究之前,我想问一下是否有人有更好的想法来转发这些关键事件? (当使用相同的机制将VCL表单设置为父级时,它可以正常工作而无需执行额外的操作) .

  • 我知道Embarcadero不推荐混合VCL和FMX,但似乎所描述的设计可行 . 这样做有人能看到危险或陷阱吗?