Delphi 在窗体上重新定位图像按比例调整大小

Delphi 在窗体上重新定位图像按比例调整大小,delphi,forms,scaling,resize,Delphi,Forms,Scaling,Resize,我有一张Delphi表格,上面有TImages。事实上,这是一个带有“图标”(TImages)的“假”桌面 当用户调整窗体大小(例如,缩放或最大化窗体)时,窗体上的图标应按比例对齐 现在,我正在用这些图像做类似的事情: ImageX.Left:=Round(ImageX.Left * (Width / OldWidth)); ImageX.Top:=Round(ImageX.Top * (Height / OldHeight)); 现在这是好的,只要我开始使最大化的形式变小 在这种情况下,最右

我有一张Delphi表格,上面有TImages。事实上,这是一个带有“图标”(TImages)的“假”桌面

当用户调整窗体大小(例如,缩放或最大化窗体)时,窗体上的图标应按比例对齐

现在,我正在用这些图像做类似的事情:

ImageX.Left:=Round(ImageX.Left * (Width / OldWidth));
ImageX.Top:=Round(ImageX.Top * (Height / OldHeight));
现在这是好的,只要我开始使最大化的形式变小

在这种情况下,最右边的图像部分被窗体的边框剪切(它们离开窗体的客户区)

如果我重新定位这些图像以适应客户端区域,那么图标的位置在缩小到最大大小时会发生扭曲

有没有更好的算法/修复方案


谢谢

首先,如果只移动图像,并且不缩放图像,则无法获得正确缩放的桌面。通过移动图像的中点,而不是图像的左上角,可以做得稍微好一点。它仍然不是完美的,但它会工作得更好。当然,现在图像将从四面裁剪,不仅是底部和右侧,而且至少是对称的:-)

其次,由于不断覆盖“原始”值(ImageX的顶部和左侧坐标),因此会出现累积舍入误差。最好将原始值存储在某种集合或数组中,并根据原始值而不是以前的值设置新位置

大概是这样的:

ImageX.Left:=Round(ImageX_OriginalLeft * (Width / Original_Width));

我认为你错过了发布有价值的信息来帮助你实现目标。例如,图标是按定义良好的行/列组织的,还是在表单中的任何位置浮动?是否要防止图标重叠?