在写的是打印的功能,目前的状态就是能够打印我想要的图像,但是打印预览显示的画面很小。网上找资料写的是打印预览传递的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);
}

解决方案 »

  1.   

    void CGDIModeView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
        // TODO: 添加打印后进行的清理过程
     
        OnDraw(pDC);
    }
    我一般是在OnPrint函数里再调用专门针对打印机的函数代码,就是显示到屏幕的函数和打印的函数是两个,这俩个函数的区别就是分别对屏蔽和打印机进行调整到合适的图像以及设不同的映射模式.因此你是不考虑象我这样做
      

  2.   

    本帖最后由 VisualEleven 于 2013-08-02 15:20:56 编辑
      

  3.   

    祝你成功
    你也可以用word试一下打印预览和虚拟打印机
      

  4.   

    虚拟打印机貌似没有问题···word可行。但我的程序为什么是这样的啊···郁闷。
      

  5.   

    我这里有一个用MFC打印框架做的例子
    不知道会不会对你有帮助
    http://blog.csdn.net/xianglitian/article/details/5960970
      

  6.   

    我是不是应该重写一下OnFilePrintPreview这个函数???如果要重写的话又应该怎么写?
      

  7.   

    我是不是应该重写一下OnFilePrintPreview这个函数???如果要重写的话又应该怎么写?你可以用我博客里的写法试试
      

  8.   

    MFC默认的打印机分辨率是传统的打印机的吧,然后我这边用的虚拟打印机又是怎么回事啊???
      

  9.   

    我是不是应该重写一下OnFilePrintPreview这个函数???如果要重写的话又应该怎么写?你可以用我博客里的写法试试
    写不好啊,用文档/视图的方法去解决我这个问题的话需要怎么去做呢???
      

  10.   

    文档视图用打印预览功能属于常规操作
    我这里就是因为dialog没有集成打印功能才写了这篇博客
      

  11.   

    我刚才发现了一些问题,我把虚拟打印机的dpi设置成100(原来默认的是200)之后打印预览显示正常然后打印的效果变成了
    这个又是怎么回事????
      

  12.   

    小号继续自顶。
    现在我遇到的问题是两个分辨率不同的问题,然后我对程序void CGDIModeView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
    // TODO: 添加打印后进行的清理过程
    CView::OnPrepareDC(pDC,pInfo);
    pDC->SetMapMode(MM_ANISOTROPIC);
    int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); //得到屏幕分辨率的宽和高
    int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
    CSize size = CSize(nScreenWidth, nScreenHeight);
    //CSize size(800,600);
    pDC->SetWindowExt(size);
    改动了这一部分,然后虚拟打印机调到标准200dpi的分辨率打印就正常了,但是打印预览是这个样子的