Здравствуйте,
Есть код который делает экспорт графики в EMF.
Графика содержит градиенты. Градиент рисуется с помощью Graphics класса, что-то вроде:
Graphics g(hdc);
LinearGradientBrush brush(Gdiplus::Point(0, 0), Gdiplus::Point(0, bounds.GetBottom()), Color(255, 0, 0, 255), Color(0, 0, 0, 255));
g.FillRectangle(&brush, bounds);
Когда такой метафайл открыть то градиент выходит "точечный".
Вот пример двух кусков кода:
Код 1:
Metafile m(L"c:\\Sample1.emf", GetDC(0));
Graphics g(&m);
LinearGradientBrush brush(Gdiplus::Point(0, 0), Gdiplus::Point(0, bounds.GetBottom()), Color(255, 0, 0, 255), Color(0, 0, 0, 255));
g.FillRectangle(&brush, bounds);
Код 2:
Metafile metafile(L"c:\\Sample2.emf", GetDC(0));
Graphics g(&metafile);
HDC hdc = g.GetHDC();
{
Graphics g2(hdc);
LinearGradientBrush brush(Gdiplus::Point(0, 0), Gdiplus::Point(0, bounds.GetBottom()), Color(255, 0, 0, 255), Color(0, 0, 0, 255));
g2.FillRectangle(&brush, bounds);
}
g.ReleaseHDC(hdc);
Дамп файла Sample1.emf:
EmfRecordTypeHeader
EmfPlusRecordTypeHeader
EmfPlusRecordTypeObject
EmfPlusRecordTypeFillRects
EmfPlusRecordTypeEndOfFile
EmfRecordTypeEOF
Дамп файла Sample2.emf намного больше, похоже что EmfPlusRecordTypeObject и EmfPlusRecordTypeFillRects развернулся в поточечное рисование градиента на GDI:
EmfRecordTypeHeader
EmfPlusRecordTypeHeader
EmfPlusRecordTypeGetDC
EmfRecordTypeSaveDC
EmfRecordTypeSetICMMode
EmfRecordTypeSelectObject
EmfRecordTypeCreateBrushIndirect
EmfRecordTypeSelectObject
EmfRecordTypeSelectObject
EmfRecordTypePolygon16
EmfRecordTypeSelectObject
EmfRecordTypeSelectObject
EmfRecordTypeDeleteObject
EmfRecordTypeCreateBrushIndirect
EmfRecordTypeSelectObject
EmfRecordTypeBitBlt
EmfRecordTypeSetTextColor
EmfRecordTypeCreateDIBPatternBrushPt
EmfRecordTypeSelectObject
EmfRecordTypeSelectObject
EmfRecordTypeBitBlt
EmfRecordTypeSelectObject
EmfRecordTypeSelectObject
EmfRecordTypeSetTextColor
EmfRecordTypeBitBlt
EmfRecordTypeSelectObject
EmfRecordTypeDeleteObject
EmfRecordTypeCreateBrushIndirect
...
Можно это как нибудь обойти, чтоб код2 генерил такой же метафайл как код1?
Спасибо!
Здравствуйте, fivanko, Вы писали:
F>Здравствуйте,
F>Есть код который делает экспорт графики в EMF.
F>Графика содержит градиенты. Градиент рисуется с помощью Graphics класса, что-то вроде:
F>F>Graphics g(hdc);
F>LinearGradientBrush brush(Gdiplus::Point(0, 0), Gdiplus::Point(0, bounds.GetBottom()), Color(255, 0, 0, 255), Color(0, 0, 0, 255));
F>g.FillRectangle(&brush, bounds);
F>
F>Можно это как нибудь обойти, чтоб код2 генерил такой же метафайл как код1?
F>Спасибо!
Используйте графикс созданный напрямую с метафайла
Дело в том, что в первом случае gdiplus генерит инструкции emf+, во втором случае это все "проходит" ч-з HDC превращаясь в инструкции emf.
Здравствуйте, saf_e, Вы писали:
_>Используйте графикс созданный напрямую с метафайла
_>Дело в том, что в первом случае gdiplus генерит инструкции emf+, во втором случае это все "проходит" ч-з HDC превращаясь в инструкции emf.
Спасибо за ответ, сейчас и пробую это дело перевести на Graphics. Но это очень рискованно. Надеялся может есть какое нибудь лекарство...