许多论坛提供以下代码,说明如何将屏幕像素的副本放入数组:
char* Pixels = NULL;
HDC MemDC = CreateCompatibleDC(Context);
HBITMAP Section = CreateDIBSection(Context, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
DeleteObject(SelectObject(MemDC, Section));
BitBlt(MemDC, 0, 0, Width, Height, Context, Area.left, Area.top, SRCCOPY);
DeleteDC(MemDC);
std::fstream hFile(FilePath, std::ios::out | std::ios::binary);
if (hFile.is_open())
{
hFile.write((char*)&Header, sizeof(Header));
hFile.write((char*)&Info.bmiHeader, sizeof(Info.bmiHeader));
hFile.write(Pixels, (((BitsPerPixel * Width + 31) & ~31) / 8) * Height);
hFile.close();
DeleteObject(Section);
return true;
}
(链接)
但这实际上涉及将像素“内存”区域从屏幕 HDC 复制到内存中。为什么不这样:
char* Pixels = NULL;
HBITMAP Section = CreateDIBSection(Context, &Info, DIB_RGB_COLORS, (void**)&Pixels, 0, 0);
SelectObject(Context, Section);
上下文 HDC 已经包含所有数据。为什么我不能读它?
而且我认为必须将位图选择到 HDC 中,并且 HDC实际上承载数据。那么为什么CreateDIBSection
虽然位图还没有被选择到任何 HDC 中却返回一个指针呢?(如果它提供了一个指向作为参数传递的 HDC 内存的指针,则该数组已经包含屏幕的像素值,但情况并非如此,因为BitBlt
仍然需要。)
我得出这个结论是因为 BitBlt 接受 HDC 参数,而不是位图。这可能意味着它将数据复制到关联的 HDC。