我刚开始使用win32 GDI编程,很难找到好的参考资料。我有一个简单的应用程序,通过执行以下操作捕获屏幕:
ojit_pre
我正在捕获一个兼容的位图,在我的机器上是32位的。使用相同/相似的调用如何在8位中捕获屏幕?16位怎么样?

最佳答案

使用CreateDIBSection创建8bpp位图,并将BitBlt添加到该位图上。
填充BITMAPINFO结构将是有趣的。不能使用普通的BITMAPINFO结构,因为它只为单个调色板项分配空间,对于8bpp图像,您将需要完整的256个项。
如果您想作弊,可以使用匿名联合来声明一个有足够空间供其调色板使用的BITMAPINFO。

union
{
  BITMAPINFO bmi;
  struct {
    BITMAPINFOHEADER bmih;
    RGBQUAD extra[256];
  } dummy;
};

bmi.bmiHeader.biSize = sizeof (bmi.bmiHeader);
bmi.biBitCount = 8;
// and so on.

至于要在颜色表中初始化的值。。。当GDI不在8bpp模式下时,我想不出一个简单的方法来从GDI获得默认的8bpp调色板。我怀疑CreateHalftonePalette不会在非调色板设备上做任何事情。

10-08 15:10