1、我的工程在打印时,通过GetClientRect(&rect);而后在rect.right范围内打印曲线(横向打印),结果打印出来的图,只在纸的左边区域,右侧大概1/5区域是空白的,打印曲线的点是800点。
2、我尝试把rect.right扩大一个倍数,发现,放大足够倍数后,能够将曲线打印到全部区域,但是相应的问题又出现了。
    放大1.5倍:rect.right =rect.right*1.5; 在整张纸上打印了478点
    放大1.3倍:    rect.right =rect.right*1.3; 在整张纸上打印了565点 
    这个倍数对于不同的打印设置肯定是不一样的,即使我找出一个特别合适的比例(应该小于1.3),换台机器可能就不行了。
3、我尝试获取打印尺寸
    int   cxPage   =   dc->GetDeviceCaps(HORZRES);//   获取打印页面的水平宽度(象素)
而后用这个尺寸与rect.right相比,即 int zommindex =  dc->GetDeviceCaps(HORZRES)/rect.right;这个值求出来是2,这就更不对了。另外说明一下,我设置了onprepareDC函数
void CYuhtView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
  if(pDC->IsPrinting())   //横向打印
  {   
  LPDEVMODE   pDevMode;   
  pDevMode=pInfo->m_pPD->GetDevMode();   
  pDevMode->dmOrientation=DMORIENT_LANDSCAPE;   
  pDC->ResetDC(pDevMode);   
  }     CView::OnPrepareDC(pDC, pInfo);    long iLogPixelX=pDC->GetDeviceCaps(LOGPIXELSX);
    long iLogPixelY=pDC->GetDeviceCaps(LOGPIXELSY);    pDC->SetMapMode(MM_ANISOTROPIC);                     //转换坐标映射方式、确定窗口大小  
    CSize size = CSize(6000, 5000); //这个值不知道是什么意思,改动以后,好像没有变化  
    pDC->SetWindowExt(size); 
    
    int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX); //得到实际设备每逻辑英寸的象素数量     
     int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);   
    
    
    long xExt = (long)size.cx *xLogPixPerInch/96;        //得到设备坐标和逻辑坐标的比例  
     long yExt = (long)size.cy *yLogPixPerInch/96;   
     pDC->SetViewportExt((int)xExt, (int)yExt);}请高手指点。

