私は現代のWindows環境で古いプログラムと古いプログラムを実行するためのサポートを提供しようとするDxWndツールの著者です。SetDIBitsToDeviceエミュレーション
非常に奇妙なゲームは、Win7-10システムでネイティブに実行できるにもかかわらず、グラフィック操作に深刻な問題をもたらします。
ゲームはddrawにリンクしますが、すべてのフレームをDIB_PAL_COLORS
DIBとして構築し、SetDIBitsToDevice
user32コールを使用してDIBを画面に表示します。 この操作は、ビデオの場合はOBJ_DC
DCで32ビットの色深度ビデオモードでもサポートされますが、MEM_DCタイプのDCに適用すると色が悪くなります。私はこのような典型的なスキーマ使ってDIBを拡大しようとしている。この中に見つかった (変数宣言とエラーが簡潔にするために取り除かチェック):
hTempDc=CreateCompatibleDC(hdc);
hbmPic=CreateCompatibleBitmap(hdc, OrigWidth, OrigHeight);
SelectObject(hTempDc, hbmPic);
SetDIBitsToDevice(hTempDc, 0, 0, OrigWidth, OrigHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse);
StretchBlt(hdc, XDest, YDest, dwWidth, dwHeight, hTempDc, 0, 0, OrigWidth, OrigHeight, SRCCOPY);
ピクセルがマップされているあなたをDIB_PAL_COLORS
DIB出力MSDNによると、 「現在の」パレットを実現しましたが、もちろん32ビットのサーフェス上にあり、メモリ上にはDCクローンが全くありません。したがって、ピクセルの色がすべて間違っているのは不思議ではありません。
代替ソリューションは、StretchBlt
で自由にスケーリングする32ビットのメモリDCを構築SetDIBitsToDevice
動作をエミュレートするかもしれないが、再び私が32bppのDIB_RGB_DIB
またはAのいずれかに8bppのDIB_PAL_COLORS
DIBを変換することができるか、文書化されていません32bpp DC。
私はすでにいくつかの点で試してみましたが、すべての場合、ピクセルインデックスを変換するために使用する正しいパレットを特定できないようです。 誰かが8bpp DIB_PAL_COLORS
DIB形式の解釈に役立つでしょうか?
また、現在のパレットでSelectObjectを追加しようとしましたが、使用できません。GetCurrentObject(hdc、OBJ_PAL)はNULLを返します。 – gho