如何在win32 c中打印预览?
我有一个绘图功能,只需要一个HDC.
但是,我需要显示什么打印的EXACT缩放版本. 所以目前,我使用 我以这种方式,DC将具有打印机的确切的宽度和高度. 不幸的是,我猜到,由于HDC的HDC类型不同,所以我不能把这个HDC的像素复制到控件的HDC. 如果我从与打印机页面相同的w,h的窗口HDC中创建“内存画布” 我应该从窗口的DC和.CreateCompatibleDC() 如果有人可以解释RIGHT的方式来做到这一点. 嗯,我会很感激! …史蒂夫
根据你想要的准确度,这可能会变得困难.
有很多方法听起来你正在尝试绘制一个打印机大小的位图,然后收缩.要做到这一点的步骤是: >为打印机创建DC(或更好的是IC – 信息上下文). 但是,在你朝着这个方向前进,考虑替代方案.这种方法包括分配一个巨大的屏幕外位图.在资源不足的计算机上这可能会失败.即使没有,您可能会饿死其他应用程序. 在另一个答案中给出的图元文件方法是许多应用程序的不错选择.我会从这开始 另一种方法是在一些虚构的高分辨率单元中找出所有尺寸.例如,假设一切都在千分之一英寸.然后,您的绘图程序将这个虚拟单位缩放到目标设备使用的实际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,然后将其选择到内存中.这是一个非常好的实现的标志. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows – 是否有一个允许构建独立可执行文件的Lua IDE?
- 清除Windows系统里未知的自启动程序
- winapi – 适用于Windows XP的线程安全的GetTickCount64实现
- windows – 通过Citrix Receiver(或Citrix服务器)登录Citri
- 便宜的Windows驱动程序签名64位Windows 7
- 如何在 Skype 清除所有对话记录
- 如何在Windows上用C编写unicode hello world
- WinForm事件中的Object sender和EventArgs e参数
- 下载MAPI33.dll的位置?
- WSAStartup函数如何启动使用Winsock DLL?