利用MFC文档视图框架编写打印程序

上传人:206****923 文档编号:41783944 上传时间:2018-05-31 格式:DOC 页数:6 大小:44.50KB
返回 下载 相关 举报
利用MFC文档视图框架编写打印程序_第1页
第1页 / 共6页
利用MFC文档视图框架编写打印程序_第2页
第2页 / 共6页
利用MFC文档视图框架编写打印程序_第3页
第3页 / 共6页
利用MFC文档视图框架编写打印程序_第4页
第4页 / 共6页
利用MFC文档视图框架编写打印程序_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《利用MFC文档视图框架编写打印程序》由会员分享,可在线阅读,更多相关《利用MFC文档视图框架编写打印程序(6页珍藏版)》请在金锄头文库上搜索。

1、利用利用 MFC 文档视图框架编写打印程序文档视图框架编写打印程序 2006-03-08 15:55 作者:戎亚新出处:作者:戎亚新出处:vckbase 责责任编辑:方舟任编辑:方舟本文首先介绍了利用 MFC 提供的文档视图框架来实现一个打印程序,实现打印预览,在此基础上,同时通过对 MFC 源代码的深入探讨,提出了利用该方法在对话框上用 MFC 实现打印功能,结果表明,利用 MFC 实现打印不仅方便,而且功能很强大,能够根据不同的需求很方便的打印出所需要的格式。本文还实现了一个在对话框中利用 MFC 实现打印功能的一个框架结构,对于使用者只要使用该结构就可以按照自己的要求打印任何内容。 关键

2、词:Visual C+ ,MFC,对话框, 打印 ,打印预览引言打印程序的编写在 windows 程序设计中非常有用,针对不同的用户需要,通常用 sdk 方式实现打印代码量比较大,而且要对打印流程的底层有非常清楚的了解,需要一个程序员有非常深入的打印方面的知识,利用 MFC 提供的文档视图结构,不但可以实现一些常用的标准界面元素,把数据的处理的界面的处理分离出来,而且其提供的打印功能更是方便快捷,功能强大。打印程序的编写本质是是一种 GDI 绘图,只是绘图的对象是在打印机的设备描述表,如果对于屏幕的 GDI 绘图比较熟悉的读者,相信掌握打印程序的编写应该比较容易。1、文档视图结构的程序的打印程

3、序的编写通常情况下,一个结构组织的比较好的 MFC 程序是基于文档视图结构的,这一框架结构给我们提供了很多功能,比如菜单,注册表的关联,文件类型的注册,打印功能,只要我们善于发掘,这些都可以为我们所用,但我们现在只关心如何使用 MFC 提供的结构来实现打印功能。在编写打印程序之前,有必要先介绍一下 MFC 的框架结构,其中的文档视图结构又是这个框架的重点,我们通过分析 MFC 实现的视图类的原代码就可以看到一个打印程序的执行流程。读者也可以看侯俊杰的深入浅出 MFC,上面有关于 MFC 打印的详细流程解释,下面是 MFC 的打印的函数的实现,该函数名为 OnFilePrint 它不是一个虚函数

4、,而是响应缺省的 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 的

