2010-06-25 50 views
2

我想創建一個簡單的視頻渲染器來玩耍,並做一些事情,比如創建一個僅僅爲了娛樂而使用的移動操作系統。我的父親告訴我,在第一臺電腦中,你會編輯一個特定的內存地址,屏幕會更新。我想在Windows中的窗口中模擬這個。有沒有什麼辦法可以用C#做​​到這一點?如何編輯窗口中的單個像素?

回答

2

這是一個全功能的主題,超出了範圍(它不適合,不是我不會漫不經心的幾個小時:-)這個答案..但這應該讓你開始用C#繪圖#

http://www.geekpedia.com/tutorial50_Drawing-with-Csharp.html

事情已經從直接存儲器manipulation..although一切仍然穩居像素昔日走近一點。

編輯:哦,如果遇到閃爍問題並卡住,請給我一條線,我會給你發送一個DoubleBuffered面板來繪製。

+0

在WinForms> v2.0中,可以使用DoubleBuffered屬性的設置打開雙緩衝:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered。 ASPX。 – codekaizen 2010-06-25 19:39:06

+0

但不在面板或任何託管控件上:-D繼續嘗試它..因爲DoubleBuffered屬性是受保護的值,所以它主動忽略您的嘗試。 – Caladain 2010-06-25 19:49:32

+0

對。我想我忘記了,因爲只是子類化面板並在構造函數中設置該屬性非常簡單。無論如何,DoubleBuffered只是將控件樣式設置爲ControlStyles.OptimizedDoubleBuffer的快捷方式| ControlStyles.AllPaintingInWmPaint,所以也可以使用該值調用SetStyle()。 – codekaizen 2010-06-25 20:23:32

4

這是用來做的,因爲你可以直接訪問視頻緩衝區。這在當今的系統中通常不可用,因爲視頻內存由視頻驅動程序和操作系統管理。此外,視頻內存緩衝區和顯示的內容之間確實沒有1:1映射。有了這麼多的內存,就有可能擁有多個緩衝區並在它們之間切換。當前顯示的緩衝區稱爲「前端緩衝區」,其他未顯示的緩衝區稱爲「後端緩衝區」(更多信息,請參閱http://en.wikipedia.org/wiki/Multiple_buffering)。我們通常寫回緩衝區,然後讓視頻系統爲我們更新前端緩衝區。這會提供平穩的更新,因爲視頻驅動程序會將更新與監視器的掃描速率同步。

要使用C#寫回緩衝區,我最喜歡的技術是使用WPF WritableBitmap。我還使用System.Drawing.Bitmap通過LockBits向其寫入像素來更新屏幕。

+0

儘管我確信這是一個更好的解決方案,但我並不完全理解代碼並知道自己,我會搞砸大時間與非託管代碼:D​​ – 2010-06-26 04:00:46

+0

@丹尼爾 - 這不是非託管代碼...不安全,當然,但沒有任何其他方式讓它變快。你可以使用GetPixel/SetPixel,但你不能有快。 ;) – codekaizen 2010-06-26 06:00:43