但是,我需要显示什么打印的EXACT缩放版本.
所以目前,我使用
CreateCompatibleDC()与打印机HDC和
CreateCompatibleBitmap()与打印机的HDC.
我以这种方式,DC将具有打印机的确切的宽度和高度.
当我选择这个HDC的字体时,文本将按照打印机的尺寸进行缩放.
不幸的是,我猜到,由于HDC的HDC类型不同,所以我不能把这个HDC的像素复制到控件的HDC.
如果我从与打印机页面相同的w,h的窗口HDC中创建“内存画布”
这些字体出来很少,因为它们被缩放到屏幕,而不是页面…
我应该从窗口的DC和.CreateCompatibleDC()
CreateCompatibleBitmap()从打印机的DC或某些东西?
如果有人可以解释RIGHT的方式来做到这一点.
(仍然有一些看起来像打印机上的东西)…
嗯,我会很感激!
…史蒂夫
有很多方法听起来你正在尝试绘制一个打印机大小的位图,然后收缩.要做到这一点的步骤是:
>为打印机创建DC(或更好的是IC – 信息上下文).
>查询打印机DC,找出分辨率,页面大小,物理偏移量等.
>为窗口/屏幕创建DC.
>创建兼容的DC(存储器DC).
>为窗口/屏幕创建一个兼容的位图,但大小应该是打印机页面的像素大小. (这种方法的问题是这是一个巨大的位图,它可能会失败.)
>将兼容位图选择到存储器DC中.
>绘制到内存DC,使用与绘制到实际打印机时使用的相同坐标. (当您选择字体时,请确保将其缩放到打印机的逻辑英寸,而不是屏幕的逻辑英寸.)
> Stretch将存储器直流转到窗口,这将缩小整个图像.您可能需要尝试使用拉伸模式,以查看最适合您要显示的图像类型.
释放所有的资源.
但是,在你朝着这个方向前进,考虑替代方案.这种方法包括分配一个巨大的屏幕外位图.在资源不足的计算机上这可能会失败.即使没有,您可能会饿死其他应用程序.
在另一个答案中给出的图元文件方法是许多应用程序的不错选择.我会从这开始
另一种方法是在一些虚构的高分辨率单元中找出所有尺寸.例如,假设一切都在千分之一英寸.然后,您的绘图程序将这个虚拟单位缩放到目标设备使用的实际dpi.
最后一个方法(可能是图元文件)的问题是GDI字体不能线性完美扩展.单个字符的宽度根据目标分辨率进行调整.在高分辨率设备(如300 dpi激光打印机)上,这种调整是最小的.但是在96 dpi屏幕上,调整可能会增加一条线的长度上的重大错误.因此,预览窗口中的文本可能与打印页面上的文本不成比例(通常较宽).
因此,核心方法是测量打印机上下文中的文本,并在屏幕上下文再次测量,并调整差异.例如(使用编号),您可以测量打印机上下文中某些文本的宽度,并显示为900个打印机像素.假设打印机像素与屏幕像素的比例为3:1.您期望屏幕上相同的文字宽300像素.但是您可以在屏幕上下文中获得325像素的值.当您画到屏幕时,您必须以某种方式使文字更小25像素.您可以将角色靠近在一起,或者选择稍小的字体,然后将其拉伸出来.
硬核方法涉及更复杂.例如,您可能会尝试检测打印机驱动程序所做的字体替换,并使用可用的屏幕字体尽可能接近它们.
我喜欢大点阵图和硬核方法的混合体.而不是在整个页面上创建一个巨大的位图,而是为一行文本做一个足够大的位图.然后我将打印机尺寸绘制到屏幕外位图,并将其缩小到屏幕尺寸.这消除了在字体质量轻微降低时处理尺寸差异.它适用于实际的打印预览,但您不希望建立一个所见即所得编辑器.单行位图足够小以使其变得实用.
好消息是文字很难.所有其他绘图是坐标和尺寸的简单缩放.
我没有使用GDI,但是我认为它没有使用非线性字体缩放.所以如果你使用GDI,你只需要缩放你的坐标.缺点是我不认为GDI上的字体质量一样好.
最后,如果您是Vista或更高版本的本机应用程序,请确保已将过程标记为“DPI-aware”.否则,如果用户位于高DPI屏幕上,则Windows会对您说谎,并声称该分辨率仅为96 dpi,然后对所绘制的任何图像进行模糊扩展.这会降低视觉质量,并且可以使调试您的打印预览更加复杂.由于这么多程序不能很好地适应更高的DPI屏幕,Microsoft在Vista中默认添加了“高DPI缩放”.
编辑添加
另一个警告:如果您使用打印机大小的位图将HFONT选择到内存DC中,则可能会获得与将实际打印机DC选择相同的HFONT时的字体不同的字体.这是因为一些打印机驱动程序将用内存替换常规字体.例如,一些PostScript打印机将替换一些内部PostScript字体的某些常见的TrueType字体.
您可以首先在打印机IC中选择HFONT,然后使用GDI函数,如GetTextFace,GetTextMetrics,或者GetOutlineTextMetrics来查找所选的实际字体.然后,您可以创建一个新的LOGFONT来尝试更紧密地匹配打印机将使用的内容,将其转换为HFONT,然后将其选择到内存中.这是一个非常好的实现的标志.