バイトの BGRA 配列として格納されたビットマップがあります。これは、ビットマップを描画するために使用してきたコードです。
CDC *dispDC = new CDC();
dispDC->CreateCompatibleDC(pDC);
CBitmap *dispBMP = new CBitmap();
dispBMP->CreateCompatibleBitmap(pDC, sourceImage->GetWidth(), sourceImage->GetHeight());
dispDC->SelectObject(this->dispBMP);
配列内のピクセルの実際のコピーは、次のように行わtranslatedImage
れます。
dispBMP->SetBitmapBits(sourceImage->GetArea() * 4, translatedImage);
次に、さらに処理を行った後、ソース CDC として呼び出しpDC->StretchBlt
ますdispDC
。ディスプレイも 32bpp に設定されているため、ローカルにログインすると問題なく動作します。
リモート デスクトップでログインすると、ディスプレイが 16bpp になり、画像が乱れます。犯人はSetBitmapBits
; translatedImage
つまり、それが機能するためには、表示したいものの 16bpp バージョンを適切に入力する必要があります。これを自分で行うのではなく、ドキュメントを検索して、SetDIBits
私が望むように聞こえるものを見つけました。
SetDIBits 関数は、指定された DIB で見つかったカラー データを使用して、互換ビットマップ (DDB) にピクセルを設定します。
私の場合、DIB は 32bpp RGBA 配列で、DDB はdispBMP
で作成したものCreateCompatibleBitmap
です。
への呼び出しの代わりにSetBitmapBits
、これが私がしたことです:
BITMAPINFO info;
ZeroMemory(&info, sizeof(BITMAPINFO));
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biBitCount = 32;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biCompression = BI_RGB;
info.bmiHeader.biSizeImage = sourceImage->GetArea()*4;
info.bmiHeader.biWidth = sourceImage->GetWidth();
info.bmiHeader.biHeight = sourceImage->GetHeight();
info.bmiHeader.biClrUsed = 0;
int r = SetDIBits(pDC->GetSafeHdc(), (HBITMAP)dispBMP,
0, sourceImage->GetHeight(), translatedImage,
&info, DIB_PAL_COLORS);
ただし、r
常にゼロであり、当然、ウィンドウには何も表示されません。コードの何が問題になっていますか?