我是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);
答案 0 :(得分:1)
你走在正确的轨道上。基本上,您想为元文件创建一个DC(就像您已经完成的那样),然后让原始代码将绘图渲染到该DC。
原始代码可能具有此功能。如果没有,您可以通过发送Windows消息WM_PRINT来欺骗它在DC上呈现。这不能保证工作,因为有些Windows没有实现WM_PRINTCLIENT的处理程序,WM_PRINT依赖它。
如果你不能让它工作(因为原始代码没有办法渲染到任意DC而你无法修改代码来添加那个功能),那么你能做的最好就是获得直接到你的hdcMeta
的位图文件和BitBlt。如果您尝试拉伸/收缩EMF,这种方法看起来不会很好。