Winapi 将增强型图元文件转换为Windows图元文件而不进行像素舍入的正确方法

Winapi 将增强型图元文件转换为Windows图元文件而不进行像素舍入的正确方法,winapi,metafile,Winapi,Metafile,当我将增强型图元文件(通过C#中的GDI+构建)转换为旧式Windows图元文件时,结果非常粗糙,显然是因为坐标被舍入到最近的屏幕像素。我看到这一点,如果我转换通过 GetWinMetaFileBits(emfh,bits_l,bits,MM_各向异性,GetDC(0)) 或者使用GDI+的元文件::EmfToWmfBits。罪魁祸首可能是正在使用的屏幕DC。建议使用适用于我的打印机DC,但如果用户未安装打印机,则显然不起作用。有更好的办法吗?我已经考虑过为此目的创建一个高分辨率内存DC,但我找

当我将增强型图元文件(通过C#中的GDI+构建)转换为旧式Windows图元文件时,结果非常粗糙,显然是因为坐标被舍入到最近的屏幕像素。我看到这一点,如果我转换通过

GetWinMetaFileBits(emfh,bits_l,bits,MM_各向异性,GetDC(0))


或者使用GDI+的元文件::EmfToWmfBits。罪魁祸首可能是正在使用的屏幕DC。建议使用适用于我的打印机DC,但如果用户未安装打印机,则显然不起作用。有更好的办法吗?我已经考虑过为此目的创建一个高分辨率内存DC,但我找不到合适的文档,而且我还担心使用的RAM。

通常的方法是创建一个更高分辨率的内存DC,渲染到该DC,然后根据需要保存它。请注意,字体大小可能会因此而变大

 HDC memDC = CreateCompatibleDC ( hDC );
 HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
 SelectObject ( memDC, memBM );
对于nWidth,n要大得多。

CreateCompatible位应该设置所有dpi等,但我遇到了一些问题,字体是固定像素大小绘制的,而不是重新缩放的,因此在10000像素的图像上,字体的高度只有10像素

微软的描述


包括下载中的示例。

是的,但如何创建更高分辨率的内存DC?你能指出任何文档吗?我可以使用CreateCompatibleBitmap()创建一个具有很多像素的位图,但它的DPI与屏幕相同,因此我的图元文件将在左上角绘制,问题与以前相同。也许如果我在创建原始增强图元文件时检查绘图区域的大小,那么我可以让它在进行转换时使用更多的位图。这就是你的意思吗?字体是如何被这个过程搞砸的?CreateEnhMetafile是适合这个应用程序的API啊,您将使用它来克隆SPPS.Coiche可放置的元文件以获得最佳效果。有时,在右侧和底部添加0.1 mm是很有用的。一些程序通过插入wmf graphic来减少这些问题。ENMETA将增强型图元文件转换为Windows图元文件的代码使用屏幕DC(GetDC(NULL)),因此将遇到我最初描述的问题。是的,这是针对Q的,它是SPSS的竞争对手,但几乎不是克隆。也许你想要PSPP?