将CDC窗口的内容导出到EMF文件 我是C++和OpenGL的新手。有一个C++应用程序以前有人写过(基于Linux),我必须调整它。

将CDC窗口的内容导出到EMF文件 我是C++和OpenGL的新手。有一个C++应用程序以前有人写过(基于Linux),我必须调整它。,c++,bitmap,gdi,cdc,C++,Bitmap,Gdi,Cdc,基本上,在这个应用程序中,有一个包含绘图的窗口。现在,此窗口支持将绘图导出为位图(tga、jpg和bmp)的功能。我们想添加另一个函数,将绘图内容保存为增强的元文件 我设法找到了CDC设备处理程序,并使用它的HDC创建了一个与绘图宽度/高度相同的空EMF,但是我不知道如何将绘图内容迁移到EMF文件中。是否有代码可以执行此操作 下面是我用来创建空EMF文件的代码。非常感谢任何想法或帮助 CDC* dc = pWnd->GetDC(); HDC hdcRef; hdcRef = dc->

基本上,在这个应用程序中,有一个包含绘图的窗口。现在,此窗口支持将绘图导出为位图(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

原始代码可能有这样的功能。如果没有,您可以通过发送Windows消息来诱使它在DC上渲染。这并不能保证工作正常,因为有些窗口没有为WM_PRINTCLIENT实现处理程序,WM_PRINT依赖于此


如果您无法使其正常工作(因为原始代码无法渲染到任意DC,并且您无法修改代码以添加该功能),那么您最好将位图文件和位BLT直接获取到
hdcMeta
。如果您尝试拉伸/收缩EMF,这种方法看起来就不太好。

要生成EMF,理想情况下,您不会保存位图,而是保存单独的线、点等来生成绘图,这样可以高质量地渲染结果。