2012-02-08 139 views
5

我目前正在尝试开发一个基于Firemonkey的项目。我使用的是Firemonkey的UI功能,因为该项目由许多较小的应用程序组成,每个应用程序都有一个3D方面。我目前只使用FMX框架开发/部署到Windows,但可能会在以后进行跨平台。Firemonkey - 消息处理

通过在后台构建VCL Windows应用程序以执行非常具体的操作,然后构建FMX前端,我已经了解了大部分我遇到的问题。但是,这仅适用于仅执行应用程序以执行其设计要执行的操作的应用程序,因此可以使用参数执行应用程序。在其中一个应用程序中,我需要使用消息(或类似的东西)。例如,在我的FMX应用程序中,如果单击“button1”,我希望它向后台VCL应用程序发送消息以执行“action1”,而不是使用参数执行它。

一个很好的例子可以是使用VCL TMediaPlayer在后台应用,与前端FMX应用被用于显示信息,并提供的播放,暂停等控制,使得它基本上成为FMX具有VCL能力的UI。

我迄今无法找到如何使用的消息是Firemonkey处理(例如,在VCL,他们会用“SendMessage函数”或“PostMessage的”或类似的东西做)什么,或者通过当地的帮助文件,或通过广泛的谷歌搜索。我发现的一切都与电子邮件有关(大概是因为我的大多数搜索条件中的“消息”一词)。

Can anyone point me in the right direction on how messages would be handled with Firemonkey/FMX?

问候, 斯科特·普里查德

+2

你知道你可以在同一个应用程序中使用VCL和FMX,不是吗?那么,它确实需要一些额外的工作,但它在技术上是可行的,并且有第三方库和文章向您展示如何去做。因此,如果您只需从FMX UI事件处理程序调用您的VCL按钮的Click()方法(或者更好地,在您自己的函数中隔离您的共享代码,那么VCL和FMX都可以在需要时调用)。 – 2012-02-08 01:24:56

回答

4

我的理解是,Firemonkey不是基于传统的Windows,所以发送窗口消息Firemonkey控制通常不是一个选项。虽然有些控件确实使用了窗口(最明显的是TCommonCustomForm),所以您可以使用FMX.Platform.Win单元中的FmxHandleToHWND()函数在需要时从TFmxHandle中提取HWND。我不知道如何在FMX控件中接收和自定义处理窗口消息,如果甚至可能的话。

Windows下的Firemonkey可以访问Win32 API,因此不应该阻止您将窗口消息发送到其他窗口控件,例如VCL UI。在您的uses子句中包含Winapi.Windows单元以访问Win32 API函数,就像在VCL应用程序中一样。

UPDATE:因为FireMonkey不会公开对发送到窗体窗口的消息的访问,所以您必须手动子窗口才能在FireMonkey看到消息之前接收消息。您可以重写Form的CreateHandle()方法,首先调用inherited方法创建窗口,然后使用FmxHandleToHWND()获取您可以继承的HWND。确保在覆盖DestroyHandle()方法以删除子类,然后再调用inherited来释放HWND

3

目前,FireMonkey没有可用于发送和发布消息的消息处理程序。

有可能使用像FireMonkey这样的侦听器在内部工作,但没有任何记录。

所以,相反,这里是我做了什么:

我创建了自己定制的“消息”类。我创建类的实例并将它们添加到我需要的任何线程的线程安全列表中。在主线程中,我有一个计时器来检查列表并处理“消息”。