多年来,我一直在使用VCL窗体应用程序布局策略,该策略自动调整主窗体上的窗体控件的大小。用户可以根据需要最大化或调整应用程序的大小,具有与按钮布局、图表等相同的通用外观和感觉。为此,我编写了基于窗体的FormResize事件操作子控件的BoundsRect的代码,这种简单的技术保留了文本的字体大小和纵横比(例如按钮)。我还有更简单的代码来增大和减小字体大小,以跟踪主控件的扩展和缩小按钮/标签的大小,但是许多控件,例如TChart,在最小化应用程序时会留下可读但很小的字体-我对此非常满意。
我想迁移我的布局来使用FireMonkey,它有TScaledLayout,当你在表单中对齐它时,alClient会整齐地调整它包含的所有控件的大小。不幸的是,调整大小也扩展到了所有的文本字体,这真的是不可取的。将TScaledLayout设置为alFit会保持内容的原始纵横比,但可能会导致顶部或侧面的空白填充以实现此目的。
有没有什么办法可以在TScaledLayout操作下“关闭”所有字体的大小调整?我已经研究了FireMonkey Layouts Strategies中的信息,也尝试了它的每一个大大增加的“对齐”设置,但都没有成功。当在不同的显示设备之间移动时,全屏部署肯定需要这种能力吗?
发布于 2021-10-26 10:52:36
可以尝试以下策略:
中对面板进行调整
在我的例子中,我想在TScrollBox布局中创建一个可缩放的面板(保留宽高比),因此我在该面板上使用Align:=Center,并以编程方式设置其缩放比例。
请注意,Embarcadero的ScaledLayout示例在这种情况下具有误导性,因为它设置了ScaledLayout的比例(这与ScaledLayout调整大小时的子缩放功能无关-他们可以在TPanel或任何其他容器中设置比例)。
另一个令人困惑的方面是,在控件上对齐:=缩放与缩放无关,而是与子控件在父控件的相对位置和相对大小保持不变时调整大小时的大小有关(即它们不会缩放其显示,而是实际调整大小)。
更新:
我发现当使用上面的策略放大/缩小时,我会得到与预期相反的滚动条行为。我意识到这与外部面板没有调整大小有关,而只是设置了它的比例(请注意,因为在我的示例中是在滚动框中,所以我将其设置为Align:=Center,而不是像在表单中那样设置为Align:=Client )
因此,我没有使用外部面板,而是使用了另一个TScaleLayout,因为它有额外有用的属性OriginalWidth/OriginalHeight,可以保持控件的原始大小。这是根据放大/缩小时应用的新比例计算新大小所必需的(而不是像Embarcadero的示例中误导性地建议的那样使用其scale属性,除了Unit/-Unit axes Scale值以支持负缩放也称为轴翻转):
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;https://stackoverflow.com/questions/15230284
复制相似问题