2015-06-28 35 views
2

我是一位舊的delphi程序員,我習慣於創建對象並在整個時間內使用它們來實現高效的內存使用。但在C#(也許是所有的教程,我見過),你正在創造的東西與new每次(感謝垃圾回收!!,讓我做的編碼)..我是否需要繼續創建一個圖形對象

無論如何,我想創建一個有很多繪圖的設計軟件。 我的問題是:是否必須創建一個圖形對象,或使用e.Graphics每個繪畫事件..因爲當我創建一個圖形對象,然後調整我繪製的控件的大小時,我創建的圖形對象,有剪輯的問題,只有老繪製的矩形區域..

感謝

+1

請始終使用提供的「Paint」方法。 CreateGraphics是一條確定的災難之路。 – DonBoitnott

+1

好的感謝您的快速回答。我保留一個緩衝位圖來繪製它,如果事情發生像調整大小或繪製額外的東西;我重繪了一個由它創建的圖形對象,然後刷新它到一個控制組件的表面,其中的圖形使用 graphics.DrawImage(bitmapB,0,0); 現在我將重新設計我的管道,並使用OnPaint事件的e.graphic對象來刷新..再次感謝。你真的很有幫助 –

回答

4

如果要在表面上畫畫請始終使用Paint事件中的Graphics對象!

如果你想繪製一個Bitmap你創建一個Graphics對象,並使用它,只要你想。

要使Paint事件生效,您需要收集圖形操作List中的所有圖形;所以你會想創建一個好的類來存儲所有需要的參數。

在你的情況下,你可能想要考慮一種混合的方法:舊的圖形動作繪製成位圖, BackgroundImageImage您的控制

當前/正在進行的繪圖在表面上完成。這相當於使用位圖作爲緩存,所以你不必重新繪製大量的行動,在每一個變化不大等

此密切相關的undo/redo實現。您可以設置一個限制,然後將這些繪製到Btimap中,然後繪製到表面上。

PS:您還應該重新考慮您的GC態度。這是簡單,高效和周圍的祝福。 (並且,是的,我已經完成了德爾福的TP &的分享,當他們負擔的時候就回來了。) - 是的,我們做了編碼,但GC不是關於編碼,而是關於管家。鏜最好..(你可以總是設計,以避免它,但不與一個Windows系統中的Graphics對象。)

2

對每個類別的一般規則,一旦實現IDisposable是Dispose()方法是,越好。確保你知道using(...){}聲明。

對於在WinForms(GDI +)中繪圖,最好的做法是使用PaintEventArgs中的Graphics對象。並且因爲你沒有創建那個,請執行而不是處理()它。不要把它藏起來。

7

緩存對象是有意義的,當對象是昂貴的創建,便宜的存儲和相對簡單保持更新。圖形對象是在沒有獨特的這些條件爲真:

  • 這是很便宜的創建,需要超過一微秒好少。
  • 存儲非常昂貴,底層設備上下文存儲在會話的桌面堆中。可以存儲的對象數量很少,不超過65535個。會話中運行的所有程序共享該堆。
  • 保持更新非常困難,事情發生在背後,使設備環境無效。像用戶或您的程序更改窗口大小,使Graphics.ClipBounds屬性無效。您正在浪費使用正確的Graphics對象的機會,該對象是在Paint事件處理程序中傳遞給您的。特別是使用雙緩衝時的錯誤工廠。

緩存圖形對象是一個錯誤。

0

我不得不完全不同意這裏的其他更有經驗的成員,他們說這沒什麼大不了的,或者實際上反覆重新創建Graphics對象。

HDC是一個指向HDC__結構的指針,它是一個具有一個成員「int unused」的結構。每次繪製需要完成時創建另一個實例/對象是絕對浪費和愚蠢的。 HDC不大,它可能是4或8字節,它指向的結構幾乎在所有情況下都是4字節。此外,就一個人而言,在開關之前的WndProc()的開始處使用「static」關鍵字來製作圖形對象並無幫助,因爲唯一的方法是給圖形對象一個設備上下文或句柄是通過調用它的構造函數來實現的,因此「靜態」不會讓您無法一次又一次地創建它。

最重要的是,Microsoft建議您創建一個HDC指針,並將其分配給PAINTSTRUCT已經具有的每個單個WM_PAINT消息發送的相同值。

對不起,但我認爲WinAPI非常糟糕。舉一個例子,我花了整整一天的時間研究如何創建一個WS_EX_LAYERED窗口,以發現爲了啓用Win 8功能,必須使用操作系統的ID號將XML代碼添加到清單中。太可笑了。

相關問題