5、函数的具体实现,ViewPrnt.cpp 的位置读者自己用 windows 查找就能找到,这是 MFC 的源代码,本文把其中的主要代码列出放在下面,直接看下面的分析: void CView:OnFilePrint()/ get default print infoif (OnPreparePrinting(OnBeginPrinting(OnPrepareDC(OnPrint(OnEndPrinting( / clean up after printing 其中加粗的代码行为可以重载的虚函数,根据不同的用户,其内容会不同。对于 OnPreparePrinting() 函数的具体内容必须有 re

6、turn DoPreparePrinting(pInfo);这是在一个打印过程中最先调用的。当然也可以包含一些其它的打印初始化操作。我们最主要的是要重载三个函数:OnBeginPrinting();OnPrint();OnEndPrinting(); 而以 OnPrint 最为复杂,它是我们要写大量代码实现我们打印功能的地方。对于默认的 OnPrint 实现是调用 CView 的 OnDraw,也就是和绘制视图类的客户区的内容完全相同的方法来在打印机上绘图。实际中我们在两种地方绘图的内容是完全不同的,可能用户在客户区绘的是一个曲线,而在打印机上要绘制表格和数据。OnPrint(CDC* pDC

7、, CPrintInfo* pInfo)的第二个参数是一个 CPrintInfo 类型的指针,我们可以从这个指针指向的对象中获得很多信息,如总共的页数,当前的页数,这在打印页眉页脚时可能是很有用的信息。CPrintInfo 的定义如下:struct structCPrintInfo / Printing information structureCPrintInfo();CPrintInfo();CPrintDialog* m_pPD; / pointer to print dialogBOOL m_bDocObject; / TRUE if printing by IPrint interf

8、aceBOOL m_bPreview; / TRUE if in preview modeBOOL m_bDirect; / TRUE if bypassing Print DialogBOOL m_bContinuePrinting;/ set to FALSE to prematurely end printingUINT m_nCurPage; / Current pageUINT m_nNumPreviewPages; / Desired number of preview pagesCString m_strPageDesc; / Format string for page num

9、ber displayLPVOID m_lpUserData; / pointer to user created structCRect m_rectDraw; / rectangle defining current usable page area/ these only valid if m_bDocObjectUINT m_nOffsetPage; / offset of first page in combined IPrint jobDWORD m_dwFlags; / flags passed to IPrint:Printvoid SetMinPage(UINT nMinPa

10、ge);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

11、, CPrintInfo* pInfo)中用 pInfo- m_nCurPage 获取当前的页码,根据当前的页码打印该页相应的内容。OnEndPrinting 用来释放在OnBeginPrinting 中申请的资源,如果没有申请,则不需重载该函数。关于打印预览只需要将自己的执行打印预览功能的命令 ID 和 CView:OnFilePrintPreview 关联起来就行了,具体方法是在用户的视图类的 MessageMap 中加入:ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview);其中 ID_FILE_PRINT_PREVIEW

12、 是默认的 ID,开发人员也可以使用自己的 ID。其实只要重载了OnPrint 函数,在打印和打印预览中就可以重用该函数了。到现在为止,相信读者已经对利用 MFC 的文档视图结构来实现一个包含打印和打印预览功能的程序有了一个总体的认识了,本文还针对该方法给出了一个示例代码,代码来自 Jeff Prosise 的MFC windows 程序设计,见参考文献1。2、没有文档视图结构的程序中利用 MFC 进行打印程序的编写如果程序不是文档视图结构的,我们要使用 MFC 来进行打印,则可以通过建立一个虚拟的文档视图结构来进行打印,其实 MFC 的打印的强大功能是在 CView 里提供的,而 CView

13、 类的对象是一个子窗口,它必须是某一个框架窗口的子窗口,而在对话框程序中,我们只需要打印,而不需要显示这个框架窗口和视图。我们以按下按钮“打印“来执行打印程序,例如按钮为 ID 为 IDC_PNT,消息相应函数为 OnPnt(),即:ON_BN_CLICKED(IDC_PNT, OnPnt);需要在 OnPnt 中建立一个框架窗口,同时使某个 CView 类的对象为该窗口的子窗口。因此笔者建立了两个类,一个为框架窗口类 CPrintFrame,另一个为 CPrintView,具体的内容见示例代码。在新建一个用于打印的虚拟框架窗口时,需要将执行打印的对话框的指针传给框架窗口,这以便在对话框来响应

14、WM_BEGIN_PRINTING 和 WM_END_PRINTING 消息,使对话框可以完成打印的初始化和释放操作。在执行一个打印任务时,将打印的流程交给 CView 来进行,而这个 CView 是虚拟的,只是用来完成打印一些操作,其它内容则完全不负责处理,而当要执行 CView:OnPrint 时,则又将处理的具体内容传回到对话框,而对话框则只需要响应 WM_MY_PRINT 消息即可:pFrame-m_pCallerDlg-SendMessage(WM_MY_PRINT,(WPARAM) pDC, (LPARAM) pInfo);使打印的具体处理又传回到对话框中,使开发人员根据具体的需要

15、写 WM_MY_PRINT 的处理函数就可以实现打印,而 CView:OnPrint(CDC* pDC, CPrintInfo* pInfo)的参数也从 WM_MY_PRINT 的消息参数传出来,在用户的对话框程序中,需要写的代码就很少,主要有以下几个步骤,建立一个 CPrintFrame 的对象,设该对象的指针为 pFrame,并将对话框的指针传给该对象的m_pCallerDlg,即 pFrame-m_pCallerDlg = this; 调用对象的 Create 函数创建框架窗口;例如 pFrame-Create(NULL,“频谱打印“,WS_OVERLAPPEDWINDOW,CRect(

16、0,0,0,0); 如果要执行打印,则调用 pFrame-m_pView-OnMyPrint(); 如果要执行打印预览,则调用:pFrame-m_pView-OnMyPrintPreview(); 例如:void CDlgPrintDlg:OnPrint() /执行打印功能CPrintFrame *pFrame = new CPrintFrame;pFrame-m_pCallerDlg = this;pFrame-Create(NULL,“Curve Print“,WS_OVERLAPPEDWINDOW,CRect(0,0,0,0);pFrame-m_pView-OnMyPrint();void CDlgPrintDlg:OnPrintPreview() /执行打印预览功能CPrintFrame *pFrame = new CPrintFrame;pFrame-m_pCallerDlg = this;pFrame-Create(NULL,“Curve Print

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号