簡體   English   中英

防止在C#中重新繪制控件?

[英]Prevent controls from being redrawn in C#?

我有一個包含大量運行時生成的控件(圖像,按鈕,面板,...)的表單,大約100個控件(我正在制作卡片匹配游戲,因此表單中有很多控件)。

我將生成代碼放入構造函數中,每次應用程序啟動時,大約需要3-5秒才能完全加載所有控件。

如果我將另一個窗口置於頂部然后再返回到我的應用程序,則將再次重新繪制控件。

如何防止重繪控件? 如果您不介意,請在C#中給我一個簡單的例子。

任何幫助表示贊賞!

我發現這篇文章通過調用WIN API SET_MESSAGE函數來解釋如何在.NET中執行此操作,以便為您不想更新的控件設置WM_SETREDRAW標志。 雖然您可以阻止某些控件更新,但您確定無法通過減少頁面上的控件數來解決此問題嗎? 100控件似乎很多,可能表明您需要有多個視圖。

請享用!

我的建議是將表單用作繪圖表面,並將卡片位圖直接繪制到表單上。 這不難做到。

您可以向表單Paint事件添加處理程序,該事件將為您提供帶有Graphics對象的參數。 使用graphics.DrawImageUnscaled在您想要的位置繪制每張卡片。

這將使應用程序更快。

防止重繪控件是毫無意義的。 你會得到一個應該出現控件的洞,你的用戶不會對那個洞有任何用處。

它只是因為你有太多的控件而慢慢重繪。 您只能通過使用較少的控件來更快地重繪。 或者通過使用可以在一個窗口中顯示多個項目的控件,如ListBox,ListView,TreeView,DataGridView。

請注意,您的特定問題已在Vista和Windows 7中修復.Aero主題使用窗口的屏幕外緩沖。 這意味着當窗口被另一個窗口遮擋時,窗口不再需要重新繪制自己。 但是,當用戶最小化窗口並恢復窗口時,您仍會得到緩慢的重繪。

您可能需要考慮使用單個數據表控件。 ListView(或像ObjectListView之類的東西)可能是個不錯的選擇。

如果您的數據實際上不是列表/表,則應將控件拆分為單獨的選項卡頁,這樣可以提高性能和可用性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM