我用DrawText函数在屏幕上画实现预览功能
然后在纸上打印
但是同样的代码实际打印的右边距却不对那位高人可以给我个答案

解决方案 »

  1.   

    那为什么我在PDF的虚拟打印机上打的是正确的呢
    在真正的纸上打就会右边偏出12毫米
      

  2.   

    需要根据打印机进纸的物理偏移量调整原点的位置。
    PDF虚拟打印机的物理偏移量为0,所以能正确打印。xOffset=GetDeviceCaps(hPrintDC, PHYSICALOFFSETX);
    yOffset=GetDeviceCaps(hPrintDC, PHYSICALOFFSETY);SetViewportOrgEx(hPrintDC, xOffset, yOffset, NULL);
      

  3.   

    你的映身模式设的是什么?建议SetMapMode(hPrintDC, MM_LOMETRIC);

    SetMapMode(hPrintDC, MM_HIMETRIC);
      

  4.   

    int xP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSX);
    直接得x轴每英寸像素点数
      

  5.   

    打印机的DPI与屏幕不同,不能使用默认的模式。
    GetDeviceCaps(memDC.m_hDC, LOGPIXELSX);和GetDeviceCaps(hPrintDC, LOGPIXELSX);的值是不一样的。
      

  6.   

    CDC memDc.Attach(hdcPrint);
    然后在int xP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSX);获得每英寸像素数
    DOUBLE xPix = (DOUBLE)xP*10/254;
    再获得每毫米像素数
    然后再按照纸张的大小画在纸上的
      

  7.   

    我按照楼上高人说的作了
    SetMapMode(hPrintDC, MM_LOMETRIC);
    然后用memDC.TextOut(1000, -200, (LPCTSTR)csTitle);画出来
    应该是从左边1000毫米写东西
    但还是差了1厘米多
    不知为什么
      

  8.   

    1、你的hPrintDC是怎么获取的?
    2、memDC的映射模式是否也设为了MM_LOMETRIC?
      

  9.   

    HDC hdcPrint = GetDefaultPrinterDC();
    MemDc.Attach(hdcPrint);
    SetMapMode(MemDc.m_hDC, MM_LOMETRIC);都设了啊
      

  10.   

    HDC hdcPrint = GetDefaultPrinterDC();
    MemDc.Attach(hdcPrint);
    SetMapMode(MemDc.m_hDC, MM_LOMETRIC);
    DOUBLE xOffset=GetDeviceCaps(memDC.m_hDC, PHYSICALOFFSETX);
    DOUBLE yOffset=GetDeviceCaps(memDC.m_hDC, PHYSICALOFFSETY);
    DOUBLE DD = SetViewportOrgEx(memDC.m_hDC, (int)xOffset, (int)yOffset, NULL);
    memDC.StartPage();
    CFont Title;
    Title.CreateFont(-MulDiv(24,memDC.GetDeviceCaps(VERTSIZE),72),
            0,0,0,FW_HEAVY,0,0,0,GB2312_CHARSET,
            OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
                     VARIABLE_PITCH|FF_SWISS,_T("黑体"));
    memDC.TextOut(1000, -200, (LPCTSTR)csTitle);
    memDC.EndDoc();
    大致上是这样
      

  11.   

    HDC hdcPrint = GetDefaultPrinterDC(); //需保证能够正确获取打印DCint xOffset=::GetDeviceCaps(hdcPrint, PHYSICALOFFSETX);
    int yOffset=::GetDeviceCaps(hdcPrint, PHYSICALOFFSETY);
    DOCINFO docInfo={sizeof(DOCINFO)};
    docInfo.lpszDocName="my print test";
    docInfo.lpszOutput=NULL;
    docInfo.lpszDataType=NULL;
    docInfo.fwType=0;int nMapMode=SetMapMode(hdcPrint, MM_LOMETRIC);
    POINT pt;
    SetViewportOrgEx(hdcPrint, xOffset, yOffset, &pt);
    HFONT hFont=CreateFont(-80, 0, //即然已映射模式已设为MM_LOMETRIC,直接指定字体高度为为所需的mm数
    0,0,0,FW_HEAVY,0,0,0,GB2312_CHARSET,
            OUT_STROKE_PRECIS,CLIP_DEFAULT_PRECIS,DRAFT_QUALITY,
                     VARIABLE_PITCH|FF_SWISS,_T("黑体"));
    hFont=(HFONT)SelectObject(hdcPrint, hFont);::StartDoc(hdcPrint, &docInfo);
    ::StartPage(hdcPrint);
    ::TextOut(hdcPrint, 1000, -200, (LPCTSTR)csTitle);
    ::EndPage(hdcPrint);
    ::EndDoc(hdcPrint);
    hFont=(HFONT)SelectObject(hdcPrint, hFont);
    DeleteObject(hFont);SetMapMode(hdcPrint, nMapMode);
    SetViewportOrgEx(hdcPrint, pt.x, pt.y, NULL);
      

  12.   


    SetViewportOrgEx(hdcPrint, -xOffset, -yOffset, &pt);
      

  13.   

    公司打印机坏了
    没法测试了为什么用xOffset的负值啊
      

  14.   

    SetViewportOrgEx是设置打印机视口的原点(用设备单位来表示)。
    SetWindowOrgEx是以逻辑单位表示的窗口的原点.TextOut(hdcPrint, xPos, yPos,...);是从原点开始 偏移xPos和yPos个单位。
    打印机进纸时已偏移了xOffset个单位, 如果不修正这一偏移时,打印机会以当前位置为原点,根据你指定的位置输出内容。-xOffset是将原点移回至实际的页边上。