不。
但这里是 Wine 的 PlayEnhMetaFile 用于绘制记录的代码的链接:http: //source.winehq.org/source/dlls/gdi32/enhmetafile.c ?v=wine-1.5.2#L1111
它非常简单,并且 StretchDIBits 调用具有位、BITMAPINFO 和 iUsage - 您需要插入 CreateDIBSection 和 SetDIBits 以获得 HBITMAP 的所有信息。(如果您使用 CreateDIBitmap,您可能会在此过程中丢失信息,具体取决于当前的显示模式。呃。而且您不能直接将这些位复制到 DIB 中,因为这些位可能是 RLE 压缩的。SetDIBits 将正确处理。 )
好的,所以您确实需要获取传递给 SetDIBits 的高度。将其从 BITMAPINFO 中取出是有问题的,因为它实际上可能是具有不同结构的 BITMAPCOREINFO。首先创建 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;
}