使用多個控件調整窗體大小時,窗體由於閃爍而看起來很糟糕。有什麼提示可以更平滑地調整窗體大小?如何讓我的表單更順利地調整大小?
回答
procedure TForm1.WMEnterSizeMove(var Message:TWMMove);
begin
Self.DisableAlign;
end;
procedure TForm1.WMExitSizeMove(var Message:TWMMove);
begin
Self.EnableAlign;
end;
嘗試使用WM_SETREDRAW(not LockWindowUpdate)。
您可能還會看看DeferWindowPos。
+1,兩者都非常好的建議本身。儘管如此,這些可能無助於使用對齊,嵌套控件等的複雜VCL表單。 'DeferWindowPos()'值得在'OnResize'處理程序中進行手動放置測試。 – mghie 2009-09-21 13:14:01
複雜的形式通常由嵌套面板組成,重繪過程可能會導致閃爍。如果這是你的項目的情況下,有兩種簡單的解決方案,可能幫助:
- 禁用你的面板屬性
FullRepaint
。 - 在您的表單上啓用屬性
DoubleBuffered
。您不會在對象檢查器上找到此屬性,因此請在FormCreate中放入DoubleBuffered := true;
。
我解決此得到如下:
- 在窗體的「onResize受到」事件,有一個程序可以隱藏所有的子控件,然後啓動一個定時器約500毫秒蜱。
- 定時器觸發時,將其禁用,然後將所有子控件設置爲可見。
通過玩這個活動,你會得到一個空白的形式,而你正在調整它,但是當你「放手」的時候它會自然地填充自己。
業務收益指數
我認爲您會發現處理輸入/退出大小移動消息(以及上面我的評論中所述的修改)會產生更好的用戶體驗,因爲在調整窗口大小時至少可以看到(未定義的)窗體。 – frogb 2009-09-23 09:11:57
避免閃爍通過對準每個父不超過非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
元素同樣的故事。
- 1. MKOverlay不能順利調整大小
- 2. 如何讓UILabel更好地調整大小?
- 3. 順利讓jQuery中的div更大
- 4. 調整調整大小的地址表單
- 5. 如何讓我的幻燈片放大窗口調整大小?
- 6. 窗口大小調整時,如何調整表單元素的大小?
- 7. 的Java SWT調整大小TRIPPLE SashForm不斷中間順利
- 8. 如何讓CALayer調整大小?
- 9. 如何讓Windows :: Forms :: GroupBox調整大小?
- 10. 如何讓地圖正確使用調整大小的容器?
- 11. 在調整div大小時順利移動子元素
- 12. Windows調整大小跳躍,而不是順利
- 13. 股利可調整大小的angular.js
- 14. 如何讓我的inputAccessoryView在旋轉設備時調整大小?
- 15. 如何讓我的div調整大小處理程序dragg?
- 16. 如何讓我的影片剪輯根據屏幕大小調整大小?
- 17. 如何調整菜單欄的大小
- 18. 如何在調整容器大小時順利重新定位子元素?
- 19. 如何動態地重新調整Jquery大小的大小
- 20. 如何在Python中更快地調整圖像的大小
- 21. 簡單的Google地圖應用 - 如何調整容器大小?
- 22. 如何讓表格根據其容器調整其大小
- 23. 如何讓表格不能調整大小?
- 24. UICollectionViewController如何調整單元格大小?
- 25. 如何在調整列大小時調整dxDataGrid的大小
- 26. 如何在調整幀大小時調整我的wxGrid?
- 27. 當窗口調整大小時,如何讓我的高圖減小尺寸
- 28. 如何使tkintertable表可調整大小
- 29. 如何調整大小表視圖
- 30. 禁用表單調整大小
防止閃爍很好,但它似乎也完全阻止了對齊。在啓用對齊後,我添加了一個Invalidate調用:不完美,因爲您無法確切地看到調整窗體大小會產生什麼效果,但至少可以消除複雜多面板窗體上的所有閃爍。 – frogb 2009-09-23 09:08:09
procedure WMEnterSizeMove(var Message:TWMMove);消息WM_ENTERSIZEMOVE; 程序WMExitSizeMove(var Message:TWMMove);消息WM_EXITSIZEMOVE; 不會觸發aproporiate事件。其實忘了提到它是一個框架,而不是一個表格,但我猜它會是一樣的。 – zz1433 2009-09-23 13:41:45