Как переопределить перья и кисти метафайла при его рисовании?

В C++ с GDI+ я хотел бы нарисовать метафайл, но изменив его таким образом, чтобы кисти и перья были заменены теми, которые я создал в своей программе. Я бы хотел, чтобы эта кисть и это перо использовались вместо любых других, указанных в самом метафайле.

Как я мог этого добиться?

Я пытался использовать 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; 
}

person bfredo123    schedule 03.02.2013    source источник


Ответы (1)


Это EMF или EMF+? Если это обычный EMF (или WMF), я бы предложил использовать Enum[Enh]MetaFile вместо GDI+, так как он имеет лучший интерфейс для такого рода вещей. Вам просто нужно реализовать собственную обработку SelectObject. Если выбранный маркер представляет собой кисть или перо (как определено GetObjectType), пропустите эту запись. Затем, если вы выберете нужное перо/кисть перед перечислением метафайла, оно должно оставаться там все время.

Для EMF+ я бы предложил искать записи типа EmfPlusRecordTypeObject и, если они относятся к объекту кисти или пера, воспроизвести вместо этого запись, которая загружает нужную кисть или перо. Это не полное решение, так как некоторые типы записей включают сплошные цветные кисти вместо использования отдельной записи объекта, но это только начало.

Для обработки EMF+ вам потребуется некоторое понимание формата (http://msdn.microsoft.com/en-us/library/cc230724.aspx). К сожалению, Microsoft усложнила это, не предоставив структуры для записей и не предоставив доступ к таблице дескрипторов/объектов из GDI+ или HDC, который он использует для воспроизведения записей, отличных от EMF+.

person Esme Povirk    schedule 06.02.2013
comment
Большое спасибо, я вижу ваш ответ только сейчас (не знаю, почему я не получил или не увидел уведомление). - person bfredo123; 09.03.2013