究竟是我是面瓜,还是BCB是面瓜?

futurefu 2001-01-03 10:52:00
我用BCB5开发一个图像打印功能,使用TPRINTER类,一幅800X600象素的位图在A4纸张上打印却只有豆腐干大小,使用的是如下代码:
TPrinter *SysPrinter = new TPrinter ;
……
SysPrinter->BeginDoc();
SysPrinter->Canvas->Draw(iLeft, iTop, PrintBmp);
SysPrinter->EndDoc();
后改用
……
SysPrinter->Canvas->StretchDraw(rBmp, PrintBmp);
……
结果虽然图像的大小问题解决,但图形质量惨不忍睹。
我后来准备依据打印纸张大小先建立一个TBitmap,在将原位图Stretch到新位图,最后再打印,但对TBITMAP宽、高附值达到几千时就出错,可能是系统不让生成太大的位图。目前我打算将原位图先切成几块,再分别Stretch,分别在相应位置打印。但总觉得应该有更好的算法。心有不甘,特向众位高人求教。
...全文
189 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
futurefu 2001-01-05
  • 打赏
  • 举报
回复
感谢各位热心帮助我,目前我的问题已经解决,BCB对图像打印的支持似乎不是很好,抑或是我没有找到关键所在,反正我是通过API解决的。我本人是绝对支持BORLAND产品的,但好象BCB在某些方面有点问题,希望是因为我使用的是DB的原因。虽然本人颇费周折完成了代码,但我还是要万分感谢大家,分数还是会给大家的,不要相互抢啊。Happy new year!
乱码 2001-01-04
  • 打赏
  • 举报
回复
补充:用winAPI得到打印机的分辨率后,就可以结合上面的
公式(公式有错,应该是实际尺寸(单位:英寸)×分辨率 = 要打印的点数)和画点的方法打印了。
实际尺寸 = 图像尺寸 ÷ 图像的分辨率
如果你想得到和屏幕上看到的效果一样,那么 图像的分辨率 = 72或者96
乱码 2001-01-04
  • 打赏
  • 举报
回复
直接用win API,好久没用win32编程了,想不起来了。关键是得到打印机的分辨率!
通常显示器的分辨率是72dpi,而喷墨打印机是300dpi或者更低,激光打印机是600dpi还有更高的。
想用点数来控制打印,可以用下面的公式来计算(你自己来换算单位吧)
纸张的大小(单位:英寸)×分辨率 = 要打印的点数
futurefu 2001-01-04
  • 打赏
  • 举报
回复
难道是BCB有问题,在SetMapMode打印机为MM_LOENGLISH之后,虽然函数执行成功了,但打印机还是以象素为单位。真是以不变应万变。
xubin_sh 2001-01-03
  • 打赏
  • 举报
回复
用SetMapMode设成MM_LOENGLISH
xubin_sh 2001-01-03
  • 打赏
  • 举报
回复
老兄的比例不对,在打印机上不能用像素为单位,否则就小的一丁点
futurefu 2001-01-03
  • 打赏
  • 举报
回复
StreathDraw方法是绝对不行的,我在前面已经试过了。
xubin_sh 2001-01-03
  • 打赏
  • 举报
回复
有道理
comanche 2001-01-03
  • 打赏
  • 举报
回复
老兄是你豆腐干了,
位图打印时有 DDB(设备相关)和DIB(设备不想关)一说
不过这一说在下也有所尝试,说实话MS的DIB倒底有没混水?就在DDB前加个色板,操作 Printer时,没什么用,也不知道是不是我有问题,反正我是找不到有什么办法可以让显示的跟打印的一样。所以现下只好GetDeviceCaps得到设备DPI, 再 / 72后, 总之算一算后用 StreathDraw画到 Printer->Canvas 上,不知CSDN上兄弟们有啥更好方法
futurefu 2001-01-03
  • 打赏
  • 举报
回复
SetMapMode(SysPrinter->Handle ,MM_LOENGLISH) ;
之后仍然是豆腐干一块。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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