Я новичок в 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);
Вы на правильном пути. По сути, вы хотите создать DC для метафайла (как вы это сделали), а затем попросить исходный код визуализировать график для этого DC.
Исходный код может иметь такую функцию. Если нет, вы можете обмануть его в рендеринге на своем DC, отправив сообщение Windows WM_PRINT. Это не гарантированно работает, так как некоторые Windows не реализуют обработчик для WM_PRINTCLIENT, на который опирается WM_PRINT.
Если вы не можете заставить это работать (потому что исходный код не имеет способа рендеринга на произвольный DC и вы не можете изменить код для добавления этой функциональности), тогда лучшее, что вы можете сделать, это получить файл растрового изображения и BitBlt, что прямо к вашему hdcMeta
, Этот подход не будет выглядеть так же хорошо, если вы попытаетесь растянуть / уменьшить ЭДС.
Других решений пока нет …