解决方案 »

  1.   

    看了一下你的代码,OnDraw函数中有问题,循环次数过多(在窗口外多画了很多线),给你改了一下:
    void CPrintLeftView::OnDraw(CDC* pDC)
    {
    CPrintLeftDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc); CRect rect;
    GetClientRect(&rect);
    CPoint prePoint,nextPoint;
    CPoint prexGrid,nextxGrid;
    CPoint preyGrid,nextyGrid;
    prexGrid.x=0;
    prexGrid.y=0;
    nextxGrid.x=rect.Width();
    nextxGrid.y=0;
    CPen newPen;
    newPen.CreatePen(PS_DOT, 1, RGB(220, 220, 220));
    CPen* pOldPen = pDC->SelectObject(&newPen);
    CPen BoldLine(PS_SOLID, (int)1.5, RGB(220,220,220)); int x_times=3;
    for(int i=0;i*100<rect.Height();i++)//画背景横线 
    {
    if(i%5==0)
    {
    pDC->SelectObject(&BoldLine); 
    pDC->MoveTo(prexGrid); 
    pDC->LineTo(nextxGrid);  pDC->SelectObject(&newPen); 

    else 

    pDC->MoveTo(prexGrid); 
    pDC->LineTo(nextxGrid);  } 
    prexGrid.y = prexGrid.y+100;//60/x_times; 
    nextxGrid.y = nextxGrid.y+100;//60/x_times; 

    pDC->SelectObject(pOldPen); 
    preyGrid.x=0; 
    preyGrid.y=0; 
    nextyGrid.x=0; 
    nextyGrid.y=rect.Height();  for(int i=0;i*120<rect.Width();i++)//画背景竖线 

    if(i%5==0)//5小格等于1大格 

    pDC->SelectObject(&BoldLine); 
    pDC->MoveTo(preyGrid); 
    pDC->LineTo(nextyGrid); 
    pDC->SelectObject(pOldPen); 

    else 
    {  pDC->SelectObject(&newPen); 
    pDC->MoveTo(preyGrid); 
    pDC->LineTo(nextyGrid); 
    pDC->SelectObject(pOldPen); 
    }  preyGrid.x=preyGrid.x+120; 
    nextyGrid.x=nextyGrid.x+120; 
    } }void CPrintLeftView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
    {
    if (pDC->IsPrinting())
    {
    LPDEVMODE dm = pInfo->m_pPD->GetDevMode();
    dm->dmOrientation = DMORIENT_LANDSCAPE;
    pDC->ResetDC(dm);
            // 约束长宽比例缩放
    RECT rc;
    GetClientRect(&rc);
    int ppiX = pDC->GetDeviceCaps(LOGPIXELSX);
    int ppiY = pDC->GetDeviceCaps(LOGPIXELSY);
    int pixelsX = pDC->GetDeviceCaps(HORZRES);
    int pixelsY = pDC->GetDeviceCaps(VERTRES);
    double inchX = (double)pixelsX/ppiX;
    double inchY = (double)pixelsY/ppiY;
    double scaleX = inchX*96/rc.right;
    double scaleY = inchY*96/rc.bottom;
    double scale = min(scaleX, scaleY); pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetWindowExt(rc.right, rc.bottom);
    pDC->SetViewportExt(scale*rc.right/96*ppiX, scale*rc.bottom/96*ppiY);
    }   CView::OnPrepareDC(pDC, pInfo); 
    }
      

  2.   

    我在打印输出时, 一般采用默认坐标映射, 1英寸=1440点.
    比如从距顶边0.5英寸,左边0.5英寸处打印一条2英寸的横线.
    pDC->MoveTo( (int)(0.5 * 1440), (0.5 * 1440) );
    pDC->LineTo( (int)(2.5 * 1440), (0.5 * 1440) );
    这种方式我试过多种打印机, 多种打印分辨率的情况下,打印出的线不会有大的变化.你可以根据打印的页边距, 计算打印范围内的像素点, 再根据打印的像素点和屏幕像素点计算出一个系数, 在打印时将屏幕像素乘上这个系数输出, 基本上就没错了.
      

  3.   

    //Y坐标应该为负
    pDC->MoveTo( (int)(0.5 * 1440), (int)(-0.5 * 1440) );
    pDC->LineTo( (int)(2.5 * 1440), (int)(-0.5 * 1440) );
      

  4.   

    你打印机的DC要和内存中的DC比例对应起来的!
    不然你打印机输出的比例肯定有问题!
    我以前也遇到过比例问题
    这个东西只能根据自己输出情况然后算好比例
      

  5.   

    double scale = min(scaleX, scaleY);
    我改成
    double scale = max(scaleX, scaleY);
    就能画出正确的图了,您看对不对 
      

  6.   

    我贴的这段代码是分别计算按宽度和按高度把视图客户区缩放到整个页面的缩放比例,用min的用意是确保打印的内容不超出页面,这样就会有一条空白;如果用max是不会有空白,但会有部分内容超出页面。如果你想把视图客户区内容缩放到整个页面而不约束长宽比例,就不需要计算scale了,改成这样就可以:
    pDC->SetViewportExt(pixelsX, pixelsY);
      

  7.   

    我还是需要约束比例,但是我希望我画出的格子横纵都是整数个,不要有线头出来,该怎么做呢,部分内容还会超出页面。能够在取max时也不超出或者说打印时看上去不超出呢
      

  8.   

    上面的代码是根据视图的客户区大小来计算的,可以在GetClientRect(&rc)之后加上这两行代码:
    rc.right = rc.right/120*120;
    rc.bottom = rc.bottom/100*100;
      

  9.   

    加了上面两句后,左右是封闭的,但是下方没有封闭,是不是和纵向的scale不对有关系?
      

  10.   

    计算会有一点误差,可以把高度和宽度稍稍调整一下试试,例如:
    rc.right = rc.right/120*120 + 1;
    rc.bottom = rc.bottom/100*100 + 1;