【问题标题】:How implement FMX HD app zoom-in and zoom-out?如何实现 FMX HD 应用放大和缩小?
【发布时间】:2020-07-19 07:05:26
【问题描述】:

我是 FireMonkey 的新手。最近在用Delphi(FMX)开发一个小游戏2D,想在鼠标滚轮的时候加上ZOOM-in/out效果,试过了,搜了Idera样例和FMX代码,没有收获。 那么,有没有办法实现 ZOOM 呢?为什么 FMX 不提供易于使用的“比例”属性? FMX 对用户不友好,并且非常缺乏成熟的产品、示例代码和讨论。 非常感谢,请原谅我的英语不好。

简单点:

File-->New-->Multi-Device Application-->Blank Application,点击OK,然后我们应该得到一个FMX HD App,我要做的是,当我滚动鼠标时,主窗体的视口可以放大/缩小。

    procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; var Handled: Boolean);
    begin
      // ?
    end;

对不起,我描述得不好,谢谢!

【问题讨论】:

  • 您问:为什么 FMX 不提供易于使用的“缩放”属性? 搜索文档而不是搜索示例代码。例如。 TControl.Scale.
  • 我的错,我的意思是,我如何在不改变其大小的情况下缩放表单/画布,而且它们不是 TControl,如视口/剪辑等
  • 如果不是TControls 或后代,您需要澄清您的问题并提供表格的简化示例以及表格上的内容。
  • 从您的公开数据中,我可以看到自我上次发表评论以来您一直在附近,但您尚未根据我上次发表的评论编辑您的问题。请阅读stackoverflow.com/help/how-to-ask 并使用对您很重要的具体细节来编辑您的问题。我确实为您准备了一个解决方案,但如果我不能确定它是否满足您的要求,我将无法发布它。
  • 没问题,Stack Overflow 确实不同于论坛。请访问tour 获取简短介绍并阅读全部内容,大约需要 2 分钟。它描述了在有人回答您的问题后您可以询问的内容以及您的选择。

标签: delphi zooming firemonkey


【解决方案1】:

在表单上放置TScaledLayout(以下命名为ScaledLayout1),并将Align 属性设置为Client。此外,设置HitTest = True 以在布局的任何位置接收鼠标事件。然后将所有其他控件放在此布局上。

ScaledLayout1 布局创建一个OnMouseWheel() 事件(以下命名为ScaledLayout1MouseWheel)。

在表单上声明一个私有字段

private
  StoredWheelDelta: extended;

这是累积滚动量所必需的。

然后编写OnMouseWheel()事件的代码:

procedure TForm12.ScaledLayout1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; var Handled: Boolean);
begin
  StoredWheelDelta := StoredWheelDelta + WheelDelta; // accumulate wheeldelta's

  ScaledLayout1.Scale.X := (1 + StoredWheelDelta / 120 / 10);
  ScaledLayout1.Scale.Y := (1 + StoredWheelDelta / 120 / 10);
end;

值 120 和 10 只是为了将更改缩放到一个合理的值。 120 与 WheelDelta 的典型值相同,而 10 会将变化减少到十分之一。

【讨论】:

  • 非常感谢汤姆,您提供了一个很好的解决方案,我会尝试一下,感谢您的详细回复和热情!
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多