读书人

打印预览与用虚构打印机打印出来的不一

发布时间: 2013-09-08 15:21:21 作者: rapoo

打印预览与用虚拟打印机打印出来的不一样
在写的是打印的功能,目前的状态就是能够打印我想要的图像,但是打印预览显示的画面很小。网上找资料写的是打印预览传递的dc是打印机的,而我在视图内操作的图像显示到打印机需要进行逻辑转换。但是我用虚拟打印机打印的图像没有问题又是怎么回事?按理说打印预览和打印不是应该一样的画面吗?还有一点就是我执行过一次打印之后再点打印预览就能显示正常一点但还是偏小


想要打印的图像:
打印预览与用虚构打印机打印出来的不一样
操作的视图是带缩放功能的:
打印预览与用虚构打印机打印出来的不一样
视图放大两倍后的图像:
打印预览与用虚构打印机打印出来的不一样
即将执行打印(因为打印初始化代码里我设置了只打印一张)
打印预览与用虚构打印机打印出来的不一样
虚拟打印机打印出来的tif效果:
打印预览与用虚构打印机打印出来的不一样
没执行打印前打印预览的效果:
打印预览与用虚构打印机打印出来的不一样
执行过打印之后的打印预览效果:
打印预览与用虚构打印机打印出来的不一样

上代码(主要是打印设置的部分,onpreparedc里面的注释部分是我用的另一种方法,用了之后打印预览能够正常显示,但是视图缩放失效并且出现图形错位的问题,而且打印出来的图像相当于我视图放大两倍后的画面,只能打印左上角的一部分):



// CSciplotView 打印

BOOL CGDIModeView::OnPreparePrinting(CPrintInfo* pInfo)
{
CZoomView::SetZoomScale(100);




CPrintDialog m_PrintDlg(FALSE);
HDC m_hDC;
m_hDC=m_PrintDlg.CreatePrinterDC();
LPDEVMODE lpDevMode;


PRINTDLG pd=pInfo->m_pPD->m_pd;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4;
lpDevMode->dmOrientation=DMORIENT_LANDSCAPE;//横向打印

/*lpDevMode->dmPaperWidth =1900;
lpDevMode->dmPaperLength =700; */
}
GlobalUnlock(pd.hDevMode);
}
// 默认准备
pInfo->SetMaxPage(1);
pInfo->m_nNumPreviewPages=1;
return DoPreparePrinting(pInfo);
}



void CGDIModeView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{




pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_totalLog);
//pDC->SetWindowExt(m_totalDev);
CPoint pOrg;
pDC->SetViewportExt(m_totalDev);
pOrg = -GetDeviceScrollPosition();
if(m_bCenter)
{
CRect rect;
GetClientRect(&rect);
if(m_totalDev.cx < rect.Width())
pOrg.x = (rect.Width() - m_totalDev.cx) / 2;
if(m_totalDev.cy < rect.Height())
pOrg.y = (rect.Height() - m_totalDev.cy) / 2;
}
pDC->SetViewportOrg(pOrg);
CScrollView::OnPrepareDC(pDC, pInfo);





//CView::OnPrepareDC(pDC,pInfo);
//pDC->SetMapMode(MM_ANISOTROPIC);
//CSize size(800,600);
//pDC->SetWindowExt(size)

//int x=pDC->GetDeviceCaps(LOGPIXELSX);


//int y=pDC->GetDeviceCaps(LOGPIXELSY);
//long xExt=(long)m_totalLog.cx*x/96;
//long yExt=(long)m_totalLog.cy*y/96;
//pDC->SetViewportExt((int)xExt,(int)yExt);






}
void CGDIModeView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: 添加额外的打印前进行的初始化过程
CGDIModeDoc* pDoc = GetDocument();

int npageheight = pDC->GetDeviceCaps(VERTRES);

int npagewidth = pDC->GetDeviceCaps(HORZRES);
//int nmaxpage = max(1,(pDoc-> +npageheight-1)/npageheight);

//pInfo->SetMaxPage(nmaxpage);

}

void CGDIModeView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: 添加打印后进行的清理过程
}

void CGDIModeView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: 添加打印后进行的清理过程

OnDraw(pDC);
}




[解决办法]
void CGDIModeView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: 添加打印后进行的清理过程

OnDraw(pDC);
}
我一般是在OnPrint函数里再调用专门针对打印机的函数代码,就是显示到屏幕的函数和打印的函数是两个,这俩个函数的区别就是分别对屏蔽和打印机进行调整到合适的图像以及设不同的映射模式.因此你是不考虑象我这样做
[解决办法]
祝你成功
你也可以用word试一下打印预览和虚拟打印机
[解决办法]
模式转换,用了么
[解决办法]
两个打印机的分辨率不一样。
[解决办法]
文档视图用打印预览功能属于常规操作
我这里就是因为dialog没有集成打印功能才写了这篇博客

读书人网 >VC/MFC

热点推荐