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

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

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

Я пытался использовать EnumerateMetafile и PlayRecord, но не понимаю, как получить контроль над пером и кистью. Я попробовал код ниже, чтобы выбрать текущее Pen and Brush из основного 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

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]