【问题标题】:How to override the pens and brushes of a metafile when drawing it?绘制图元文件时如何覆盖它的钢笔和画笔?
【发布时间】:2013-02-03 13:58:49
【问题描述】:

在带有 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; 
}

【问题讨论】:

    标签: c++ gdi+ metafile


    【解决方案1】:

    这是 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 访问句柄/对象表,从而使这变得困难。

    【讨论】:

    • 非常感谢,我现在才看到您的回答(不知道为什么我没有收到或看到通知)。
    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2023-02-26
    • 2014-10-16
    相关资源
    最近更新 更多