为什么实际打印结果与虚拟打印结果不一致

wmswxpmyl 2010-07-08 08:39:20
各位大侠:
我的打印程序如下:
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = "printer";
di.lpszOutput=NULL;
GetProfileString("windows","device",",,,",szprinter,80);
// 将设备字符串分解   
if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&&NULL!=(szOutput=strtok(NULL,",")))
{
hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL);
printdc.Attach(hdcprint);
printdc.m_bPrinting=TRUE;
printdc.SetMapMode(MM_ANISOTROPIC );

CSize size =CSize(1024,768);
printdc.SetWindowExt(size);//确定窗口大小
//得到实际设备每逻辑英寸的像素数量
int xLogPixPerInch =printdc.GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch =printdc.GetDeviceCaps(LOGPIXELSY);
//得到设备坐标和逻辑坐标的比例
long xExt =(long)size.cx * xLogPixPerInch/75;
long yExt =(long)size.cy * yLogPixPerInch/75;
printdc.SetViewportExt((int)xExt,(int)yExt);//确定视口大小DPtoLP
printdc.SetViewportExt(size);
printdc.SetWindowOrg(0,0);
printdc.SetViewportOrg(0,0);
nHorRes = printdc.GetDeviceCaps(HORZRES);
nVerRes = printdc.GetDeviceCaps(VERTRES);
pageend_y = nVerRes - 200;
pageend_x=nHorRes-200;


printdc.StartDoc(&di);
printdc.StartPage();
printdc.TextOut(100,100,"省道S302 K153超限超载检测站");
printdc.TextOut(1050,290,"检测报告单");
printdc.MoveTo(1000,350);
printdc.LineTo(1380,350);
printdc.MoveTo(1000,360);
printdc.LineTo(1380,360);
// printdc.SelectObject(&DetailFont);
printdc.TextOut(1780,310,"单位 : 吨");
pageend_y=pageend_y-600;
int tableheight=pageend_y/2-pos_y;
int tablewidth=pageend_x-pos_x;

printdc.MoveTo(pos_x,pos_y);
printdc.LineTo(pageend_x,pos_y);
printdc.LineTo(pageend_x,pageend_y/2);
printdc.LineTo(pos_x,pageend_y/2);
printdc.LineTo(pos_x,pos_y);
printdc.MoveTo(pos_x,pos_y+tableheight/7);
printdc.LineTo(pageend_x,pos_y+tableheight/7);
printdc.MoveTo(pos_x,pos_y+tableheight*2/7);
printdc.LineTo(pageend_x,pos_y+tableheight*2/7);
printdc.MoveTo(pos_x,pos_y+tableheight*3/7);
printdc.LineTo(pageend_x,pos_y+tableheight*3/7);
printdc.MoveTo(pos_x,pos_y+tableheight*4/7);
printdc.LineTo(pageend_x,pos_y+tableheight*4/7);
printdc.MoveTo(pos_x,pos_y+tableheight*5/7);
printdc.LineTo(pageend_x,pos_y+tableheight*5/7);
printdc.MoveTo(pos_x,pos_y+tableheight*6/7);
printdc.LineTo(pageend_x,pos_y+tableheight*6/7);


printdc.MoveTo(pos_x+2*m_itemy+235,pos_y);
printdc.LineTo(pos_x+2*m_itemy+235,pageend_y/2);
printdc.TextOut(pos_x+m_itemy,pos_y+2*m_itemy,"检测日期");
printdc.TextOut(pos_x+m_itemy,pos_y+tableheight/7+2*m_itemy,"检测编号");
printdc.TextOut(pos_x+m_itemy,pos_y+tableheight*2/7+2*m_itemy,"整车重量");
printdc.TextOut(pos_x+m_itemy,pos_y+tableheight*3/7+2*m_itemy,"轴总重");
printdc.TextOut(pos_x+m_itemy,pos_y+tableheight*4/7+2*m_itemy,"单轴重量");
printdc.TextOut(pos_x+m_itemy,pos_y+tableheight*5/7+2*m_itemy,"卸 载");
printdc.TextOut(pos_x+m_itemy,pos_y+tableheight*6/7+2*m_itemy,"路产补偿费"

return true;
}
else
{
return false;
}

就是打印结果与打印预览、虚拟打印都不一样!!!!

...全文
231 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmswxpmyl 2010-07-10
  • 打赏
  • 举报
回复
long yExt =(long)size.cy * yLogPixPerInch/75;
//这个75是屏幕DC的DPI吗


是求实际打印机的y向上的长度(以像素为单位)
zxdlms 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wmswxpmyl 的回复:]
long yExt =(long)size.cy * yLogPixPerInch/75;
//这个75是屏幕DC的DPI吗


是求实际打印机的y向上的长度(以像素为单位)
[/Quote]那为什么是除以75啊,也应该是除以实际的屏幕的每英寸的像素数啊,这个75是你通过GetDeviceCaps(LOGPIXELSX)得到的屏幕DC的吗?一般显示器的是96
wmswxpmyl 2010-07-09
  • 打赏
  • 举报
回复
看来没有高手了啊 !!!!
zxdlms 2010-07-09
  • 打赏
  • 举报
回复
long yExt =(long)size.cy * yLogPixPerInch/75;
//这个75是屏幕DC的DPI吗

BlueMap 2010-07-09
  • 打赏
  • 举报
回复
我也研究过这个,但是因为没有打印机也就没法测试。
对于你的问题原因是打印机分辨率与屏幕分辨率不一致,要进行一定的缩放。
如打印机分辨率为1000点每英寸而屏幕分辨率为100个点每英寸的话,原本在屏幕上绘制点(100,100)在打印机上就应该是(100*10,100*10)。
wmswxpmyl 2010-07-08
  • 打赏
  • 举报
回复
各位大侠:
那我这段程序怎么改呢啊 ?
sunyouhao 2010-07-08
  • 打赏
  • 举报
回复
分辨率不同,同一个字符串在屏幕上显示的宽度和在打印设备上的宽度和高度是不同的,如果代码里面有涉及到用宽度和高度计算的时候,如坐标变换等,则在打印后台应该获取打印设备上字符串的宽度和高度等来计算,在屏幕上用屏幕设备的宽度和高度来计算。
chen_freecom 2010-07-08
  • 打赏
  • 举报
回复
帮顶,JF
suling2002 2010-07-08
  • 打赏
  • 举报
回复
CDC包含2个句柄 m_hDC和m_hAtributDC,一个负责屏幕另一个负责打印机的。
设备分辨率不同。假设在显示器上能显示1毫米,但是在打印机是有可能无法显示出一毫米的。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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