博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IE打印模板讲解二
阅读量:6871 次
发布时间:2019-06-26

本文共 2978 字,大约阅读时间需要 9 分钟。

     在经过上一章的IE基本知识的普及之后,我们来进行第二章内容的讲解,就是如何讲我们写好的打印模板进行调用,在这里呢,我仅举C# winform中使用webbrowser的例子,来加载和调用IE打印模板。

    OK,我们现在开始吧。

首先,我们介绍一下IE架构:

    

IExplore.exe位于最上层,他是一个很小的应用程序,当IE装载的时候他就被实例化。该可执行程序使用IE的各种组件来执行导航,历史记录维护,收藏夹维护,HTML解析和渲染等,同时为独立的浏览器提供工具栏和框架。IExplorer.exe是Shdocvw.dll 组件的直接宿主,但是在Win7下,我搜查发现没有该文件,在XP下找到了,用VS打开之后,可以找到IE打印的所有内容,个人建议,如果想采用IE的默认打印模板,那么可以在Shdocvw.dll文件中进行提取,然后在此基础上进行修改。

Shdocvw.dll依次寄宿Mshtml.dll,当有其他的活动文档组件(例如MS Office应用),当用户导航到这些特定的文档的时候,可以就地装入浏览器。Shdocvw.dll 提供这些和导航联系在一起的功能:就地链接、收藏夹和历史记录管理、PICS支持。该动态链接库也向其宿主暴露了一些接口,以允许这些宿主可以把他当作ActiveX控件而分别寄宿。

在Shdocvw.dll中有一个接口叫做IWebBrowser2,我们所见到的IE,其实基本上就是对该接口的一个包装。他有一个很重要的成员函数“ExecWB”,其原型如下:

HRESULT ExecWB(      

    OLECMDID cmdID,
    OLECMDEXECOPT cmdexecopt,
    VARIANT *pvaIn,
    VARIANT *pvaOut
);

通过给这个函数的cmdID和cmdexecopt参数指定适当的值,我们几乎可以做能够IE界面上所做的所有事情。

 如果我们获得了一个IWebBrowser2的实例,并把他转换为IOleCommandTarget接口,然后给Exec函数赋予适当的值,就可以实现我们的预期的功能了。

 首先,我们新建一个WinForm项目,然后在窗体上添加加一个控件,使得主界面看起来像下图所示:

    
    其中最下一个是System.Windows.Forms.WebBrowser控件,命名为Browser。
    然后我们定义如下的Interface和Class:
     using System;
     using System.Runtime.InteropServices;
     using System.Runtime.InteropServices.ComTypes;   
     [ComImport(), Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"),
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
     public interface IOleCommandTarget
     {
        [PreserveSig()]
        int QueryStatus([In, MarshalAs(UnmanagedType.Struct)] ref Guid
           pguidCmdGroup, [MarshalAs(UnmanagedType.U4)] int cCmds,
           [In, Out] IntPtr prgCmds, [In, Out] IntPtr pCmdText);
        [PreserveSig()]
        int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdExecOpt,
            [In, MarshalAs(UnmanagedType.LPArray)] object[] pvaIn,
            [In, Out, MarshalAs(UnmanagedType.LPArray)] object[] pvaOut);
     }
   
     public enum OLECMDEXECOPT
     {
        OLECMDEXECOPT_DODEFAULT,
        OLECMDEXECOPT_PROMPTUSER,
        OLECMDEXECOPT_DONTPROMPTUSER,
        OLECMDEXECOPT_SHOWHELP
     }

    public static class GlobalConst

    {
        public const int MSOCMDEXECOPT_DONTPROMPTUSER = 2;
        public const int IDM_PRINT = 0x1b;
        public const int IDM_PRINTPREVIEW = 0x7d3;
        public static readonly Guid CGID_MSHTML = new Guid("DE4BA900-59CA-11CF-9592-444553540000");
        public static readonly Guid IID_OleCommandTarget = new Guid("B722BCCB-4E68-101B-A2BC-00AA00404770");
    }

我们给“GO”按钮添加Click事件处理代码:

       this.Browser.Navigate(txtAddr.Text);//装载打印源文档,也可以采用代码this.Browser.DocumentText加载html源码显示; 
    注意,txtAddr.Text所代表的地址必须存在如,否则,在WebBrowser控件中会出现“无法显示网页”的错误。不过对于我们的演示并没有什么影响。
    然后我们给“Preview”按钮添加Click事件处理代码:
            IOleCommandTarget pCmdTarg = Browser.ActiveXInstance as IOleCommandTarget;
            Guid CGID_MSHTML = GlobalConst.CGID_MSHTML;
            string vTemplatePath = txtTemplateAddr.Text;//IE打印模板的URL,在执行Exec函数中,第四个参数是object数组;
            object[] targtp=new object[]{
vTemplatePath};
            pCmdTarg.Exec(ref CGID_MSHTML,
               GlobalConst.IDM_PRINTPREVIEW,
               (uint)OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER,
               targtp,//如果为null,讲采用IE默认打印模板打印;
          null);

上述代码中中的Browser.ActiveXInstance实际上就是一个IWebBrowser2接口的实现。以上内容转载的较多,希望转载者不要介意哦;

ok,下面你所进行操作的就是将第一章的打印模板或者其他人写的模板,添加到代码里吧,如果效果出现了,那么恭喜您,进入下一节的讲解,反之,证明你要好好学习代码基础知识啦;

 

转载于:https://www.cnblogs.com/freefocus/archive/2011/08/27/2155264.html

你可能感兴趣的文章
IT运维之Linux服务器监控方案
查看>>
ORA-09925: Unable to create audit trail file Linux-x86_64
查看>>
安全存储专家usse
查看>>
MySQL数值类型
查看>>
TCP、UDP下的套接字编程
查看>>
jboss7-的默认系统日志
查看>>
python中的多进程和多线程
查看>>
如何跳出嵌套语句之return
查看>>
pycharm使用
查看>>
The producer group has been created before
查看>>
API概述
查看>>
python2.6 安装rsa的包
查看>>
undo表空间使用率过高,且迟迟不释放问题
查看>>
scons *** no sconstruct file found求解决办法
查看>>
BIND基础配置详解
查看>>
火狐增加安全端口,每次用都得查,好麻烦,自己记录一下
查看>>
c# 多线程排队队列实现的源码
查看>>
LDA入门与Java实现
查看>>
Windows下搭建Nginx+PHP运行环境
查看>>
19_css背景控制.html
查看>>