创建具有特定格式的位图以反转/镜像它

pul*_*van 1 c++ winapi visual-c++

我正在使用以下方法来创建反转位图:

HBITMAP CreateMirroredBitmap( HBITMAP hbmOrig)
{
    HDC hdc, hdcMem1, hdcMem2;
    HBITMAP hbm = NULL, hOld_bm1, hOld_bm2;
    BITMAP bm;
    if (!hbmOrig)
        return NULL;
    if (!GetObject(hbmOrig, sizeof(BITMAP), &bm))
        return NULL;

    // Grab the screen DC.
    hdc = GetDC(NULL);
    if (hdc)
    {
        hdcMem1 = CreateCompatibleDC(hdc);
        if (!hdcMem1)
        {
            ReleaseDC(NULL, hdc);
            return NULL;
        }
        hdcMem2 = CreateCompatibleDC(hdc);
        if (!hdcMem2)
        {
            DeleteDC(hdcMem1);
            ReleaseDC(NULL, hdc);
            return NULL;
        }
        hbm = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight);
        if (!hbm)
        {
            ReleaseDC(NULL, hdc);
            DeleteDC(hdcMem1);
            DeleteDC(hdcMem2);
            return NULL;
        }
        // Flip the bitmap.
        hOld_bm1 = (HBITMAP)SelectObject(hdcMem1, hbmOrig);
        hOld_bm2 = (HBITMAP)SelectObject(hdcMem2 , hbm );
        SetLayout(hdcMem2, LAYOUT_RTL);
        BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem1, 0, 0, SRCCOPY);
        SelectObject(hdcMem1, hOld_bm1 );
        SelectObject(hdcMem1, hOld_bm2 );
        DeleteDC(hdcMem1);
        DeleteDC(hdcMem2);
        ReleaseDC(NULL, hdc);
    }
    return hbm;
}
Run Code Online (Sandbox Code Playgroud)

摘自此处:http://msdn.microsoft.com/en-us/goglobal/bb688119

问题是无论我用于输入(8,16或32位颜色)的位图,它总是输出32位位图.我的猜测是CreateCompatibleBitmap创建默认的32位位图,因为我传递的DC是屏幕的DC为32位.有没有办法镜像位图,但也保留其颜色深度?

Rom*_* R. 5

CreateBitmap并且CreateDIBSection将创建位图你要求的位数,而你仍然可以用DC选择他们接受结果.