程序使用了MFC默认的打印机制,只是在OnprepareDC中修改了映射模式,原来的映射模式是Anisotropic,设置了窗口大小和视口大小,打印和预览都正常。
现在改成了lometric,打印时要打印65535页才罢休,其实只有第一页有用,后面全是空白的,设置窗口和视口大小好像也不管用。
这是怎么回事?各位大侠救救我啊,很急,马上就要交活了,汗!
现在改成了lometric,打印时要打印65535页才罢休,其实只有第一页有用,后面全是空白的,设置窗口和视口大小好像也不管用。
这是怎么回事?各位大侠救救我啊,很急,马上就要交活了,汗!
==那么预览呢?你如何计算打印页数的?
我没有手动设置分页,是用的MFC的默认机制,因为我的程序基本上不用分页的,所以这部分就没做。
现在该怎么办呢?
unsigned short us=-1; //最后等于65535
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);
}
}