使用VC/MFC打印(Print)

第一部分和第二部分是自己的实现及解决方法,第三部分是参考的文章一:(打印实现的操作流程)
    在VC中实现打印操作,网上虽然看了很多的说明或例子,但具体实现时还是感觉迷惑,自己研究了下,将经验总结如下,如有错误,欢迎大家指正,免得误人误己。    自己实现的打印是在CView的派生类(如:CMyView)中,关于MFC内部实现,有很多文章都说明了,这里就不重复了,实现步骤如下:1:在CMyView中定义个函数入void PrintView(),函数实现调用this->OnFilePrint()
摘要由CSDN通过智能技术生成
第一部分和第二部分是自己的实现及解决方法,第三部分是参考的文章
一:(打印实现的操作流程)

    在VC中实现打印操作,网上虽然看了很多的说明或例子,但具体实现时还是感觉迷惑,自己研究了下,将经验总结如下,如有错误,欢迎大家指正,免得误人误己。

   自己实现的打印是在CView的派生类(如:CMyView)中,关于MFC内部实现,有很多文章都说明了,这里就不重复了,实现步骤如下:
1:在CMyView中定义个函数入void PrintView(),函数实现调用this->OnFilePrint();即可,以便开始执行打印操作(内部机制是CView实现)。
2:在CMyView中先后实现虚函数OnPreparePrinting, OnBeginPrinting, OnPrint, OnEndPrinting。
3:在OnPreparePrinting函数中必须调用DoPreparePrinting(pInfo);函数,可以return DoPreparePrinting(pInfo);就行。在DoPreparePrinting(pInfo);中,会调用打印的小dialog,如果在小dialog出现后点击了取消或关闭,会返回false,如果在这时候你再调用CView::OnPreparePrinting(pInfo);会出现中断,因为你没有设置完毕,DoPreparePrinting函数没有成功的时候要返回false以取消打印。
4:在OnBeginPrinting函数中,设置最大页数,页眉,页脚等操作,如:pInfo->SetMaxPage(1); //设置最大页数为1页
5:在OnPrint函数中,实现具体的绘图操作,将你要的image或文字信息绘到打印机DC上即可。注:在OnPrint函数中会有系统自动添加的一句话CView::OnPrint(pDC, pInfo);,这句话尽量屏蔽掉,因为在你绘图操作后再调用CView::OnPrint(pDC, pInfo);系统会调用OnPaint操作,会将你的View上显示的内容也绘在打印纸上(我这实现时需要只打印View上的一块内容,不想打印全部view,如果继续调用CView::OnPrint(pDC, pInfo);会出现打印重合的情况,也出现我不想出现的整个view的内容)。
6:在OnEndPrinting函数中,释放申请的资源等,如果在OnBeginPrinting函数中申请了画刷什么的等其他资源在OnEndPrinting函数中释放即可。

二:(图片多大尽量接近显示的大小,可以缩放但不能超出一张纸的大小,关于打印出的内容在打印纸上占用空间很小,如image打印出来后在打印纸上很小,只在打印纸上的左上角一小块地方)
    原因是打印机的DPI(dot per inch ,像素数)远远大于屏幕上的像素数比例,查看OnPrint(CDC* pDC, CPrintInfo* pInfo)中pInfo->m_rectDraw,会发现其区域很大(0, 0, 4761, 6814),所以在你用pDC绘图时会发现你图片的1280*1024到打印纸上只是很小的一块。在VC知识库中看到篇文章( 在VC中所见即所得打印的简易实现),知道了解决方法,也进行了相应的修改以适应不是所谓800*600的机器,因为客户的电脑不一定多大呢,解决方法如下:
1:将下列代码添加到CMyView::OnPrint函数中, 对于设定坐标模式也可以在 void CMyView::OnPrepareDC中实现
pDC->SetMapMode(MM_ANISOTROPIC); // 转化坐标映射模式
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); //得到屏幕分辨率的宽和高(我的是1280*1024)
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
CSize size = CSize(nScreenWidth, nScreenHeight);
pDC->SetWindowExt(size); //设置视窗大小
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);  //得到设备每逻辑英寸的像素数量
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
float fWidth = (float)xLogPixPerInch / 96 ; //得到电脑屏幕映射到视窗大小比率
float fHeight = (float)yLogPixPerInch / 96; //一般得到的fWidth = fHeight 

long xExt = (long)(fWidth * size.cx); //得到视窗大小
long yExt = (long)(fHeight * size.cy) ;
pDC->SetViewportExt((int)xExt, (int)yExt); //设置视窗大小(由电脑屏幕映射到视窗大小)

  m_pDoc->PrintDraw(pDC, pInfo, fWidth, fHeight); //m_pDoc->PrintDraw是和当前View关联的Doc(存储数据等其他信 //息), fWidth和fHeight参数用于在绘图到打印机DC(pDC)时进行相应 //的计算,看是否超出了打印纸能打印区域(pInfo->m_rectDraw)边界
<
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值