Экспорт содержимого окна CDC в файл EMF

Я новичок в C ++ и OpenGL. Это приложение на C ++, написанное ранее кем-то (на базе Linux), и я должен его настроить.

В основном в этом приложении есть окно, содержащее сюжет. Теперь это окно поддерживает функции для экспорта графика в растровое изображение (tga, jpg и bmp). Мы хотим добавить еще одну функцию для сохранения содержимого графика в виде расширенного метафайла.

Мне удалось получить обработчик устройства CDC и использовать его HDC для создания пустой EMF с той же шириной / высотой, что и у графика, однако я понятия не имею, как перенести СОДЕРЖАНИЕ графика в файл EMF. Есть ли код для этого?

Код, который я использую для создания пустого файла EMF, выглядит следующим образом. Цени любую идею или помощь!

CDC* dc = pWnd->GetDC();
HDC hdcRef;
hdcRef = dc->GetSafeHdc();

CRect rect;
pWnd->GetClientRect(rect);

// Convert client coordinates to .01-mm units.
// Use iWidthMM, iWidthPels, iHeightMM, and
int iWidthMM = GetDeviceCaps (hdcRef, HORZSIZE);
int iHeightMM = GetDeviceCaps (hdcRef, VERTSIZE);
int iWidthPels = GetDeviceCaps (hdcRef, HORZRES);
int iHeightPels = GetDeviceCaps (hdcRef, VERTRES);
rect.left = (rect.left * iWidthMM * 100) / iWidthPels;
rect.top = (rect.top * iHeightMM * 100) / iHeightPels;
rect.right = (rect.right * iWidthMM * 100) / iWidthPels;
rect.bottom = (rect.bottom * iHeightMM * 100) / iHeightPels;

//::SetMapMode(hdcRef, MM_HIMETRIC);
HDC hdcMeta = CreateEnhMetaFile(hdcRef, "C:\\temp\\testEMF.emf", &rect, "Example metafile\0");
if (!hdcMeta)
GenAppWarningMsg("CreateEnhMetaFile", "Error");

// Set the device context back to its original state.
SetMapMode(hdcMeta, MM_ANISOTROPIC);
::ReleaseDC(NULL, hdcRef);

HENHMETAFILE meta = CloseEnhMetaFile (hdcMeta);

2

Решение

Вы на правильном пути. По сути, вы хотите создать DC для метафайла (как вы это сделали), а затем попросить исходный код визуализировать график для этого DC.

Исходный код может иметь такую ​​функцию. Если нет, вы можете обмануть его в рендеринге на своем DC, отправив сообщение Windows WM_PRINT. Это не гарантированно работает, так как некоторые Windows не реализуют обработчик для WM_PRINTCLIENT, на который опирается WM_PRINT.

Если вы не можете заставить это работать (потому что исходный код не имеет способа рендеринга на произвольный DC и вы не можете изменить код для добавления этой функциональности), тогда лучшее, что вы можете сделать, это получить файл растрового изображения и BitBlt, что прямо к вашему hdcMeta, Этот подход не будет выглядеть так же хорошо, если вы попытаетесь растянуть / уменьшить ЭДС.

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector