首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种缩放的Delphi FireMonkey布局策略,可以保留字体文本的纵横比?

有没有一种缩放的Delphi FireMonkey布局策略,可以保留字体文本的纵横比?
EN

Stack Overflow用户
提问于 2013-03-06 01:27:50
回答 2查看 2.6K关注 0票数 2

多年来,我一直在使用VCL窗体应用程序布局策略,该策略自动调整主窗体上的窗体控件的大小。用户可以根据需要最大化或调整应用程序的大小,具有与按钮布局、图表等相同的通用外观和感觉。为此,我编写了基于窗体的FormResize事件操作子控件的BoundsRect的代码,这种简单的技术保留了文本的字体大小和纵横比(例如按钮)。我还有更简单的代码来增大和减小字体大小,以跟踪主控件的扩展和缩小按钮/标签的大小,但是许多控件,例如TChart,在最小化应用程序时会留下可读但很小的字体-我对此非常满意。

我想迁移我的布局来使用FireMonkey,它有TScaledLayout,当你在表单中对齐它时,alClient会整齐地调整它包含的所有控件的大小。不幸的是,调整大小也扩展到了所有的文本字体,这真的是不可取的。将TScaledLayout设置为alFit会保持内容的原始纵横比,但可能会导致顶部或侧面的空白填充以实现此目的。

有没有什么办法可以在TScaledLayout操作下“关闭”所有字体的大小调整?我已经研究了FireMonkey Layouts Strategies中的信息,也尝试了它的每一个大大增加的“对齐”设置,但都没有成功。当在不同的显示设备之间移动时,全屏部署肯定需要这种能力吗?

EN

Stack Overflow用户

发布于 2021-10-26 10:52:36

可以尝试以下策略:

  • 使用ScaledLayout并将其Align属性设置为Fit。我认为您还必须在面板内使用Align Anchors None和no :=,并将其设置为在表单

中对面板进行调整

在我的例子中,我想在TScrollBox布局中创建一个可缩放的面板(保留宽高比),因此我在该面板上使用Align:=Center,并以编程方式设置其缩放比例。

请注意,Embarcadero的ScaledLayout示例在这种情况下具有误导性,因为它设置了ScaledLayout的比例(这与ScaledLayout调整大小时的子缩放功能无关-他们可以在TPanel或任何其他容器中设置比例)。

另一个令人困惑的方面是,在控件上对齐:=缩放与缩放无关,而是与子控件在父控件的相对位置和相对大小保持不变时调整大小时的大小有关(即它们不会缩放其显示,而是实际调整大小)。

更新:

我发现当使用上面的策略放大/缩小时,我会得到与预期相反的滚动条行为。我意识到这与外部面板没有调整大小有关,而只是设置了它的比例(请注意,因为在我的示例中是在滚动框中,所以我将其设置为Align:=Center,而不是像在表单中那样设置为Align:=Client )

因此,我没有使用外部面板,而是使用了另一个TScaleLayout,因为它有额外有用的属性OriginalWidth/OriginalHeight,可以保持控件的原始大小。这是根据放大/缩小时应用的新比例计算新大小所必需的(而不是像Embarcadero的示例中误导性地建议的那样使用其scale属性,除了Unit/-Unit axes Scale值以支持负缩放也称为轴翻转):

代码语言:javascript
复制
procedure TForm2.FormCreate(Sender: TObject);
begin
  BeginUpdate;
  Zoomer.Align := TAlignLayout.Center; //at design mode we have it set to TAlignLayout.Client
  UpdateZoomFromTrackbars;
  EndUpdate;
end;

procedure TForm2.SetZoom(const Value: Single);
begin
  SetZoom(Value, Value);
end;

procedure TForm2.SetZoom(const ValueX, ValueY: Single);
begin
  if (ValueX <> 0) and (ValueY <>0) then //FMX has bug where Scale won't work anymore if set to 0
    begin
    BeginUpdate;

    //update track bars
    trackZoomX.BeginUpdate; trackZoomX.ValueRange.Value := ValueX; trackZoomX.EndUpdate;
    trackZoomY.BeginUpdate; trackZoomY.ValueRange.Value := ValueY; trackZoomY.EndUpdate;

    with Zoomer do
    begin
      Size.Size := TSizeF.Create(OriginalWidth * abs(ValueX), OriginalHeight * abs(ValueY)); //don't use Scale to resize (won't work well here), ScaledLayout scales its contents automatically
      Scale.Point := TPointF.Create(sign(ValueX), sign(ValueY));
    end;
    //ScrollBox.InvalidateContentSize;

    EndUpdate;
    end;
end;

procedure TForm2.UpdateZoomFromTrackbars;
begin
  SetZoom(trackZoomX.Value, trackZoomY.Value);
end;

procedure TForm2.ScrollBoxResize(Sender: TObject);
begin
  var scrollBoxSize := ScrollBox.Size.Size;
  if not scrollBoxSize.IsZero then
    begin
    BeginUpdate;
    Zoomer.Size.Size := scrollBoxSize;
    with Zoomer do
    begin
      OriginalWidth := Width;
      OriginalHeight := Height;
    end;
    UpdateZoomFromTrackbars;
    //ScrollBox.InvalidateContentSize;
    EndUpdate;
    end;
end;

procedure TForm2.trackZoomXTracking(Sender: TObject);
begin
  if trackZoomX.IsUpdating then exit;

  BeginUpdate;
  if switchSyncAxes.IsChecked then
    trackZoomY.Value := trackZoomX.Value;

  UpdateZoomFromTrackbars;
  EndUpdate;
end;

procedure TForm2.trackZoomYTracking(Sender: TObject);
begin
  if trackZoomY.IsUpdating then exit;

  BeginUpdate;
  if switchSyncAxes.IsChecked then
    trackZoomX.Value := trackZoomY.Value;

  UpdateZoomFromTrackbars;
  EndUpdate;
end;
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15230284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档