模态窗口中实现打印预览

用window.open另外打开一个窗口,把要打印的东西传过去。打开打印预览画面后,关闭那个画面。这样就能用预览画面打开了。。。结果关闭那个画面之后,打印预览也没了。。。


因为js可以调用的打印预览是基于WebBrowser,如果是模态窗口(showModalDialog)的话,子画面是无论如何也调不出来的,子画面直接调不出打印预览的,我看到网上无数人都困扰这个问题好久。WebBrowser这个东东,只有父画面有。



我的方法:

假设,a画面window showModalDialog打开b画面。a父画面,b子画面。a把自己的document以参数形式传递给b。把子画面的内容赋给父画面的document参数,并调用打印。但是,要使父画面内容不被打印出来,子画面内容不被显示到父画面里面上,可以通过css来控制。下面是具体实现。

window showModalDialog(url,document,width,heigth);

b画面获取这个参数var documentObj = window.dialogArguments

这样的话。。。documentObj .all.WebBrowser.ExecWB(7,1)就能打印东东了,这个段思路来自网友,他可能实现的是要打印父画面的内容。但是如果是要打印子画面的内容,就要稍微多做点事情。


在a画面上,把现在画面上的元素,最外层套一个div,或者其他什么。给个id叫,parentHtml。给个css:noPrint

在画面最下面画一个隐藏div,给个id叫childHtml。给个css:noDisplay。

定义好css

@media Print

{

.noPrint {

DISPLAY: none;

}


@media Screen

{

.noDisaplay {

DISPLAY: none;

}


然后,猥琐的办法。。。

在子画面上使用documentObj.getElementById("parentHtml")获得父画面的显示内容对象,给它加个class “noPrint”。

然后

documentObj.getElementById("childHtml").insertAdjacentHTML("beforeEnd",document.body.innerHtml)。

把子画面body里的内容复制到父画面的childHtml里去。

然后,documentObj .all.WebBrowser.execwb(7,1)。。。应该就能把子画面的内容显示到预览窗口里了。。。

最后再把parentHtml的noPrint去掉,以及childHtml里的内容删掉。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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)”。
MFC的视图打印/预览功能基于CView::OnFilePrint和CView::OnFilePrintPreview这两个函数。 如果要对用户自定义对话框(模态)内的子视图进行打印,直接调用该视图的CView::OnFilePrint即可,弹出的“选择打印机”对话框同样也是模态对话框,覆盖在用户对话框上。 如果要对用户对话框内的视图进行预览,直接调用该视图的CView::OnFilePrintPreview后,预览视图(MFC CPreviewView类实例)内虽然预览正常,但是挡住了用户对话框。由于用户对话框是模态的,导致预览视图上的“打印...”、“上一页”、“下一页”、“放大”、“缩小”、“单页/双页”和“关闭”等按钮均无法响应鼠标点击,处于“假死”状态。 解决方法: 第一个解决方法是先关闭用户对话框,再启动预览,详见http://download.csdn.net/detail/oliver_zheng/7639379 第二个解决方法仍然保持用户对话框,但是由于对话框为模态,无法利用主框架窗口CMainFrame作为预览框架,因此要另外创建并显示一个框架窗口(CFrameWnd的派生类),作为预览窗口。 另外创建的框架窗口类名为CPrintPreviewFrameWnd,其对应的单文档视图是CViewPrintPreview类,利用这些关联信息创建一个单文档模板,利用此单文档模板创建框架窗口,并在其内嵌视图(CViewPrintPreview类)保存原主框架(CMainFrame)、用户对话框和其上需要打印的视图(CTestView)。然后基于CViewPrintPreview类启动预览打印(具体过程详见第一个解决办法)。由于CViewPrintPreview的各个相关虚函数诸如OnPreparePrinting、OnBeginPrinting、OnPrepareDC、OnPrint和OnEndPrinting都被重载,用于调用真正需要打印的视图CTestView的各自函数,因此CViewPrintPreview实际上只是个“介”视图,是连接预览视图(MFC CPreviewView类)和CTestView的桥梁。 当打印或者预览结束后,关闭自行创建的框架窗口CPrintPreviewFrameWnd,利用CViewPrintPreview类实现保存的信息恢复主框架和用户对话框,恢复打印/预览前的环境。 代码(实现了第二个解决方法)在VC2010下编译通过。第一个解决方法的源码详见http://download.csdn.net/detail/oliver_zheng/7639379

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值