用API做打印预览和实际打印差别好大的问题

xyhello 2009-05-29 11:54:47
用API在窗体上画了个10x10的格子,每个格子长是80像素,高20像素;用同样的代码在打印机上画出后打印,可打印出来的大小和屏幕上的相比差太多了,如何保持预览和打印的大小差不多呢?就是拿张纸去屏幕上对比,谢谢!
...全文
255 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
东方之珠 2009-06-04
  • 打赏
  • 举报
回复
顶一把
Tiger_Zhao 2009-06-04
  • 打赏
  • 举报
回复
xyhello 应该先确定图形以哪个坐标单位为标准:屏幕的像素大小还是绝对长度(英寸),然后用 ScaleX、ScaleY 换算成设备的坐标。
of123 2009-06-04
  • 打赏
  • 举报
回复

的确如此。

抓屏打印往往比使用打印机对象得到的图像粗糙。例如字体就差很多,屏显的字体打印出来比较难看。但是,正确的预览,应该能显示出正确的大小。毕竟,打印机的分辨率是可以获取的,显示时可以换算。
mybelta2 2009-06-04
  • 打赏
  • 举报
回复
单位不一致问题
蝈蝈俊 2009-06-04
  • 打赏
  • 举报
回复
test
Tiger_Zhao 2009-06-03
  • 打赏
  • 举报
回复
Printer.ScaleX() 完成的就是相同的功能(而且可用的长度类型更多),没必要为 API 而 API。
xyhello 2009-06-02
  • 打赏
  • 举报
回复
我用上面的代码转换分辨率后,画图可以直接画了,但selectClipRgn好像不受影响,还要自己转换?
贝隆 2009-06-01
  • 打赏
  • 举报
回复
帮顶
lyserver 2009-06-01
  • 打赏
  • 举报
回复
转换屏幕分辩率至打印机分辨率,不过存在一点误差(误差没有你说的那样大)。
xyhello 2009-06-01
  • 打赏
  • 举报
回复
用Excel打印的时候他的边距设置是准确的,可我在自己定义边距的时候打印出来就差好多,我是直接用API在hDC上画格子,
不知是不是坐标原点不对呢?请问下你那段代码的作用是?
lyserver 2009-06-01
  • 打赏
  • 举报
回复
没办法,很难做到真正的所见即所得,因为各种打印机的分辨率不一样。
xyhello 2009-06-01
  • 打赏
  • 举报
回复
能解释一下上面的作用吗?

我用下面的语句打出来偏移好大,m_Left赋值2CM,可实际打出来的有2.5CM以上,不知为何会这样?
m_Left * 10 / 25.4 * GetDeviceCaps(lhDC, LOGPIXELSX)
feiyun0112 2009-05-29
  • 打赏
  • 举报
回复
Form.ScaleMode =VbPixels

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
lyserver 2009-05-29
  • 打赏
  • 举报
回复
如果你用API而不是Printer进行打印,那么要打印之前,你得需要进行世界坐标转换,具体代码如下:

Option Explicit

Private Declare Function SetMapMode Lib "gdi32" (ByVal hdc As Long, ByVal nMapMode As Long) As Long
Private Declare Function SetWindowExtEx Lib "gdi32" (ByVal hdc As Long, ByVal nX As Long, ByVal nY As Long, lpSize As Any) As Long
Private Declare Function SetViewportExtEx Lib "gdi32" (ByVal hdc As Long, ByVal nX As Long, ByVal nY As Long, lpSize As Any) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Const MM_ANISOTROPIC = 8
Private Const LOGPIXELSX = 88 ' Logical pixels/inch in X
Private Const LOGPIXELSY = 90 ' Logical pixels/inch in Y

Sub OnPrepareDC(ByVal PrinterDC As Long, ByVal Width As Long, ByVal Height As Long)
Dim xExt As Long, yExt As Long
Dim xLogPixPerInch As Long, yLogPixPerInch As Long

SetMapMode PrinterDC, MM_ANISOTROPIC
SetWindowExtEx PrinterDC, Width, Height, ByVal 0&
xLogPixPerInch = GetDeviceCaps(PrinterDC, LOGPIXELSX)
yLogPixPerInch = GetDeviceCaps(PrinterDC, LOGPIXELSY)
xExt = Width * xLogPixPerInch / 96
yExt = Height * yLogPixPerInch / 96
SetViewportExtEx PrinterDC, xExt, yExt, ByVal 0&
End Sub

其中:PrinterDC表示打印机DC,Width表示纸张的像素宽度,Height表示纸张的像素高度。
Tiger_Zhao 2009-05-29
  • 打赏
  • 举报
回复
dim w as single
w = Form1.ScaleX(80,vbPixels,VbInches) '窗体上将像素换算成英寸'
w = Printer.ScaleX(w,vbInches,vbPixels) '打印机上将英寸换算成像素'

垂直方向用 ScaleY()
xyhello 2009-05-29
  • 打赏
  • 举报
回复
因我使用的是API,单位只能是像素,如何把表单上面的大小换算到打印机的大小呢
Tiger_Zhao 2009-05-29
  • 打赏
  • 举报
回复
像素大小受到设备分辨率的影响,因此 ScaleMode 要选用 毫米、厘米、英寸等。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