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

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

【问题讨论】:

    标签: delphi forms resize flicker smooth


    【解决方案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】:

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

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

    【讨论】:

    【解决方案4】:

    我的解决方法如下:

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

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

    布里

    【讨论】:

    • 我想你会发现处理进入/退出大小移动消息(在我上面的评论中提到的修改)会产生更好的用户体验,因为你至少可以看到(未调整大小的)表单,而你调整窗口大小。
    【解决方案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 元素的情况相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多