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

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



...全文
1211 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
line_us 2013-08-04
  • 打赏
  • 举报
回复
看看到底怎样解决。
笨Ben奔犇 2013-08-04
  • 打赏
  • 举报
回复
如何才能够拍出打印机的干扰因素,让程序的打印功能能够试用于一般的正常的打印机呢?
鎮元齋 2013-08-03
  • 打赏
  • 举报
回复
小号继续自顶。
现在我遇到的问题是两个分辨率不同的问题,然后我对程序
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的分辨率打印就正常了,但是打印预览是这个样子的
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
感觉就是我的打印预览和打印的精细度是差一个档次啊!这也是为什么我之前对图像进行逻辑转换后打印预览正常了但打印就太大了,怎么解决这个问题啊?
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
我刚才发现了一些问题,我把虚拟打印机的dpi设置成100(原来默认的是200)之后打印预览显示正常

然后打印的效果变成了
这个又是怎么回事????
hdg3707 2013-08-02
  • 打赏
  • 举报
回复
void CGDIModeView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { // TODO: 添加打印后进行的清理过程 OnDraw(pDC); } 我一般是在OnPrint函数里再调用专门针对打印机的函数代码,就是显示到屏幕的函数和打印的函数是两个,这俩个函数的区别就是分别对屏蔽和打印机进行调整到合适的图像以及设不同的映射模式.因此你是不考虑象我这样做
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
引用 19 楼 xianglitian 的回复:
[quote=引用 18 楼 zyb238909 的回复:] [quote=引用 17 楼 xianglitian 的回复:] 文档视图用打印预览功能属于常规操作 我这里就是因为dialog没有集成打印功能才写了这篇博客
额···那我这个常规操作里的打印预览和打印的传参又怎么解决啊?[/quote]这个随便百度一下就有很多资料吧[/quote] 没啊···我这个奇葩问题就是照着网上的教程搞出来的= =···你看看我前面贴的代码,代码方面的问题有哪些啊?
向立天 2013-08-02
  • 打赏
  • 举报
回复
引用 18 楼 zyb238909 的回复:
[quote=引用 17 楼 xianglitian 的回复:] 文档视图用打印预览功能属于常规操作 我这里就是因为dialog没有集成打印功能才写了这篇博客
额···那我这个常规操作里的打印预览和打印的传参又怎么解决啊?[/quote]这个随便百度一下就有很多资料吧
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
引用 17 楼 xianglitian 的回复:
文档视图用打印预览功能属于常规操作 我这里就是因为dialog没有集成打印功能才写了这篇博客
额···那我这个常规操作里的打印预览和打印的传参又怎么解决啊?
向立天 2013-08-02
  • 打赏
  • 举报
回复
文档视图用打印预览功能属于常规操作 我这里就是因为dialog没有集成打印功能才写了这篇博客
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
引用 13 楼 xianglitian 的回复:
[quote=引用 12 楼 zyb238909 的回复:] [quote=引用 9 楼 xianglitian 的回复:] 我这里有一个用MFC打印框架做的例子 不知道会不会对你有帮助 http://blog.csdn.net/xianglitian/article/details/5960970
我是不是应该重写一下OnFilePrintPreview这个函数???如果要重写的话又应该怎么写?[/quote]你可以用我博客里的写法试试[/quote] 写不好啊,用文档/视图的方法去解决我这个问题的话需要怎么去做呢???
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
引用 14 楼 zanfeng 的回复:
两个打印机的分辨率不一样。
MFC默认的打印机分辨率是传统的打印机的吧,然后我这边用的虚拟打印机又是怎么回事啊???
足球中国 2013-08-02
  • 打赏
  • 举报
回复
两个打印机的分辨率不一样。
向立天 2013-08-02
  • 打赏
  • 举报
回复
引用 12 楼 zyb238909 的回复:
[quote=引用 9 楼 xianglitian 的回复:] 我这里有一个用MFC打印框架做的例子 不知道会不会对你有帮助 http://blog.csdn.net/xianglitian/article/details/5960970
我是不是应该重写一下OnFilePrintPreview这个函数???如果要重写的话又应该怎么写?[/quote]你可以用我博客里的写法试试
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
引用 9 楼 xianglitian 的回复:
我这里有一个用MFC打印框架做的例子 不知道会不会对你有帮助 http://blog.csdn.net/xianglitian/article/details/5960970
我是不是应该重写一下OnFilePrintPreview这个函数???如果要重写的话又应该怎么写?
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
引用 10 楼 lgstudyvc 的回复:
模式转换,用了么
用了,所以打印预览能显示正常,但是用虚拟打印机打印出来的就不正常,太大。
lgstudyvc 2013-08-02
  • 打赏
  • 举报
回复
模式转换,用了么
向立天 2013-08-02
  • 打赏
  • 举报
回复
我这里有一个用MFC打印框架做的例子 不知道会不会对你有帮助 http://blog.csdn.net/xianglitian/article/details/5960970
笨Ben奔犇 2013-08-02
  • 打赏
  • 举报
回复
引用 7 楼 xianglitian 的回复:
祝你成功 你也可以用word试一下打印预览和虚拟打印机
虚拟打印机貌似没有问题···word可行。但我的程序为什么是这样的啊···郁闷。
向立天 2013-08-02
  • 打赏
  • 举报
回复
祝你成功 你也可以用word试一下打印预览和虚拟打印机
加载更多回复(5)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