0

在带有 GDI+ 的 C++ 中,我想绘制一个元文件,但要对其进行修改,使画笔和钢笔替换为我在程序中创建的。我希望使用这个画笔和这支笔来代替图元文件本身中指定的任何其他东西。

我怎么能做到这一点?

我尝试使用 EnumerateMetafile 和 PlayRecord,但我不知道如何控制正在使用的笔和画笔。我尝试了下面的代码来选择底层 HDC 的当前 Pen 和 Brush,但正如我所期望的那样它不起作用......

请问有什么建议吗?(我想避免重写对所有 EMF 记录类型的完整处理)

提前致谢。

暂定代码(按预期不做任何事情):

// callback function called by EnumerateMetafile:
BOOL CALLBACK metaCallback(
   EmfPlusRecordType recordType, 
   unsigned int flags, unsigned int dataSize, const unsigned char* pStr, void* metafile)
{ 
   HDC hdc = myGraphics->GetHDC ();
   SelectObject(hdc, GetStockObject(WHITE_PEN));
   myGraphics->ReleaseHDC(hdc);

   static_cast <Metafile*>(metafile)->PlayRecord(recordType, flags, dataSize, pStr);
   return TRUE; 
}
4

1 回答 1

0

这是 EMF 还是 EMF+?如果它是常规的 EMF(或 WMF),我建议使用 Enum[Enh]MetaFile 而不是 GDI+,因为它对这类事情有更好的界面。您只需要实现自己对 SelectObject 的处理。如果选择的手柄是画笔或钢笔(由 GetObjectType 确定),则跳过该记录。然后,如果您在枚举元文件之前选择所需的笔/画笔,它应该一直保留在那里。

对于 EMF+,我建议查找 EmfPlusRecordTypeObject 类型的记录,如果它们用于画笔或钢笔对象,则播放一个加载您想要的画笔或钢笔的记录。这不是一个完整的解决方案,因为某些记录类型嵌入了纯色画笔而不是使用单独的对象记录,但这是一个开始。

要处理 EMF+,您需要了解格式 ( http://msdn.microsoft.com/en-us/library/cc230724.aspx )。不幸的是,微软没有为记录提供结构,也没有从 GDI+ 或它用来播放非 EMF+ 记录的 HDC 提供对句柄/对象表的访问,从而使这变得困难。

于 2013-02-06T04:53:09.297 回答