2

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

1 回答 1

1

你在正确的轨道上。基本上,您想为元文件创建一个 DC(正如您所做的那样),然后要求原始代码将绘图渲染到该 DC。

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

如果你不能让它工作(因为原始代码没有办法渲染到任意 DC 并且你不能修改代码来添加该功能),那么你能做的最好的就是获取位图文件并将 BitBlt 直接发送到您的hdcMeta. 如果您尝试拉伸/收缩 EMF,这种方法看起来不会那么好。

于 2012-09-14T19:54:28.337 回答