GDI+ Градиент в метафайл через HDC
От: fivanko  
Дата: 29.08.13 10:51
Оценка:
Здравствуйте,

Есть код который делает экспорт графики в 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?

Спасибо!
gdi+ metafile graphics hdc gradient
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.