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

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;
}

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

...全文
94 点赞 收藏 9
写回复
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毫米,但是在打印机是有可能无法显示出一毫米的。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告