如何在绘制图元文件时替代图元文件的画笔和画笔? 在C++中,GDI+ i想画一个元文件,但修改它是用画笔和笔代替我在程序中创建的那些。我希望使用这个画笔和这支笔,而不是元文件中指定的任何其他画笔

如何在绘制图元文件时替代图元文件的画笔和画笔? 在C++中,GDI+ i想画一个元文件,但修改它是用画笔和笔代替我在程序中创建的那些。我希望使用这个画笔和这支笔,而不是元文件中指定的任何其他画笔,c++,gdi+,metafile,C++,Gdi+,Metafile,我怎样才能做到这一点 我尝试使用EnumerateMetafile和PlayRecord,但我不知道如何控制正在使用的笔和画笔。我尝试了下面的代码来选择底层HDC的当前画笔和画笔,但正如我所期望的那样,它不起作用 有什么建议吗?(我希望避免重写对所有EMF记录类型的完整处理) 提前谢谢 暂定代码(未按预期执行任何操作): //枚举元文件调用的回调函数: 布尔回调元回调( EmfPlusRecordType记录类型, 无符号整数标志、无符号整数数据大小、常量无符号字符*pStr、void*图元文件

我怎样才能做到这一点

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

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

提前谢谢

暂定代码(未按预期执行任何操作):

//枚举元文件调用的回调函数:
布尔回调元回调(
EmfPlusRecordType记录类型,
无符号整数标志、无符号整数数据大小、常量无符号字符*pStr、void*图元文件)
{ 
HDC-HDC=myGraphics->GetHDC();
选择对象(hdc、GetStockObject(白色笔));
myGraphics->ReleaseHDC(hdc);
静态播放(图元文件)->播放记录(记录类型、标志、数据大小、pStr);
返回TRUE;
}

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

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


要处理EMF+,您需要对格式()有一些了解。不幸的是,微软没有为记录提供结构,也没有提供从GDI+或用于播放非EMF+记录的HDC访问句柄/对象表的权限,这使得这一点变得困难。

非常感谢,我现在才看到你的答案(不知道为什么我没有收到或看到通知)。
// 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; 
}