StretchBlt仅在nHeightDest为负时才有效

时间:2015-08-03 08:28:07

标签: c++ windows winapi bitblt stretchblt

我尝试使用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上,但这也导致没有图像,如果我试图否定宽度(目标和源),则相同。

知道为什么吗? 感谢。

0 个答案:

没有答案