2010-10-14 63 views
1

好的,我相信你們中的一些人已經知道我的頭銜發生了什麼,因爲我得到這是非常常見的問題。但我的問題其實更深一些,所以請耐心等待我。C#繪圖消失(實際上是更多的系統問題)

我所有的編程我在過去幾年所做均彙編,主要是8051和AVR作爲WEEL在C,同時也爲微控制器。 HW比SW更令我着迷。但我也對操作系統及其API等功能着迷。幾天後,我告訴我的朋友說,如果你有數學解析器,創建一個非常簡單的程序來繪製函數圖應該很容易。他不相信我,所以我試圖做出一個。

我決定用C#去,即使我不知道OOP。但我想,如果我得到的一切都在一個按鈕動作完成它會像好老C.

所以我得到的數學解析器的工作,而且比開始使用Pen對象繪製。我的第一個嘗試是繪製簡單的線條。閱讀完一篇教程之後,我創建了一個簡單的座標軸。

但是,比我注意到一些奇怪的事情,當我簡化了我的程序,繪製消失。這讓我想起了關於這個所有繪圖是如何在系統級完成的。

我認爲系統保持活動窗口的圖像,直到其更改。所以當你移動你的窗戶時,它只會改變它在famebuffer中的位置。當你最小化它時,它會在drawind中跳到framebuffer。

但我看到它不是這樣的。所以,請你能告訴我爲什麼會發生這種情況?我可以在許多教程中閱讀如何防止它,但我想知道更多原因。更多的是,這是由於系統API的工作原理,或者因爲C#繪圖類的工作原理。

此外,這使我想到在C#和.NET庫是什麼功能那只是呼籲WinAPI的函數,它的工作原理完全一樣的方式,以及如何許多圖書館和功能做更多的事情。就像在GDI中沒有繪製線的功能一樣,並且只能繪製點,那麼C#會添加從此點繪製線的功能。我希望你能理解我。

謝謝。

+1

我猜它來自當內存是昂貴的時間。從歷史的角度來看,這可能是一個更好的主意,當應用程序被遮擋時,應用程序會重新繪製窗口,而不是將每個窗口的內容的副本保存在單獨的內存緩衝區中,以備需要時使用。如果窗口的內容大部分是背景,或者圖像是通過繪製基元而不是柵格來構建的,則尤其如此。 – 2010-10-14 22:21:51

回答

5

這是它在Win32 API中的工作原理。當窗口最小化時,它所佔用的區域變得「無效」,所以windows系統知道屏幕的這個區域需要重繪。這導致WM_PAINT消息被髮送到負責繪製該區域的窗口程序。您可以閱讀更多關於使客戶區(您的程序負責的區域)無效的信息here

如果您對這些東西真正感興趣並希望深入瞭解系統如何處理繪圖(以及其他事情,如Windows消息),我建議您閱讀更多關於Win32 API的內容,例如從Charles Petzold的經典作品Programming Windows開始。

0

如果要繪圖,請使用Microsoft圖表控件。 http://www.microsoft.com/downloads/en/details.aspx?FamilyId=130F7986-BF49-4FE5-9CA8-910AE6EA442C&displaylang=en

或ZedGraph http://zedgraph.org/

如果你想繪製自己:該窗口重繪時您調整。
您需要在重繪事件或任何被調用的事件上重繪您的繪圖。
這是完全正常的。

另外,使用.NET 4.0,否則,除非刪除(重繪)所有內容,否則不可能刪除以編程方式繪製的任何內容。

1

在Windows中(在Vista/DWM和MIL之前),應用程序負責繪製自己的GUI。也就是說,當操作系統告訴應用程序這樣做時,應用程序必須繪製自己的GUI。調整大小或移動表單將觸發繪畫事件。這是它在User32 + GDI中的工作原理。也就是說,應用程序繪製自己的像素。

然而,WPF應用程序將使用媒體集成層(Vista和Windows 7),「mil核心」負責繪製應用程序的可視化樹。在這種情況下,操作系統負責渲染,但應用程序負責渲染它的內容。

2

你的繪畫並沒有消失,它根本就不存在。與我同行:

  • 要在Windows窗口上繪圖,您必須響應WM_PAINT消息指示的回調。這是在Win 3.11,現在是如此。
  • 借鑑點擊按鈕是在浪費時間,因爲一個表單/控制/窗口重畫會畫背景顏色有
  • 移動從按鈕事件處理函數相同的代碼來OnPaint - 當然,處理在語義
  • 的差異
  • 窗口不會保存您的屏幕緩衝區的副本 - 繪圖 - 所以你必須保存在某個地方,或繪製在即時