用户模态对话框内子视图(子窗口)的预览和打印

时间:2017-08-04 15:51:58
【文件属性】:

文件名称:用户模态对话框内子视图(子窗口)的预览和打印

文件大小:151KB

文件格式:RAR

更新时间:2017-08-04 15:51:58

VC2010 对话框 视图 预览 打印

MFC的视图打印/预览功能基于CView::OnFilePrint和CView::OnFilePrintPreview这两个函数 如果要对用户自定义对话框(模态)内的子视图(以下简称A视图)进行打印,直接调用A视图的CView::OnFilePrint即可,弹出的“选择打印机”对话框同样也是模态对话框,覆盖在用户对话框上。 如果要对用户对话框内的A视图进行预览,直接调用A视图的CView::OnFilePrintPreview后,预览视图(MFC CPreviewView类实例)内虽然预览正常,但是挡住了用户对话框。由于用户对话框是模态的,导致预览视图上的“打印...”、“上一页”、“下一页”、“放大”、“缩小”、“单页/双页”和“关闭”等按钮均无法响应鼠标点击,处于“假死”状态。 解决方法: 在调用A视图的CView::OnFilePrintPreview之前,先关闭用户对话框(CDialog::OnCancel),由于这时已不存在用于预览的A视图,再重新创建一个相同的视图(以下简称B视图),以B视图来启动OnFilePrintPreview进行预览。 MFC视图预览的原理是:以主框架窗口(CMainFrame)作为预览框架,隐藏原先的子视图(用CMainFrame::GetActiveView得到的那个,以下简称C视图),用CPreviewView类替换,同时创建包含“打印...”、“放大”、“关闭”等按钮的工具栏(CDialogBar类),最后将CPreviewView::m_pPreviewDC作为C视图OnDraw的CDC*参数传入,这样,虽然调用的是C视图的OnDraw函数,实际上却显示在了CPreviewView视图中,起到了“预览”的效果。在点击预览框架工具栏上的“打印...”按钮后, MFC体系将向原先的主框架(本例中和预览框架是同一个,都是CMainFrame)发送ID_FILE_PRINT的WM_COMMAND消息。在缺省的配置中,这将启动C视图的OnFilePrint,从而在打印机上打出C视图的内容。 在本例中,为了打印B视图,需要在CMainFrame中处理WM_COMMAND/ID_FILE_PRINT,加入额外的条件,来判断对按钮“打印...”的点击是来自B还是C视图的预览框架。在本例中用了一个变量CMainFrame::m_nPrintFrom。根据其取值(0或者1),分别启动B或者C视图的OnFilePrint。 使用方法: 程序示例在VC++2010上通过。主菜单项“打印预览测试”下,有两个子菜单项,“对话框用户视图的打印预览”用于B视图(画出一个圆);“单文档视图的打印预览”用于C视图(画出一个正方形),等同于“文件”主菜单项下的“打印预览(V)”。


【文件预览】:
PrintPreview
----PrintPreview()
--------PrintPreviewDoc.cpp(3KB)
--------stdafx.cpp(145B)
--------PrintPreview.vcxproj.user(143B)
--------PrintPreviewView.h(1KB)
--------res()
--------stdafx.h(2KB)
--------PrintPreview.aps(116KB)
--------PrintPreview.cpp(4KB)
--------TestView.h(575B)
--------PrintPreviewDoc.h(883B)
--------TestView.cpp(1KB)
--------PrintPreviewDlg.cpp(2KB)
--------targetver.h(234B)
--------PrintPreviewView.cpp(2KB)
--------PrintPreviewDlg.h(555B)
--------PrintPreview.vcxproj.filters(3KB)
--------PrintPreview.vcxproj(6KB)
--------MainFrm.cpp(2KB)
--------resource.h(2KB)
--------PrintPreview.rc(22KB)
--------MainFrm.h(975B)
--------PrintPreview.h(542B)
--------Debug()
--------ReadMe.txt(4KB)
----PrintPreview.sln(903B)
----PrintPreview.suo(78KB)
----ipch()
--------printpreview-2c93722d()
----Debug()

网友评论

  • 刚试用了该预览和打印功能,很好用
  • 虽然实现了打印和打印预览,但存在一个BUG,鼠标点击View视图后 便出现崩溃