VC++打印及打印预览

yuxuan1983 2014-09-12 10:35:24
高手们,你们好,我现在比较苦恼的是,如何把我对话框程序中做的数据检测进行报告输出打印及打印预览,比如我要打印哪些字段,还有曲线数据等等,能否提供一个案例程序给我参考下呢,谢谢!
...全文
162 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2014-10-24
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
捕鲸叉 2014-09-24
  • 打赏
  • 举报
回复
可以看看CPreViewView源码看它是怎样打印视图内容的,然后模仿它写一个可用于对话框的场合
昆仑道长 2014-09-13
  • 打赏
  • 举报
回复
OnPrint()会调用OnDraw(),你在OnDraw中画出来就可以了。如果不想全部输出OnDraw的内容,那么在OnPrint()的函数中增加一些控制变量用来控制什么时候输出字段数据还是曲线数据。就是if / else啦。
笨笨仔 2014-09-13
  • 打赏
  • 举报
回复
打印输出只要在OnDraw()函数中绘制就行了,对话框中要调用打印和预览模块需要做一些工作,你可下载些资料看看,此处复制点给你,可能看不清楚。 关于对话框使用MFC打印模块 1、 由于MFC打印模块是为Frame窗口设计的,为此,创建一个Frame类,并为它建立一个View类,而View类是打印模块的控制类,所有的虚函数均在此模块中。 2、 需要的虚函数: virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo); virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView); 3、 与对话框的通信方式: a) 对话框向下,直接调用;下面向上使用自定义消息。 b) 按打印键:OnPreparePrinting调用DoPreparePrinting()函数,该函数产生一个打印对话框,选择后返回一个布尔值,取消打印返回false,打印返回true。 c) 按打印预览键:程序流程为OnPreparePrinting、OnBeginPrinting、OnPrint、OnEndPrintPreview,并由OnEndPrintPreview函数在内部调用OnEndPrinting。 d) 如果在预览中选择了打印,OnEndPrintPreview会向View类的父类发一个系统消息MESSAGE(COMMAND,ID_FILE_PRINT),该消息与标准Frame类中按打印键时的消息相同,因此必须在自定义的Frame类中接收并转发这个消息。 4、 工作原理: 通常情况下,一个结构组织的比较好的MFC程序是基于文档视图结构的,这一框架结构给我们提供了很多功能,比如菜单,注册表的关联,文件类型的注册,打印功能,只要我们善于发掘,这些都可以为我们所用,但我们现在只关心如何使用MFC提供的结构来实现打印功能。 在编写打印程序之前,有必要先介绍一下MFC的框架结构,其中的文档视图结构又是这个框架的重点,我们通过分析MFC实现的视图类的原代码就可以看到一个打印程序的执行流程。读者也可以看侯俊杰的《深入浅出MFC》,上面有关于MFC打印的详细流程解释,下面是MFC的打印的函数的实现,该函数名为OnFilePrint它不是一个虚函数,而是响应缺省的COMMAND消息的处理函数,因为MFC提供了向导生成的菜单和工具栏,关于打印的命令ID为ID_FILE_PRINT ,而在视图类的MessageMap里有这样一项,ON_COMMAND (ID_FILE_PRINT, CView::OnFilePrint),因此实际使用的过程中可以不用原来的ID, 而使用自己的ID如ID_MYPRINT,再在MessageMap里加入ON_COMMAND (ID_MYPRINT, CView::OnFilePrint)即可完成原来一样的功能。ViewPrnt.cpp中有CView的OnFilePrint的函数的具体实现,ViewPrnt.cpp的位置读者自己用windows查找就能找到,这是MFC的源代码,本文把其中的主要代码列出放在下面,直接看下面的分析: void CView::OnFilePrint() { // get default print info if (OnPreparePrinting(&printInfo)) { if (dlg.DoModal() != IDOK) return; } OnBeginPrinting(&dcPrint, &printInfo); OnPrepareDC(&dcPrint, &printInfo); OnPrint(&dcPrint, &printInfo); OnEndPrinting(&dcPrint, &printInfo); // clean up after printing }   其中加粗的代码行为可以重载的虚函数,根据不同的用户,其内容会不同。对于 OnPreparePrinting() 函数的具体内容必须有 return DoPreparePrinting(pInfo);这是在一个打印过程中最先调用的。当然也可以包含一些其它的打印初始化操作。我们最主要的是要重载三个函数: OnBeginPrinting(); OnPrint(); OnEndPrinting();   而以 OnPrint 最为复杂,它是我们要写大量代码实现我们打印功能的地方。对于默认的OnPrint实现是调用CView的OnDraw,也就是和绘制视图类的客户区的内容完全相同的方法来在打印机上绘图。实际中我们在两种地方绘图的内容是完全不同的,可能用户在客户区绘的是一个曲线,而在打印机上要绘制表格和数据。OnPrint(CDC* pDC, CPrintInfo* pInfo)的第二个参数是一个CPrintInfo类型的指针,我们可以从这个指针指向的对象中获得很多信息,如总共的页数,当前的页数,这在打印页眉页脚时可能是很有用的信息。CPrintInfo的定义如下: struct structCPrintInfo // Printing information structure { CPrintInfo(); ~CPrintInfo(); CPrintDialog* m_pPD; // pointer to print dialog BOOL m_bDocObject; // TRUE if printing by IPrint interface BOOL m_bPreview; // TRUE if in preview mode BOOL m_bDirect; // TRUE if bypassing Print Dialog BOOL m_bContinuePrinting;// set to FALSE to prematurely end printing UINT m_nCurPage; // Current page UINT m_nNumPreviewPages; // Desired number of preview pages CString m_strPageDesc; // Format string for page number display LPVOID m_lpUserData; // pointer to user created struct CRect m_rectDraw; // rectangle defining current usable page area // these only valid if m_bDocObject UINT m_nOffsetPage; // offset of first page in combined IPrint job DWORD m_dwFlags; // flags passed to IPrint::Print void SetMinPage(UINT nMinPage); void SetMaxPage(UINT nMaxPage); UINT GetMinPage() const; UINT GetMaxPage() const; UINT GetFromPage() const; UINT GetToPage() const; UINT GetOffsetPage() const; };   OnBeginPrinting()通常用来设定要打印的总页数,以及一些和页面尺寸有关的初始化工作,在OnBeginPrinting()中设定打印的页数是必要的,默认的页数是只有一页,如果开发人员打印的页数大于1,则必须在此函数中设定打印的页数。然后在OnPrint(CDC* pDC, CPrintInfo* pInfo)中用pInfo-> m_nCurPage获取当前的页码,根据当前的页码打印该页相应的内容。OnEndPrinting用来释放在OnBeginPrinting中申请的资源,如果没有申请,则不需重载该函数。   关于打印预览只需要将自己的执行打印预览功能的命令ID和CView::OnFilePrintPreview关联起来就行了,具体方法是在用户的视图类的MessageMap中加入: ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview); 其中ID_FILE_PRINT_PREVIEW是默认的ID,开发人员也可以使用自己的ID。其实只要重载了OnPrint函数,在打印和打印预览中就可以重用该函数了。到现在为止,相信读者已经对利用MFC的文档视图结构来实现一个包含打印和打印预览功能的程序有了一个总体的认识了,本文还针对该方法给出了一个示例代码,代码来自Jeff Prosise 的《MFC windows程序设计》,见参考文献[1]。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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