我尝试使用StretchBlt将像素从内存hdc复制到窗口hdc。
内存hdc从一个不可见的窗口获取图像,该窗口使用openGL渲染流。
这是我的代码:
BITMAPINFOHEADER createBitmapHeader(int width, int height) {
BITMAPINFOHEADER header;
header.biSize = sizeof(BITMAPINFOHEADER);
header.biWidth = width;
header.biHeight = height;
header.biPlanes = 1;
header.biBitCount = 32;
header.biCompression = BI_RGB;
header.biSizeImage = 0;
header.biXPelsPerMeter = 0;
header.biYPelsPerMeter = 0;
header.biClrUsed = 0;
header.biClrImportant = 0;
return header;
}
...
HDC memoryHdc = CreateCompatibleDC(windowHdc);
BITMAPINFO bitmapInfo;
bitmapInfo.bmiHeader = createBitmapHeader(targetDimensions.width, targetDimensions.height);
HBITMAP bitmap = CreateDIBitmap(windowHdc, &bitmapInfo.bmiHeader, CBM_INIT, offscreenBuffer, &bitmapInfo, DIB_RGB_COLORS);
SelectObject(memoryHdc, bitmap);
DeleteObject(bitmap);
SetStretchBltMode(windowHdc, COLORONCOLOR);
StretchBlt(windowHdc,
targetDimensions.x, targetDimensions.y,
targetDimensions.width, -targetDimensions.height,
memoryHdc,
sourceDimensions.x, sourceDimensions.y,
sourceDimensions.width, sourceDimensions.height,
SRCCOPY);
DeleteDC(memoryHdc);
windowHdc
是我希望StretchBlt
将像素复制到的窗口的hdc,offscreenBuffer
是从void*
复制的像素的sourceDimensions.height
在openGL窗口中,openGL正在渲染。
此代码效果很好,只是图像是颠倒的,我希望它垂直翻转 我知道发生这种情况是因为:
如果nHeightSrc和nHeightDest有不同的符号,则为该函数 沿y轴创建位图的镜像
但是当我删除减号并且目标和源高度都相同时,我在窗口中看不到任何图像。
只是为了检查,我试图将减号放在~/.netrc
上,但这也导致没有图像,如果我试图否定宽度(目标和源),则相同。
知道为什么吗? 感谢。