我怎样才能让我的表单更顺畅地调整大小?
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
)配对以包含所有其他组件。将它们分组到无边框的面板中。
假设您要对齐三个东西:alLeft
、alTop
和 alClient
用于主视图。
不要这样做:
Form
alTop
alLeft
alClient // your main view
而是将这些嵌入如下:
Form
alTop
alClient // panel to avoid flicker
alLeft
alClient // your main view
嵌入多个 alTop
元素的情况相同。
【讨论】:
以上是关于我怎样才能让我的表单更顺畅地调整大小?的主要内容,如果未能解决你的问题,请参考以下文章