已有140人关注
使用CPrintDialog编写打印程序时打印预览与实际打印效果不一致
发表在C语言答疑区 2017-03-01
是否精华
版块置顶:

我最近编了一个串口接受的上位机程序,低层用的是ARM STM32,上位机用的是VC6.0,开发语言:C++,一切比较顺利,上位机与下位机已经能正常通信,我又加了一个功能,就是用CPrintDialog编了一个打印程序,把下位机发上来的数据打印出来,程序代码完全按照明日科技“Visual  C++开发技术大全”(人民邮电出版社,2007年3月第一版,这本书我在网上看到有第二版,但我最近买的是第一版)第19章“发票打印”编写的,具体位置为:光盘\mingrisoft\dxyy\19\04\02,现在出现了一个问题:我想在一行汉字下画一条横线,打印预览正常,但实际打印出的效果是横线总和汉字错开,如下图

画线代码:就是使用MoveTo和LineTo,我使用的操作系统是W7,不是W2000,我自己查了7 、8天,也上网找了很多资料,我自己认为可能有4个方面的原因:1、逻辑坐标与设备坐标映射方式不对。2、打印转换比例不对,原程序比例为ratex=(double)printx/screenx,ratey=(double)printy/screeny。3、操作系统不同造成,原程序使用W2000,我用的是W7。4、打印机设置不同。其中原因1、2、4我都已经试过很多次,把映射模式改为8种中 的任何一种都不对,打印机使用过HP1106,HP400,EPSON100,打印比例因为对MFC底层打印不是很清楚,只是简单的修改打印原点,比例系数,效果都不理想,现在只剩操作系统没试,因为一时找不到W2000系统,加上不知是否原因,很纠结,另外我把原“发票程序”源代码在W7操作系统的VC6.0下运行,打印效果也不对,如下图

发票打印.png憋的实在难受,我是搞下位机硬件开发的,有点束手无策了,请编程高手指点迷津,不胜感谢!!!

分享到:
精彩评论 11
wqjhj
学分:10 LV2
2017-03-01
沙发

没有人遇到过这个问题吗?在编写打打印程序时,精确画线,这是最基本也是是最重要的问题,只有这样才能制表啊!没有人回吗?

again
学分:250 LV4
2017-03-01
板凳

wqjhj 发表于2017-03-01 15:20

没有人遇到过这个问题吗?在编写打打印程序时,精确画线,这是最基本也是是最重要的问题,只有这样才能制表啊!没有人回吗?

能否把能够运行的工程发上来看一下?


如果打印结果有明显一致的偏移,那就加一个反向的偏移好了。

wqjhj
学分:10 LV2
2017-03-01
地板

谢谢again老师的回复!我现在医院护理病人,我明天上午会上传”发票打印“的工程文件。我之所以在明曰科技的网站上发帖,是因为我所参考的源代码是你们公司出版的书,你们应该对这个源代码比较熟悉!我在前帖中已说明,书中的源代码在W7操作系统,VC6.0下打印也和预览不一样!这就说明或者源代码有错,或者是操作系统不同造成的!另外我今天又看了一下光盘说明,源代码操作统是windows server2003,不是w2000

wqjhj
学分:10 LV2
2017-03-01
4L

该打印程序是首先获得打印机的设备环境DC,

然后利用MoveTo函数设置一个做标,在此坐标位置画线,并不是利用偏移量画线,因此不存在利用反向偏移消除误差。

wqjhj
学分:10 LV2
2017-03-02
5L

这是书中发票打印的源代码,在CPreview类中的OnPraint函数中获得屏幕的分辨率,在打印按钮的响应函数中获得打印机的DC,打印预览与打印都调用CPreview中的成员函数DRawReport函数,比例因子也在该函数中,其余的就是制表代码了,麻烦again老师看一下代码,问题到底出在哪,非常感谢!!!

fapiao.rar

again
学分:250 LV4
2017-03-02
6L

wqjhj 发表于2017-03-02 09:58

这是书中发票打印的源代码,在CPreview类中的OnPraint函数中获得屏幕的分辨率,在打印按钮的响应函数中获得打印机的DC,打印预览与打印都调用CPreview中的成员函数DRawReport函数,比例因子也在该函数中,其余的就是制表代码了,麻烦again老师看一下代码,问题到底出在哪,非常感谢!!!

fapiao.rar

blob.png

again
学分:250 LV4
2017-03-02
7L

明日科技的项目很多。


您可以调试一下:

void CPreview::DrawReport(CRect rect, CDC *pDC, BOOL isprinted)

在这个函数里面 下断点一步一步的跟踪,看看计算出来的坐标是否正确。

窗口的左上角是 坐标的(0,0)点。 向右是x坐标增加,向下是y坐标增加。


我现在使用的 Win7 64位系统,打印预览没有问题 。

wqjhj
学分:10 LV2
2017-03-02
8L

again老师:我说的“打印预览”,是真正在打印机上的打印预览,或者真正用打印机打一下,此时实际输出的发票和对话框上有一个““打印预览”,通过此按钮会显示发票的样子,这二者是不同的!!!原程序对话框中有一个“打印预览”按钮,实际上就是通过调用 dlg.DoModal(); 创建一个对话框,dlg 在CFapiaoDlg中定义:CPreview dlg;说白了,该对话框上的“打印预览”按钮,就是在一个对话框窗体上制表,然后显示在屏幕上!并不是真正打印机上的打印预览!我不知道我说明没有!实在不行,您装一台打印机,一打印就知道我说什么了!

wqjhj
学分:10 LV2
2017-03-03
9L

忙活了两天两宿,稍微有点进展,在EPSON100打印机上打印,横线与汉字已经不错开了!但是换了另一种型号打印机,又出现了错开的现象!重新调整程序,又可以准确把横线划到汉字下面!但这不是解决问题的正道啊!你怎么可能因为客户使用了不同型号的打印机,打印效果就不同呢!论坛里有没有搞研发出身的程序员啊,好像很多初学者!

wqjhj
学分:10 LV2
2017-03-03
10L

另外应该是源程序代码有问题!

首页上一页 12 下一页尾页 11 条记录 1/2页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照