如何在绘制时覆盖图元的笔和画笔?

时间:2013-02-03 13:58:49

标签: c++ gdi+ metafile

在使用GDI +的C ++中,我想绘制一个元文件,但是修改它的方式是刷子和笔被我在程序中创建的那些替换。我想要使​​用这个笔和这支笔而不是元文件本身中指定的任何其他笔。

我怎么能实现这个目标?

我尝试使用EnumerateMetafile和PlayRecord,但我没有看到如何控制笔和笔刷的使用。我尝试下面的代码来选择底层HDC的当前笔和画笔,但正如我所期待的那样它不起作用......

有什么建议吗? (我想避免重写所有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; 
}

1 个答案:

答案 0 :(得分: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来实现这一点。