各位大侠:
我的打印程序如下:
::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;
}就是打印结果与打印预览、虚拟打印都不一样!!!!
我的打印程序如下:
::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;
}就是打印结果与打印预览、虚拟打印都不一样!!!!
设备分辨率不同。假设在显示器上能显示1毫米,但是在打印机是有可能无法显示出一毫米的。
//这个75是屏幕DC的DPI吗
//这个75是屏幕DC的DPI吗
是求实际打印机的y向上的长度(以像素为单位)