HBITMAP或HDC到uint8 []

时间:2015-05-04 07:58:20

标签: winapi

我通过执行以下操作获得了截图:

  1. long tmp_len_square[N*3]; for (int j = 0; j < N; ++j) { tmp_len_square[3 * j] = (point_A[j].length)*(point_A[j].length); } for (int j = 0; j < N; ++j) { tmp_len_square[(3 * j) + 1] = (point_B[j].width)*(point_B[j].width); } for (int j = 0; j < N; ++j) { tmp_len_square[(3 * j) + 2] = (point_C[j].height)*(point_C[j].height); } for (int j = 0; j < N; ++j) { float total = sqrt(tmp_len_square[3 * j] + tmp_len_square[(3 * j) + 1] + tmp_len_square[(3 * j) + 2]); // ... }
  2. GetDesktopWindow
  3. GetDC
  4. GetClientRect
  5. 这为我提供CreateCompatibleBitmap,我可以选择将其带到HBITMAP

    1. HDC
    2. 我的目标是从第4步(CreateCompatibleDC)或第5步(CreateCompatibleBitmap)结束uint8字节数组吗?

      由于

1 个答案:

答案 0 :(得分:2)

您需要使用CreateCompatibleDC()创建新DC,使用CreateDIBSection()为此DC创建DIB(设备无关位图),使用SelectObject()在新DC中选择DIB,然后使用BitBlt()从原始DC复制到新DC。 CreateDIBSection检索的指针将指向原始数据。这些数据由系统分配,这意味着您不需要自己分配,但是当您为DIB调用DeleteObject()时,它将被释放。

这是C:

中的一个例子
HDC hdcMemoryDC = CreateCompatibleDC(yourDC);

BITMAPINFO bmi;

memset(&bmi, 0, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height;    // top-down
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;

HBITMAP hbmp;
COLORREF *pixelBuffer;
hbmp = CreateDIBSection( hdcMemoryDC, &bmi, DIB_RGB_COLORS, (VOID**)&pixelBuffer, NULL, 0 );

SelectObject( hdcMemoryDC, hbmp );

BitBlt( hdcMemoryDC, 0, 0, width, height, yourDC, 0, 0, SRCCOPY );