2011-11-18 82 views
2

我在内存中定义了一个数组32位ARGB值的图像。我想要得到一个DC来绘制它,然后在相同的数组中得到结果。图像不会通过blitting显示在屏幕上。如何在原生win32中将现有的内存缓冲区换成DC?

这是可能的,而不复制周围的图像数据吗?

当我看MSDN的的CreateDC()页面,它需要一个驱动程序名称和设备。但是直流并不一定要与任何设备兼容。此外,如果显示器以16位或32位色彩深度运行,我不希望结果不同。我认为我需要与我的内存布局兼容的DC,与某些设备不兼容。我怎样才能做到这一点?

THX 马克

+0

这是由''覆盖好。使用Bitmap(int,int,int,PixelFormat,BYTE *)构造函数创建位图。使用Graphics :: FromImage()获取的Graphics对象进行绘制。 –

回答

1

你需要创建一个位图和select that bitmap into your DC。位图是使用您的内存缓冲区创建的。

Ue的任何CreateBitmap(取决于设备)或CreateDIBitmap(设备无关,这是我建议,特别是因为你不希望它影响的显示颜色深度 - 这意味着它应该是与设备无关)两者都有参数指向现有的内存缓冲区。对于CreateDIBitmap,例如,你需要通过CBM_INIT标志,然后将指针传递到您的缓冲区为lpbInit参数。您还需要传入描述位图格式的BITMAPINFO结构。

CreateBitmap让你做同样的事情,在稍微简单的方式,但该位图(即取决于设备)是不够灵活使用。

(您可能需要使用CreateCompatibleDC过的CreateDC,顺便说一句 - 依赖,但通常你以后)

有关使用DC和位图的更多信息,请阅读像this article。 (我不确定你的问题对你有多熟悉,或者你对它们或者一般的GDI编程有多熟悉。)

+0

如果我理解正确,CreateDIBitmap会将您的内存缓冲区中的位图数据复制到新分配的内存中,并将HBITMAP句柄返回给副本。我和OP一样,正在寻找一种方法来获得一个直接在现有内存缓冲区而不是其副本上的DC。有任何想法吗? – JBentley

2

CreateDIBSection让你指定位图存储器的存储位置。但是,它需要位于内存映射部分。

+0

什么是内存映射部分?另外,根据我对David的回答的评论,“CreateDIBSection”可以用来获取HBITMAP句柄到现有的内存缓冲区,还是将数据复制到新的内存位置? – JBentley

+1

CreateFileMapping创建内存映射节。您可以将该部分传递给CreateDIBSection,它将使用该内存(通过引用,而不是副本)。 –

+0

谢谢。我在别处遇到类似的建议,但是我发现'CreateFileMapping'文档很难理解 - 它似乎期望一个文件名,但数据在内存中,而不是在文件中。如何在没有文件的情况下使用该功能? – JBentley

相关问题