将MFC CView导出为矢量格式

3
使用我的MFC应用程序,我可以使用CView类在屏幕上打印我的CDocument。 基本上,我使用CDC类在屏幕上编写文本并绘制多边形,以提供文档的视图表示。
现在假设我想在Microsoft Word中使用该输出视图。
从用户的角度来看,无需任何其他开发工作,我可以:
- 复制并粘贴我的绘图到Word:这会生成一个栅格BMP文件,我可以将其粘贴到Word中
- 打印我的绘图并使用PDF导出器:这将产生一个矢量PDF文件,它是轻巧且可缩放的,但不易于在Word中重复使用。
这两种无需努力的解决方案非常好,因为我可以保持精确的视图布局,但有一些缺点(如栅格或格式)。
解决我的问题的另一种方法是编写SVG或VML,但我将无法获得相同的布局,并且这需要大量工作。
是否有库可以在标准格式中执行相同类型的PDF导出/打印机制?
您有什么建议?非常感谢。

你尝试过绘制增强型图元文件(EMF)吗? - dwo
不过,我该怎么做呢? - Michel Hua
1个回答

3
要将您的视图绘制到增强型图元文件中,首先请阅读MSDN文档: http://msdn.microsoft.com/en-us/library/427wezx1%28v=VS.80%29.aspx 以下是一个示例,说明如何进行操作:
CMetaFileDC MFDC;

CRect rect(0,0,width,height);

MFDC.CreateEnhanced(NULL,NULL,rect,NULL);
MFDC.SetBkMode(TRANSPARENT);
MFDC.SetMapMode(MM_HIMETRIC);

CDC tempDC;
tempDC.CreateCompatibleDC(&MFDC);
MFDC.SetAttribDC(tempDC.m_hDC);

// now you draw into the DC like it was your original view

HENHMETAFILE hEnhMetaFile = MFDC.CloseEnhanced();
HENHMETAFILE hEMF = NULL;
hEMF = CopyEnhMetaFile(hEnhMetaFile,"C:\\Temp\\Test.emf");
DeleteEnhMetaFile(hEMF);
DeleteEnhMetaFile(hEnhMetaFile);

谢谢dwo。我认为使用CreateCompatibleDCSetAttribDC的那几行代码是没有用的,对吧? - Michel Hua
文本在Windows 7/64位机器上使用Arial字体打印效果不佳。在屏幕上(在CView上)显示良好,但在文件(EMF或WMF)上却不行,而在Windows XP/32位上一切正常。 - Michel Hua
这很奇怪。我在两个系统下都运行了这样的代码,没有发现任何区别。我认为你应该用一个好的代码示例和描述来创建一个新的问题! - dwo
我认为这可能与 LOGFONT 结构有关。我的代码基本上是准备一个 LOGFONT 结构,使用 CreateFontIndirect(const LOGFONT* lplf) 方法来创建一个 CFont。选择字体的字符集和族似乎很棘手,并且在两个系统上可能不起作用。 - Michel Hua
看起来在Windows 7环境下构建程序可以解决问题。我的做法是在WinXP/32上构建,然后在Win7/64上运行。我使用了相同的代码和编译器Visual Studio 2008的相同版本。 - Michel Hua
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接