首页 > 解决方案 > 如何实现 FMX HD 应用放大和缩小?

问题描述

我是 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;

抱歉我描述的不好,谢谢!

标签: delphizoomingfiremonkey

解决方案


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

为布局创建一个OnMouseWheel()事件(如下命名)。ScaledLayout1ScaledLayout1MouseWheel

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

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 与 10 的典型值相同,WheelDelta而 10 将变化减少到十分之一。


推荐阅读