我怎样才能让我的表单更顺畅地调整大小?

Posted

技术标签:

【中文标题】我怎样才能让我的表单更顺畅地调整大小?【英文标题】:How can I make my form resize more smoothly? 【发布时间】:2010-11-30 01:32:57 【问题描述】:

在调整包含许多控件的表单大小时,由于闪烁,表单看起来很糟糕。有哪些技巧可以让表单大小调整更顺畅?

【问题讨论】:

【参考方案1】:
procedure TForm1.WMEnterSizeMove(var Message:TWMMove);
begin
  Self.DisableAlign;
end;

procedure TForm1.WMExitSizeMove(var Message:TWMMove);
begin
  Self.EnableAlign;
end;

【讨论】:

这在防止闪烁方面很好,但它似乎也完全防止了对齐。我在启用对齐后添加了一个 Invalidate 调用:不完美,因为您无法确切看到表单调整大小会产生什么影响,但至少它消除了复杂多面板表单上的所有闪烁。 过程 WMEnterSizeMove(var Message:TWMMove);消息 WM_ENTERSIZEMOVE;过程 WMExitSizeMove(var Message:TWMMove);消息 WM_EXITSIZEMOVE;不会触发适当的事件。实际上忘了说它是一个框架而不是一个表格,但我猜它会是一样的。【参考方案2】:

尝试使用 WM_SETREDRAW (not LockWindowUpdate)。

你也可以看看DeferWindowPos。

【讨论】:

+1,这两个都是非常好的建议。不过,这些可能对使用对齐、嵌套控件等的复杂 VCL 表单没有帮助。 DeferWindowPos() 值得在 OnResize 处理程序中进行手动放置测试。【参考方案3】:

复杂的表单通常由嵌套的面板组成,重绘过程可能会导致闪烁。如果您的项目属于这种情况,则有两个简单的解决方案可能会有所帮助:

    禁用面板上的属性 FullRepaint。 在您的表单上启用属性 DoubleBuffered。您不会在对象检查器中找到此属性,因此请将 DoubleBuffered := true; 放入 FormCreate。

【讨论】:

请注意,DoubleBuffered 以较少的闪烁换取较慢的更新速度,这种效果在大屏幕上可能会很明显,在大屏幕上调整大小可能会变得“跳跃”。 DoubleBuffered 基本上让您的应用在 Citrix 和终端服务器上毫无用处。 >>> "DoubleBuffered 基本上让您的应用在 Citrix 和终端服务器上无用" 你能具体说明原因吗? @Alexander:查看***.com/questions/1408664/…的答案 双缓冲:见 delphi3000.com/articles/article_1537.asp?SK= 和 ***.com/questions/1444830/…【参考方案4】:

我的解决方法如下:

    在表单的 'OnResize' 事件中,有一个例程来隐藏所有子控件,然后启动一个时间约为 500 毫秒的计时器。 当计时器触发时,禁用它,然后将所有子控件设置为可见。

通过玩这个活动,你会得到一个在你调整大小时会变成空白的表单,但当你“放手”时会整齐地填充自己。

布里

【讨论】:

我想你会发现处理进入/退出大小移动消息(在我上面的评论中提到的修改)会产生更好的用户体验,因为你至少可以看到(未调整大小的)表单,而你调整窗口大小。【参考方案5】:

我通过为每个父级对齐不超过 1 个非alClient 组件来避免闪烁,始终与alClient(例如TPanel)配对以包含所有其他组件。将它们分组到无边框的面板中。

假设您要对齐三个东西:alLeftalTopalClient 用于主视图。 不要这样做: Form alTop alLeft alClient // your main view

而是将这些嵌入如下: Form alTop alClient // panel to avoid flicker alLeft alClient // your main view

嵌入多个 alTop 元素的情况相同。

【讨论】:

以上是关于我怎样才能让我的表单更顺畅地调整大小?的主要内容,如果未能解决你的问题,请参考以下文章

Mac 窗口不会让我调整到更小,可能是限制?

如何在窗体调整大小时调整datagridview控件的大小

怎样让XP系统记住上次打开窗口的大小和位置?

调整大小后如何保持表单居中在屏幕中间

更改方向后iOS8无法重新调整模态表单的大小

在没有 JS 的情况下调整溢出 div 内的表格大小