程序使用了MFC默认的打印机制,只是在OnprepareDC中修改了映射模式,原来的映射模式是Anisotropic,设置了窗口大小和视口大小,打印和预览都正常。
现在改成了lometric,打印时要打印65535页才罢休,其实只有第一页有用,后面全是空白的,设置窗口和视口大小好像也不管用。
这是怎么回事?各位大侠救救我啊,很急,马上就要交活了,汗!

解决方案 »

  1.   

    现在改成了lometric,打印时要打印65535页才罢休
    ==那么预览呢?你如何计算打印页数的?
      

  2.   

    预览也预览不了,要等很长时间让它形成这么多页的预览,所以几乎不可能预览。
    我没有手动设置分页,是用的MFC的默认机制,因为我的程序基本上不用分页的,所以这部分就没做。
    现在该怎么办呢?
      

  3.   

    变量溢出
    unsigned short us=-1;   //最后等于65535
      

  4.   

    代码如下,主要这几个两个函数,其他的基本没动,OnDraw里面的和其它函数有联系,但是应该不影响打印的。高手给看看原因,分不够另加!
    void CMyView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
    {
    // TODO: Add your specialized code here and/or call the base class

    // CScrollView::OnPrepareDC(pDC, pInfo); pDC->SetMapMode(MM_HIMETRIC); /////test

    pDC->SetWindowExt(10000, 10000); m_pDC=pDC; ///////
    }
    void CMyView::OnDraw(CDC* pDC)
    {
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc); CDC dc;
    CDC* pDrawDC = pDC;
    CBitmap bitmap;
    CBitmap* pOldBitmap = 0; // only paint the rect that needs repainting
    CRect client;
    pDC->GetClipBox(client);
    CRect rect = client;
    DocToClient(rect); if (!pDC->IsPrinting())
    {
    // draw to offscreen bitmap for fast looking repaints
    if (dc.CreateCompatibleDC(pDC))
    {
    if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
    {
    OnPrepareDC(&dc, NULL);
    pDrawDC = &dc; // offset origin more because bitmap is just piece of the whole drawing
    dc.OffsetViewportOrg(-rect.left, -rect.top);
    pOldBitmap = dc.SelectObject(&bitmap);
    dc.SetBrushOrg(rect.left % 8, rect.top % 8); // might as well clip to the same rectangle
    dc.IntersectClipRect(client);
    }
    }

    // paint background
    CBrush brush;
    if (!brush.CreateSolidBrush(pDoc->GetPaperColor()))
    return; brush.UnrealizeObject();
    pDrawDC->FillRect(client, &brush);
    } if (!pDC->IsPrinting() && m_bGrid)
    DrawGrid(pDrawDC); pDoc->Draw(pDrawDC, this); if (pDrawDC != pDC)
    {
    pDC->SetViewportOrg(0, 0);
    pDC->SetWindowOrg(0,0);
    pDC->SetMapMode(MM_TEXT);
    dc.SetViewportOrg(0, 0);
    dc.SetWindowOrg(0,0);
    dc.SetMapMode(MM_TEXT);
    pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
    &dc, 0, 0, SRCCOPY);
    dc.SelectObject(pOldBitmap);
    }
    }