各位大侠:
        我的打印程序如下:
       ::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.   

    CDC包含2个句柄 m_hDC和m_hAtributDC,一个负责屏幕另一个负责打印机的。
    设备分辨率不同。假设在显示器上能显示1毫米,但是在打印机是有可能无法显示出一毫米的。
      

  2.   

    long yExt =(long)size.cy * yLogPixPerInch/75; 
    //这个75是屏幕DC的DPI吗
      

  3.   

    long yExt =(long)size.cy * yLogPixPerInch/75;  
    //这个75是屏幕DC的DPI吗
           是求实际打印机的y向上的长度(以像素为单位)
      

  4.   

    那为什么是除以75啊,也应该是除以实际的屏幕的每英寸的像素数啊,这个75是你通过GetDeviceCaps(LOGPIXELSX)得到的屏幕DC的吗?一般显示器的是96