2012-09-14 34 views
2

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

基本上在这个应用程序中,有一个包含图的窗口。现在这个窗口支持将图输出到位图(tga,jpg和bmp)的功能。我们想添加另一个功能来将剧情的内容保存为增强元文件。

我设法得到CDC设备处理程序,并使用它的HDC创建一个空的EMF,其宽度/高度与绘图相同,但是我不知道如何将绘图的CONTENT迁移到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

要生成EMF,理想情况下,您不会保存位图,而是保存单个线条,点等,以生成绘图,以便可以高质量地渲染结果。 – Bryan

回答

1

您正处在正确的轨道上。基本上,你想为元文件创建一个DC(就像你已经完成的那样),然后让原始代码将绘图渲染到该DC。

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

如果你不能得到它的工作(因为原始代码没有办法渲染到任意DC,并且你不能修改代码来添加该funcationality),那么你可以做的最好的是将位图文件和BitBlt直接输入到hdcMeta。如果您试图拉伸/缩小EMF,这种方法看起来不太好。