将 CDC 窗口的内容导出到 EMF 文件

Export content of a CDC window to a EMF file

本文关键字:EMF 文件 CDC 窗口      更新时间:2023-10-16

我是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");
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。

原始代码可能有这样的功能。 如果没有,您可以通过WM_PRINT发送 Windows 消息来诱骗它在 DC 上呈现。 这不能保证有效,因为某些 Windows 没有实现WM_PRINT所依赖的WM_PRINTCLIENT处理程序。

如果您无法使其工作(因为原始代码无法呈现为任意 DC,并且您无法修改代码以添加该功能),那么您能做的最好的事情就是将位图文件和 BitBlt 直接发送到您的hdcMeta。 如果您尝试拉伸/收缩 EMF,这种方法看起来不会那么好。