2010-06-25 49 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