2009-09-21 50 views

回答

13
procedure TForm1.WMEnterSizeMove(var Message:TWMMove); 
begin 
    Self.DisableAlign; 
end; 

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

防止閃爍很好,但它似乎也完全阻止了對齊。在啓用對齊後,我添加了一個Invalidate調用:不完美,因爲您無法確切地看到調整窗體大小會產生什麼效果,但至少可以消除複雜多面板窗體上的所有閃爍。 – frogb 2009-09-23 09:08:09

+0

procedure WMEnterSizeMove(var Message:TWMMove);消息WM_ENTERSIZEMOVE; 程序WMExitSizeMove(var Message:TWMMove);消息WM_EXITSIZEMOVE; 不會觸發aproporiate事件。其實忘了提到它是一個框架,而不是一個表格,但我猜它會是一樣的。 – zz1433 2009-09-23 13:41:45

4

嘗試使用WM_SETREDRAW(not LockWindowUpdate)。

您可能還會看看DeferWindowPos

+1

+1,兩者都非常好的建議本身。儘管如此,這些可能無助於使用對齊,嵌套控件等的複雜VCL表單。 'DeferWindowPos()'值得在'OnResize'處理程序中進行手動放置測試。 – mghie 2009-09-21 13:14:01

4

複雜的形式通常由嵌套面板組成,重繪過程可能會導致閃爍。如果這是你的項目的情況下,有兩種簡單的解決方案,可能幫助:

  1. 禁用你的面板屬性FullRepaint
  2. 在您的表單上啓用屬性DoubleBuffered。您不會在對象檢查器上找到此屬性,因此請在FormCreate中放入DoubleBuffered := true;
+1

請注意,'DoubleBuffered'交易的閃爍較少,更新速度較慢,這種效果在大屏幕上可能會很明顯,其中調整大小可能會隨着窗口大小變得「跳躍」。 – mghie 2009-09-21 13:15:57

+1

DoubleBuffered基本上使您的應用在Citrix和終端服務器上無用。 – 2009-09-21 16:24:12

+1

>>>「DoubleBuffered基本上使您的應用程序在Citrix和終端服務器上無用」 您可以指定原因嗎? – Alex 2009-09-21 17:53:48

1

我解決此得到如下:

  1. 在窗體的「onResize受到」事件,有一個程序可以隱藏所有的子控件,然後啓動一個定時器約500毫秒蜱。
  2. 定時器觸發時,將其禁用,然後將所有子控件設置爲可見。

通過玩這個活動,你會得到一個空白的形式,而你正在調整它,但是當你「放手」的時候它會自然地填充自己。

業務收益指數

+1

我認爲您會發現處理輸入/退出大小移動消息(以及上面我的評論中所述的修改)會產生更好的用戶體驗,因爲在調整窗口大小時至少可以看到(未定義的)窗體。 – frogb 2009-09-23 09:11:57

0

避免閃爍通過對準每個父不超過非alClient部件,始終以alClient(例如TPanel)來包含所有其他組件配對。將它們組合在無邊界的面板中。

假設您想要對齊三件事:alLeftalTopalClient爲主視圖。 不這樣做: Form alTop alLeft alClient // your main view

但不是嵌入這些如下: Form alTop alClient // panel to avoid flicker alLeft alClient // your main view

嵌入幾個alTop元素同樣的故事。

相關問題