在使用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;
}
答案 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来实现这一点。