いいえ。
ただし、Wine の PlayEnhMetaFile がレコードを描画するために使用するコードへのリンクは次のとおりです。
これは驚くほど単純で、StretchDIBits 呼び出しにはビット、BITMAPINFO、および iUsage が含まれます。HBITMAP を取得するために CreateDIBSection と SetDIBits にプラグインする必要があるすべての情報です。(CreateDIBitmap を使用した場合、現在の表示モードによっては、処理中に情報が失われる可能性があります。ビットが RLE 圧縮されている可能性があるため、ビットを DIB に直接コピーすることはできません。SetDIBits はそれを適切に処理します。 )
高さを取得して SetDIBits に渡す必要があります。実際には異なる構造を持つ BITMAPCOREINFO である可能性があるため、BITMAPINFO からそれを引き出すことには問題があります。最初に HBITMAP を作成してから、その高さを確認するのがおそらく最も簡単です。
DIB_PAL_COLORS を使用すると、パレットは BITMAPINFO にはなく、前のレコードによって HDC に選択されるので、DC を操作するレコードを再生し、与えられた HDC を使用することをお勧めします。
したがって、すべてをまとめると、次のようなもの(テストされておらず、エラーチェックが不足しています)が機能するはずです。
HBITMAP bitmap_from_stretchdibits(HDC hdc, const ENHMETARECORD *lpEMFR)
{
const EMRSTRETCHDIBITS *pStretchDIBits = (const EMRSTRETCHDIBITS *)lpEMFR;
BITMAP bm;
HBITMAP hbm;
hbm = CreateDIBitmap(
hdc,
(const BITMAPINFO *)((const BYTE *)lpEMFR + pStretchDIBits->offBmiSrc),
pStretchDIBits->iUsageSrc,
NULL,
NULL,
0);
if (hbm)
{
GetObjectA(hbm, sizeof(bm), &bm);
SetDIBits(
hdc,
hbm,
1,
abs(bm.bmHeight),
(const BYTE *)lpEMFR + pStretchDIBits->offBitsSrc,
(const BITMAPINFO *)((const BYTE *)lpEMFR + pStretchDIBits->offBmiSrc),
pStretchDIBits->iUsageSrc);
}
return hbm;
}