精华内容
下载资源
问答
  • VB 打印预览

    热门讨论 2010-06-08 09:51:55
    VB 打印预览 VB 打印预览 VB 打印预览 VB 打印预览
  • jQuery 打印预览

    热门讨论 2013-11-21 13:46:32
    jquery 打印预览 轻松实现效果最好的打印预览附有源码
  • vc打印,及打印预览

    热门讨论 2012-03-07 11:58:31
    vc开发的打印,及打印预览,直接包含print下的文件,主控制添加打印内容就可以了
  • 1.现在想打印预览怎么做呢? gridLoadReport.PrintPreview(0);//不知道这个方法怎么用,这个参数是什么? 2.直接交由打印机打印怎么做? 3.如果我选择dhtmlXGridObject中的行,点打印直接打印预览怎么做? 刚开始用...
  • MFC对话框打印与打印预览

    热门讨论 2009-10-13 14:34:50
    对话框打印与打印预览的实现,让你基于对话框的应用程序打印自如!!!
  • MFC打印 打印预览

    千次阅读 2017-03-10 16:17:21
    MFC打印 打印预览 <span class="link_postdate">2012-12-11 14:51 <span class="link_view" ti

    MFC打印 打印预览

        <div class="article_manage clearfix">
        <div class="article_r">
            <span class="link_postdate">2012-12-11 14:51</span>
            <span class="link_view" title="阅读次数">4583人阅读</span>
            <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
            <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('MFC%e6%89%93%e5%8d%b0+%e6%89%93%e5%8d%b0%e9%a2%84%e8%a7%88','8282420');return false;" title="收藏" target="_blank">收藏</a></span>
             <span class="link_report"> <a href="#report" onclick="javascript:report(8282420,2);return false;" title="举报">举报</a></span>
    
        </div>
    </div>
    <div class="embody" style="display:none" id="embody">
        <span class="embody_t">本文章已收录于:</span>
        <div class="embody_c" id="lib" value="{&quot;err&quot;:0,&quot;msg&quot;:&quot;ok&quot;,&quot;data&quot;:[]}"></div>
    </div>
    <style type="text/css">        
            .embody{
                padding:10px 10px 10px;
                margin:0 -20px;
                border-bottom:solid 1px #ededed;                
            }
            .embody_b{
                margin:0 ;
                padding:10px 0;
            }
            .embody .embody_t,.embody .embody_c{
                display: inline-block;
                margin-right:10px;
            }
            .embody_t{
                font-size: 12px;
                color:#999;
            }
            .embody_c{
                font-size: 12px;
            }
            .embody_c img,.embody_c em{
                display: inline-block;
                vertical-align: middle;               
            }
             .embody_c img{               
                width:30px;
                height:30px;
            }
            .embody_c em{
                margin: 0 20px 0 10px;
                color:#333;
                font-style: normal;
            }
    </style>
    <script type="text/javascript">
        $(function () {
            try
            {
                var lib = eval("("+$("#lib").attr("value")+")");
                var html = "";
                if (lib.err == 0) {
                    $.each(lib.data, function (i) {
                        var obj = lib.data[i];
                        //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                        html += ' <a href="' + obj.url + '" target="_blank">';
                        html += ' <img src="' + obj.logo + '">';
                        html += ' <em><b>' + obj.name + '</b></em>';
                        html += ' </a>';
                    });
                    if (html != "") {
                        setTimeout(function () {
                            $("#lib").html(html);                      
                            $("#embody").show();
                        }, 100);
                    }
                }      
            } catch (err)
            { }
    
        });
    </script>
    <script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>  
    
    这两篇文章是我看了那么多写MFC打印功能中介绍的相对较好的,所以转载了过来,以方便自己以后学习使用
    前段时间需要将日志信息通过打印机打印出来。

    总结了一下其中的一些用法:

    1:用CPrintDialog 可以呼出窗口让用户选择打印机或者采用默认的打印机直接打印。

        StartPage…..EndPage  完成一页文档的打印。  如需改变DC设置,需要调用ReSetDC()

        多次调用这两个函数,可以实现打印多页

    2:TextOut坐标的确定。

         TextOut中的坐标是DC中的逻辑坐标。

         和实际的物理坐标需要转换。

        GetDeviceCpas();  //获取DC中的Device信息。

        GetTextMetrics(); //获取字体的信息。 字体高度和本身高度+行距。

    3:TextOut中的字体可以设置。

        关键代码如下:

         CFont myFont;

         myFont.CreatePontFont(….);

         oldFont = dc.SelectObject();

         myFont.DelectObject()’;

     

     

    附上

    1:转载相关文档:

    打印单位的转换

    这个的关键是我们要得到显示设备的DPI,即每英寸设备支持的点数。有了DPI我们就可以在我们习惯的单位和设备单位之间转换了,用到的API是GetDeviceCaps(),这个函数功能强大,具体可参考MSDN,在这里我们只用来得到设备DPI。看示例代码:

       
    1. //某些设备水平和垂直方向的DPI可能不同,所以要分别得到。   
    2.      
    3.    //得到水平方向的转换比例   
    4.    float getXScale(HDC printDC)  //printDC: 打印机DC设备句柄   
    5.    {  
    6.        //得到打印机水平方向的DPI   
    7.        int xDPI = GetDeviceCaps(printDC, LOGPIXELSX);  
    8.          
    9.        //254.0: 每英寸25.4毫米   
    10.        float xScale = (float)(254.0 / xDPI);  
    11.          
    12.        return xScale;  
    13.    }  
    14.      
    15.    //得到垂直方向的转换比例   
    16.    float getYScale(HDC printDC)  //printDC: 打印机DC设备句柄   
    17.    {  
    18.        //得到打印机垂直方向的DPI   
    19.        int yDPI = GetDeviceCaps(printDC, LOGPIXELSY);  
    20.          
    21.        float yScale = (float)(254.0 / yDPI);  
    22.          
    23.        return yScale;  
    24.    }  
    25.   
    26.    //厘米转换为设备像素,水平方向   
    27.    double cm2Unit_W(float xScale, double w) //w单位为厘米   
    28.    {  
    29.        return w*100/xScale;  
    30.    }  
    31.   
    32.    //厘米转换为设备像素,垂直方向   
    33.    double cm2Unit_H(float yScale, double h) //h单位为厘米   
    34.    {  
    35.        return h*100/yScale;  
    36.    }  
    save_snippets.png
    1. //某些设备水平和垂直方向的DPI可能不同,所以要分别得到。  
    2.      
    3.    //得到水平方向的转换比例  
    4.    float getXScale(HDC printDC)  //printDC: 打印机DC设备句柄  
    5.    {  
    6.        //得到打印机水平方向的DPI  
    7.        int xDPI = GetDeviceCaps(printDC, LOGPIXELSX);  
    8.          
    9.        //254.0: 每英寸25.4毫米  
    10.        float xScale = (float)(254.0 / xDPI);  
    11.          
    12.        return xScale;  
    13.    }  
    14.      
    15.    //得到垂直方向的转换比例  
    16.    float getYScale(HDC printDC)  //printDC: 打印机DC设备句柄  
    17.    {  
    18.        //得到打印机垂直方向的DPI  
    19.        int yDPI = GetDeviceCaps(printDC, LOGPIXELSY);  
    20.          
    21.        float yScale = (float)(254.0 / yDPI);  
    22.          
    23.        return yScale;  
    24.    }  
    25.   
    26.    //厘米转换为设备像素,水平方向  
    27.    double cm2Unit_W(float xScale, double w) //w单位为厘米  
    28.    {  
    29.        return w*100/xScale;  
    30.    }  
    31.   
    32.    //厘米转换为设备像素,垂直方向  
    33.    double cm2Unit_H(float yScale, double h) //h单位为厘米  
    34.    {  
    35.        return h*100/yScale;  
    36.    }  
    save_snippets.png
     //某些设备水平和垂直方向的DPI可能不同,所以要分别得到。
    
        //得到水平方向的转换比例
        float getXScale(HDC printDC)  //printDC: 打印机DC设备句柄
        {
            //得到打印机水平方向的DPI
            int xDPI = GetDeviceCaps(printDC, LOGPIXELSX);
    
            //254.0: 每英寸25.4毫米
            float xScale = (float)(254.0 / xDPI);
    
            return xScale;
        }
    
        //得到垂直方向的转换比例
        float getYScale(HDC printDC)  //printDC: 打印机DC设备句柄
        {
            //得到打印机垂直方向的DPI
            int yDPI = GetDeviceCaps(printDC, LOGPIXELSY);
    
            float yScale = (float)(254.0 / yDPI);
    
            return yScale;
        }
    
        //厘米转换为设备像素,水平方向
        double cm2Unit_W(float xScale, double w) //w单位为厘米
        {
            return w*100/xScale;
        }
    
        //厘米转换为设备像素,垂直方向
        double cm2Unit_H(float yScale, double h) //h单位为厘米
        {
            return h*100/yScale;
        }

    上面代码中,如果将printDC换为显示器设备DC句柄,即可得到厘米转换为显示器像素单位,打印预览时使用。得到显示器设备句柄可用::GetDC(NULL)得到。

    打印基本流程

    有了前面的知识,现在我们就可以打印了。Windows打印是有着固定的流程的,流程也比较简单。按照固定的顺序调用打印API即可:StartDoc() -> StartPage() -> 打印具体内容 -> EndPage() -> EndDoc()。如果要打印多页,循环StartPage()至EndPage()即可。

    示例代码:

       
    1. DOCINFO   doc;     
    2.    ZeroMemory(&doc,sizeof(doc));     
    3.    doc.cbSize = sizeof(doc);     
    4.    doc.lpszDocName = (LPCTSTR)“Print Test File”;  
    5.      
    6.    StartDoc(printDC, &doc);  //准备打印   
    7.   
    8.    StartPage(printDC);  //开始打印页   
    9.      
    10.    //在(2.5cm, 2.5cm)处打印文本   
    11.    char* text = “打印测试文本”;  
    12.      
    13.    float xScale = getXScale(printDC);  
    14.    float yScale = getYScale(printDC);  
    15.      
    16.    double x = cm2Unit_W(xScale, 2.5);  
    17.    double y = cm2Unit_H(yScale, 2.5);  
    18.      
    19.    //在指定位置打印文本   
    20.    TextOut(printDC, (int)x, (int)y, (LPTSTR)text, strlen(text));  
    21.      
    22.    EndPage(printDC);  //结束打印页   
    23.      
    24.    EndDoc(printDC);  //结束打印  
    save_snippets.png
    1. DOCINFO   doc;     
    2.    ZeroMemory(&doc,sizeof(doc));     
    3.    doc.cbSize = sizeof(doc);     
    4.    doc.lpszDocName = (LPCTSTR)“Print Test File”;  
    5.      
    6.    StartDoc(printDC, &doc);  //准备打印  
    7.   
    8.    StartPage(printDC);  //开始打印页  
    9.      
    10.    //在(2.5cm, 2.5cm)处打印文本  
    11.    char* text = “打印测试文本”;  
    12.      
    13.    float xScale = getXScale(printDC);  
    14.    float yScale = getYScale(printDC);  
    15.      
    16.    double x = cm2Unit_W(xScale, 2.5);  
    17.    double y = cm2Unit_H(yScale, 2.5);  
    18.      
    19.    //在指定位置打印文本  
    20.    TextOut(printDC, (int)x, (int)y, (LPTSTR)text, strlen(text));  
    21.      
    22.    EndPage(printDC);  //结束打印页  
    23.      
    24.    EndDoc(printDC);  //结束打印  
    save_snippets.png
     DOCINFO   doc;   
        ZeroMemory(&doc,sizeof(doc));   
        doc.cbSize = sizeof(doc);   
        doc.lpszDocName = (LPCTSTR)"Print Test File";
    
        StartDoc(printDC, &doc);  //准备打印
    
        StartPage(printDC);  //开始打印页
    
        //在(2.5cm, 2.5cm)处打印文本
        char* text = "打印测试文本";
    
        float xScale = getXScale(printDC);
        float yScale = getYScale(printDC);
    
        double x = cm2Unit_W(xScale, 2.5);
        double y = cm2Unit_H(yScale, 2.5);
    
        //在指定位置打印文本
        TextOut(printDC, (int)x, (int)y, (LPTSTR)text, strlen(text));
    
        EndPage(printDC);  //结束打印页
    
        EndDoc(printDC);  //结束打印

    打印字体的设置

    很多时候我们希望能控制打印字体,下面的代码可以创建你想要的字体格式:

       
    1. /*  创建自定义打印字体 
    2.        fontFace:字体名称,如果为NULL,默认采用“宋体” 
    3.        fontHeight:字体高度,单位为厘米 
    4.        isBold:是否加粗 
    5.        isItalic:是否斜体 
    6.        isUnderLine:是否下划线 
    7.        isStrikeOut:是否删除线 
    8.    */  
    9.    HFONT getFont(LPCTSTR fontFace, double fontHeight, bool isBold, bool isItalic, bool isUnderLine, bool isStrikeOut)  
    10.    {  
    11.        int width = 0; //字体宽度由系统决定   
    12.        int weight = FW_NORMAL;  
    13.        DWORD italic = 0;  
    14.        DWORD underLine = 0;  
    15.        DWORD strikeOut = 0;  
    16.        DWORD charSet = DEFAULT_CHARSET;  
    17.        LPCTSTR face = (LPCTSTR)“宋体”;  
    18.          
    19.        float height = cm2Unit_H(fontHeight);  
    20.          
    21.        if(fontFace != 0)  
    22.        {  
    23.            face = fontFace;  
    24.        }  
    25.   
    26.        if(isBold)  
    27.        {  
    28.            weight = FW_BOLD;  
    29.        }  
    30.          
    31.        if(isItalic)  
    32.        {  
    33.            italic = 1;  
    34.        }  
    35.          
    36.        if(isUnderLine)  
    37.        {  
    38.            underLine = 1;  
    39.        }  
    40.          
    41.        if(isStrikeOut)  
    42.        {  
    43.            strikeOut = 1;  
    44.        }  
    45.   
    46.        HFONT font = CreateFont((int)height, width, 0, 0,   
    47.                                 weight, italic, underLine, strikeOut, charSet,  
    48.                                 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,   
    49.                                 DEFAULT_PITCH | FF_DONTCARE, face );  
    50.        return font;  
    51.    }  
    save_snippets.png
    1. /*  创建自定义打印字体 
    2.        fontFace:字体名称,如果为NULL,默认采用“宋体” 
    3.        fontHeight:字体高度,单位为厘米 
    4.        isBold:是否加粗 
    5.        isItalic:是否斜体 
    6.        isUnderLine:是否下划线 
    7.        isStrikeOut:是否删除线 
    8.    */  
    9.    HFONT getFont(LPCTSTR fontFace, double fontHeight, bool isBold, bool isItalic, bool isUnderLine, bool isStrikeOut)  
    10.    {  
    11.        int width = 0; //字体宽度由系统决定  
    12.        int weight = FW_NORMAL;  
    13.        DWORD italic = 0;  
    14.        DWORD underLine = 0;  
    15.        DWORD strikeOut = 0;  
    16.        DWORD charSet = DEFAULT_CHARSET;  
    17.        LPCTSTR face = (LPCTSTR)“宋体”;  
    18.          
    19.        float height = cm2Unit_H(fontHeight);  
    20.          
    21.        if(fontFace != 0)  
    22.        {  
    23.            face = fontFace;  
    24.        }  
    25.   
    26.        if(isBold)  
    27.        {  
    28.            weight = FW_BOLD;  
    29.        }  
    30.          
    31.        if(isItalic)  
    32.        {  
    33.            italic = 1;  
    34.        }  
    35.          
    36.        if(isUnderLine)  
    37.        {  
    38.            underLine = 1;  
    39.        }  
    40.          
    41.        if(isStrikeOut)  
    42.        {  
    43.            strikeOut = 1;  
    44.        }  
    45.   
    46.        HFONT font = CreateFont((int)height, width, 0, 0,   
    47.                                 weight, italic, underLine, strikeOut, charSet,  
    48.                                 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,   
    49.                                 DEFAULT_PITCH | FF_DONTCARE, face );  
    50.        return font;  
    51.    }  
    save_snippets.png
     /*  创建自定义打印字体
            fontFace:字体名称,如果为NULL,默认采用“宋体”
            fontHeight:字体高度,单位为厘米
            isBold:是否加粗
            isItalic:是否斜体
            isUnderLine:是否下划线
            isStrikeOut:是否删除线
        */
        HFONT getFont(LPCTSTR fontFace, double fontHeight, bool isBold, bool isItalic, bool isUnderLine, bool isStrikeOut)
        {
            int width = 0; //字体宽度由系统决定
            int weight = FW_NORMAL;
            DWORD italic = 0;
            DWORD underLine = 0;
            DWORD strikeOut = 0;
            DWORD charSet = DEFAULT_CHARSET;
            LPCTSTR face = (LPCTSTR)"宋体";
    
            float height = cm2Unit_H(fontHeight);
    
            if(fontFace != 0)
            {
                face = fontFace;
            }
    
            if(isBold)
            {
                weight = FW_BOLD;
            }
    
            if(isItalic)
            {
                italic = 1;
            }
    
            if(isUnderLine)
            {
                underLine = 1;
            }
    
            if(isStrikeOut)
            {
                strikeOut = 1;
            }
    
            HFONT font = CreateFont((int)height, width, 0, 0, 
                                     weight, italic, underLine, strikeOut, charSet,
                                     OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, 
                                     DEFAULT_PITCH | FF_DONTCARE, face );
            return font;
        }

    小结

    以上就是我们在实现打印中遇到的常见问题,相信理解了这些,在我们自己的程序中实现打印就不再是什么困难的事情了。

     

     

     

    http://msdn.microsoft.com/zh-cn/library/cc485711(VS.71).aspx#_core_printer_pages_vs.._document_pages

    打印协议

    为打印多页文档,框架与视图以如下方式交互。首先,框架显示“打印”对话框,为打印机创建设备上下文,并调用

    CDC

    对象的

    StartDoc

    成员函数。然后,对于文档中的每一页,框架调用 CDC 对象的

    StartPage

    成员函数,指示视图对象打印页,并调用

    EndPage

    成员函数。如果在开始某个特定页之前必须更改打印机模式,视图将调用

    ResetDC

    ,它将更新含有新的打印机模式信息的 DEVMODE 结构。全部文档打印完毕后,框架调用

    EndDoc

    成员函数。

    重写视图类函数

    CView

    类定义在打印过程中被框架调用的几个成员函数。通过在视图类中重写这些函数,提供框架打印逻辑与视图类打印逻辑之间的连接。下表列出了这些成员函数。

    用于打印的 CView 可重写函数

    名称
    重写原因

    OnPreparePrinting

    在“打印”对话框中插入值,尤其是文档的长度

    OnBeginPrinting

    分配字体或其他 GDI 资源

    OnPrepareDC

    调整给定页的设备上下文属性,或进行打印时分页

    OnPrint

    打印给定页

    OnEndPrinting

    解除分配 GDI 资源

    也可用其他函数执行打印相关处理,但这些函数是驱动打印过程的函数。

    下图阐释了打印过程所涉及的步骤,并显示了在何处调用 CView 的每个打印成员函数。本文其余部分是对大多数步骤更详细的解释。分配 GDI 资源一文介绍了打印过程的其他部分。

    打印循环

    分页

    框架在

    CPrintInfo

    结构中存储许多关于打印作业的信息。CPrintInfo 中的几个值是关于分页的;这些值如下表所示。

    存储在 CPrintInfo 中的页码信息

    成员变量或函数名
    引用的页码

    GetMinPage/SetMinPage
    文档的第一页

    GetMaxPage/SetMaxPage
    文档的最后一页

    GetFromPage
    要打印的第一页

    GetToPage
    要打印的最后一页

    m_nCurPage
    当前正在打印的页

    页码从 1 开始,也就是说,第一页的编号为 1,而不是 0。有关上述及其他

    CPrintInfo

    成员的更多信息,请参见“MFC 参考”。

    在打印过程的开始,框架调用视图的

    OnPreparePrinting

    成员函数,向 CPrintInfo 结构传递一个指针。“应用程序向导”提供调用 CView 的另一个成员函数

    DoPreparePrinting

    的 OnPreparePrinting 实现。DoPreparePrinting 是显示“打印”对话框并创建打印机设备上下文的函数。

    这时,应用程序并不知道文档的页数。它对文档的第一页和最后一页的页码使用默认值 1 和 0xFFFF。如果您知道文档的页数,在将文档发送到DoPreparePrinting 之前,请重写 OnPreparePrinting,并为 CPrintInfo 结构调用

    SetMaxPage

    。这使您得以指定文档的长度。

    接下来 DoPreparePrinting 显示“打印”对话框。当它返回时,CPrintInfo 结构包含用户指定的值。如果用户希望只打印选定页码范围内的文档,他或她可以在“打印”对话框中指定起始页码和终止页码。框架使用

    CPrintInfo

    的 GetFromPage 和 GetToPage 函数检索这些值。如果用户未指定页码范围,框架将调用 GetMinPage 和 GetMaxPage 并使用返回的值来打印整个文档。

    对于文档中将要打印的每一页,框架调用视图类中的两个成员函数(

    OnPrepareDC

    OnPrint

    ),并传递给每个函数两个参数:一个指向

    CDC

    对象的指针和一个指向 CPrintInfo 结构的指针。每次当框架调用 OnPrepareDC 和 OnPrint 时,它都传递 CPrintInfo 结构的m_nCurPage 成员中的不同值。框架通过这种方式通知视图要打印哪些页。

    OnPrepareDC

    成员函数也可用于屏幕显示。它在绘制之前调整设备上下文。OnPrepareDC 在打印中起同样的作用,但有两点不同:首先,CDC 对象表示打印机设备上下文而不是屏幕设备上下文;其次,CPrintInfo 对象作为第二个参数传递。(当为屏幕显示调用 OnPrepareDC 时,此参数为 NULL。)重写 OnPrepareDC 以便根据正在打印的页的不同来调整设备上下文。例如,可通过移动视区原点和剪辑区域,确保文档中的适当部分得到打印。

    OnPrint

    成员函数执行页的实际打印。默认打印的实现方式一文显示了框架是如何用打印机设备上下文调用

    OnDraw

    来执行打印的。更确切地说,框架用 CPrintInfo 结构和设备上下文调用 OnPrintOnPrint 将设备上下文传递给 OnDraw。重写 OnPrint,执行任何只应在打印而非屏幕显示期间完成的呈现。例如,打印页眉或页脚(有关更多信息,请参见页眉和页脚一文)。然后,从 OnPrint 的重写调用 OnDraw 来进行屏幕显示和打印的共同呈现。

    OnDraw 既进行屏幕显示呈现又进行打印呈现的事实意味着您的应用程序是 WYSIWYG(所见即所得)。然而,假设您正在写的不是“所见即所得”应用程序。例如,一个文本编辑器使用粗体作为打印字体,但同时显示控制代码指示屏幕上粗体文本。对于这种情况,应严格使用 OnDraw 进行屏幕显示。当您重写 OnPrint 时,用一个对单独绘制函数的调用取代对 OnDraw 的调用。该函数使用未显示在屏幕上的属性,以文档显示在纸上的方式绘制文档。

    打印机页与文档页

    提到页码,有时必须得区分打印机页的概念和文档页的概念。从打印机的角度讲,一页是一张纸。但是,一张纸并不一定等于文档中的一页。例如,如果打印一份通讯稿,纸张将要折叠,一张纸可能同时含有文档的第一页和最后一页(它们是并排的)。同样,如果打印一份电子表格,文档根本不是由页组成的。相反,一张纸可能包含第一到第二十行,第六到第十列。

    所有

    CPrintInfo

    结构中的页码都是指打印机页。框架对通过打印机的每一页纸调用一次 OnPrepareDC 和 OnPrint。当重写

    OnPreparePrinting

    函数来指定文档长度时,必须使用打印机页。如果存在一一对应关系(即,一个打印机页等于一个文档页),那么事情就简单了。反之,如果文档页与打印机页并非一一对应,则必须在两者之间进行转换。例如,打印一份电子表格。当重写 OnPreparePrinting 时,必须计算打印整个电子表格所需的纸张数,并在调用 CPrintInfo 的 SetMaxPage 成员函数时使用该值。同样,当重写 OnPrepareDC 时,必须将 m_nCurPage 转换成会出现在特定纸张上的行和列的范围,然后相应调整视区原点。

    打印时分页

    有些情况下,您的视图类可能在文档实际打印之前并不会事先知道文档的长度。例如,如果您的应用程序不是“所见即所得”的,那么屏幕上的文档长度并不对应于其打印时的长度。

    当您为视图类重写

    OnPreparePrinting

    时,就会产生这样的问题:无法向

    CPrintInfo

    结构的 SetMaxPage 函数传递值,因为您不知道文档的长度。如果用户不使用“打印”对话框指定终止页码,框架就不知该在何时停止打印循环。唯一可以确定何时停止打印循环的方法是打印出全部文档并弄清其何时终止。您的视图类必须在文档打印期间检查是否到达文档末尾,并在到达时通知框架。

    框架依赖于您的视图类的

    OnPrepareDC

    函数来告知何时停止。在每次调用 OnPrepareDC 之后,框架检查 CPrintInfo 结构的一个名为 m_bContinuePrinting 的成员。该成员的默认值为 TRUE。只要它保持此默认值,框架就继续打印循环。如果它设置为 FALSE,框架就停止。若要执行打印时分页,请重写 OnPrepareDC 以检查是否已到达文档末尾,如果已经到达,则将 m_bContinuePrinting 设置为 FALSE

    如果当前页大于 1,OnPrepareDC 的默认实现将把 m_bContinuePrinting 设置为 FALSE。这意味着如果未指定文档长度,框架将假设文档的长度为一页。这样做的结果之一就是在调用 OnPrepareDC 的基类版本时必须谨慎。不要假定 m_bContinuePrinting 在调用基类版本之后将为TRUE

    2:MSDN上的一段示例代码:

    1. // get the default printer   
    2. CPrintDialog dlg(FALSE);  
    3. dlg.GetDefaults();  
    4.   
    5. // is a default printer set up?   
    6. HDC hdcPrinter = dlg.GetPrinterDC();  
    7. if (hdcPrinter == NULL)  
    8. {  
    9.    MessageBox(_T("Buy a printer!"));  
    10. }  
    11. else  
    12. {  
    13.    // create a CDC and attach it to the default printer   
    14.    CDC dcPrinter;  
    15.    dcPrinter.Attach(hdcPrinter);  
    16.   
    17.    // call StartDoc() to begin printing   
    18.    DOCINFO docinfo;  
    19.    memset(&docinfo, 0, sizeof(docinfo));  
    20.    docinfo.cbSize = sizeof(docinfo);  
    21.    docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");  
    22.   
    23.    // if it fails, complain and exit gracefully   
    24.    if (dcPrinter.StartDoc(&docinfo) < 0)  
    25.    {  
    26.       MessageBox(_T("Printer wouldn't initalize"));  
    27.    }  
    28.    else  
    29.    {  
    30.       // start a page   
    31.       if (dcPrinter.StartPage() < 0)  
    32.       {  
    33.          MessageBox(_T("Could not start page"));  
    34.          dcPrinter.AbortDoc();  
    35.       }  
    36.       else  
    37.       {  
    38.          // actually do some printing   
    39.          CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);  
    40.   
    41.          dcPrinter.TextOut(50, 50, _T("Hello World!"), 12);  
    42.   
    43.          dcPrinter.EndPage();  
    44.          dcPrinter.EndDoc();  
    45.          dcPrinter.SelectObject(pOldFont);  
    46.       }  
    47.    }  
    48. }  
    save_snippets.png

     

     

     

     

     

     

     

     

     

    前段时间需要将日志信息通过打印机打印出来。

    总结了一下其中的一些用法:

    1:用CPrintDialog 可以呼出窗口让用户选择打印机或者采用默认的打印机直接打印。

        StartPage…..EndPage  完成一页文档的打印。  如需改变DC设置,需要调用ReSetDC()

        多次调用这两个函数,可以实现打印多页

    2:TextOut坐标的确定。

         TextOut中的坐标是DC中的逻辑坐标。

         和实际的物理坐标需要转换。

        GetDeviceCpas();  //获取DC中的Device信息。

        GetTextMetrics(); //获取字体的信息。 字体高度和本身高度+行距。

    3:TextOut中的字体可以设置。

        关键代码如下:

         CFont myFont;

         myFont.CreatePontFont(….);

         oldFont = dc.SelectObject();

         myFont.DelectObject()';

     

     

    附上

    1:转载相关文档:

    打印单位的转换

    这个的关键是我们要得到显示设备的DPI,即每英寸设备支持的点数。有了DPI我们就可以在我们习惯的单位和设备单位之间转换了,用到的API是GetDeviceCaps(),这个函数功能强大,具体可参考MSDN,在这里我们只用来得到设备DPI。看示例代码:

        //某些设备水平和垂直方向的DPI可能不同,所以要分别得到。
    
        //得到水平方向的转换比例
        float getXScale(HDC printDC)  //printDC: 打印机DC设备句柄
        {
            //得到打印机水平方向的DPI
            int xDPI = GetDeviceCaps(printDC, LOGPIXELSX);
    
            //254.0: 每英寸25.4毫米
            float xScale = (float)(254.0 / xDPI);
    
            return xScale;
        }
    
        //得到垂直方向的转换比例
        float getYScale(HDC printDC)  //printDC: 打印机DC设备句柄
        {
            //得到打印机垂直方向的DPI
            int yDPI = GetDeviceCaps(printDC, LOGPIXELSY);
    
            float yScale = (float)(254.0 / yDPI);
    
            return yScale;
        }
    
        //厘米转换为设备像素,水平方向
        double cm2Unit_W(float xScale, double w) //w单位为厘米
        {
            return w*100/xScale;
        }
    
        //厘米转换为设备像素,垂直方向
        double cm2Unit_H(float yScale, double h) //h单位为厘米
        {
            return h*100/yScale;
        }
    

    上面代码中,如果将printDC换为显示器设备DC句柄,即可得到厘米转换为显示器像素单位,打印预览时使用。得到显示器设备句柄可用::GetDC(NULL)得到。

    打印基本流程

    有了前面的知识,现在我们就可以打印了。Windows打印是有着固定的流程的,流程也比较简单。按照固定的顺序调用打印API即可:StartDoc() -> StartPage() -> 打印具体内容 -> EndPage() -> EndDoc()。如果要打印多页,循环StartPage()至EndPage()即可。

    示例代码:

        DOCINFO   doc;   
        ZeroMemory(&doc,sizeof(doc));   
        doc.cbSize = sizeof(doc);   
        doc.lpszDocName = (LPCTSTR)"Print Test File";
    
        StartDoc(printDC, &doc);  //准备打印
    
        StartPage(printDC);  //开始打印页
    
        //在(2.5cm, 2.5cm)处打印文本
        char* text = "打印测试文本";
    
        float xScale = getXScale(printDC);
        float yScale = getYScale(printDC);
    
        double x = cm2Unit_W(xScale, 2.5);
        double y = cm2Unit_H(yScale, 2.5);
    
        //在指定位置打印文本
        TextOut(printDC, (int)x, (int)y, (LPTSTR)text, strlen(text));
    
        EndPage(printDC);  //结束打印页
    
        EndDoc(printDC);  //结束打印
    
    打印字体的设置

    很多时候我们希望能控制打印字体,下面的代码可以创建你想要的字体格式:

        /*  创建自定义打印字体
            fontFace:字体名称,如果为NULL,默认采用“宋体”
            fontHeight:字体高度,单位为厘米
            isBold:是否加粗
            isItalic:是否斜体
            isUnderLine:是否下划线
            isStrikeOut:是否删除线
        */
        HFONT getFont(LPCTSTR fontFace, double fontHeight, bool isBold, bool isItalic, bool isUnderLine, bool isStrikeOut)
        {
            int width = 0; //字体宽度由系统决定
            int weight = FW_NORMAL;
            DWORD italic = 0;
            DWORD underLine = 0;
            DWORD strikeOut = 0;
            DWORD charSet = DEFAULT_CHARSET;
            LPCTSTR face = (LPCTSTR)"宋体";
    
            float height = cm2Unit_H(fontHeight);
    
            if(fontFace != 0)
            {
                face = fontFace;
            }
    
            if(isBold)
            {
                weight = FW_BOLD;
            }
    
            if(isItalic)
            {
                italic = 1;
            }
    
            if(isUnderLine)
            {
                underLine = 1;
            }
    
            if(isStrikeOut)
            {
                strikeOut = 1;
            }
    
            HFONT font = CreateFont((int)height, width, 0, 0, 
                                     weight, italic, underLine, strikeOut, charSet,
                                     OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, 
                                     DEFAULT_PITCH | FF_DONTCARE, face );
            return font;
        }
    
    小结

    以上就是我们在实现打印中遇到的常见问题,相信理解了这些,在我们自己的程序中实现打印就不再是什么困难的事情了。

     

     

     

    打印协议

    为打印多页文档,框架与视图以如下方式交互。首先,框架显示“打印”对话框,为打印机创建设备上下文,并调用

    CDC

    对象的

    StartDoc

    成员函数。然后,对于文档中的每一页,框架调用 CDC 对象的

    StartPage

    成员函数,指示视图对象打印页,并调用

    EndPage

    成员函数。如果在开始某个特定页之前必须更改打印机模式,视图将调用

    ResetDC

    ,它将更新含有新的打印机模式信息的 结构。全部文档打印完毕后,框架调用

    EndDoc

    成员函数。

    重写视图类函数

    CView

    类定义在打印过程中被框架调用的几个成员函数。通过在视图类中重写这些函数,提供框架打印逻辑与视图类打印逻辑之间的连接。下表列出了这些成员函数。

    用于打印的 CView 可重写函数

    名称
    重写原因

    OnPreparePrinting

    在“打印”对话框中插入值,尤其是文档的长度

    OnBeginPrinting

    分配字体或其他 GDI 资源

    OnPrepareDC

    调整给定页的设备上下文属性,或进行打印时分页

    OnPrint

    打印给定页

    OnEndPrinting

    解除分配 GDI 资源

    也可用其他函数执行打印相关处理,但这些函数是驱动打印过程的函数。

    下图阐释了打印过程所涉及的步骤,并显示了在何处调用 CView 的每个打印成员函数。本文其余部分是对大多数步骤更详细的解释。一文介绍了打印过程的其他部分。

    打印循环

    分页

    框架在

    CPrintInfo

    结构中存储许多关于打印作业的信息。CPrintInfo 中的几个值是关于分页的;这些值如下表所示。

    存储在 CPrintInfo 中的页码信息

    成员变量或函数名
    引用的页码

    GetMinPage/SetMinPage
    文档的第一页

    GetMaxPage/SetMaxPage
    文档的最后一页

    GetFromPage
    要打印的第一页

    GetToPage
    要打印的最后一页

    m_nCurPage
    当前正在打印的页

    页码从 1 开始,也就是说,第一页的编号为 1,而不是 0。有关上述及其他

    CPrintInfo

    成员的更多信息,请参见“MFC 参考”。

    在打印过程的开始,框架调用视图的

    OnPreparePrinting

    成员函数,向 CPrintInfo 结构传递一个指针。“应用程序向导”提供调用 CView 的另一个成员函数

    DoPreparePrinting

    OnPreparePrinting 实现。DoPreparePrinting 是显示“打印”对话框并创建打印机设备上下文的函数。

    这时,应用程序并不知道文档的页数。它对文档的第一页和最后一页的页码使用默认值 1 和 0xFFFF。如果您知道文档的页数,在将文档发送到 DoPreparePrinting 之前,请重写 OnPreparePrinting,并为 CPrintInfo 结构调用

    SetMaxPage

    。这使您得以指定文档的长度。

    接下来 DoPreparePrinting 显示“打印”对话框。当它返回时,CPrintInfo 结构包含用户指定的值。如果用户希望只打印选定页码范围内的文档,他或她可以在“打印”对话框中指定起始页码和终止页码。框架使用

    CPrintInfo

    GetFromPageGetToPage 函数检索这些值。如果用户未指定页码范围,框架将调用 GetMinPageGetMaxPage 并使用返回的值来打印整个文档。

    对于文档中将要打印的每一页,框架调用视图类中的两个成员函数(

    OnPrepareDC

    OnPrint

    ),并传递给每个函数两个参数:一个指向

    CDC

    对象的指针和一个指向 CPrintInfo 结构的指针。每次当框架调用 OnPrepareDCOnPrint 时,它都传递 CPrintInfo 结构的 m_nCurPage 成员中的不同值。框架通过这种方式通知视图要打印哪些页。

    OnPrepareDC

    成员函数也可用于屏幕显示。它在绘制之前调整设备上下文。OnPrepareDC 在打印中起同样的作用,但有两点不同:首先,CDC 对象表示打印机设备上下文而不是屏幕设备上下文;其次,CPrintInfo 对象作为第二个参数传递。(当为屏幕显示调用 OnPrepareDC 时,此参数为 NULL。)重写 OnPrepareDC 以便根据正在打印的页的不同来调整设备上下文。例如,可通过移动视区原点和剪辑区域,确保文档中的适当部分得到打印。

    OnPrint

    成员函数执行页的实际打印。一文显示了框架是如何用打印机设备上下文调用

    OnDraw

    来执行打印的。更确切地说,框架用 CPrintInfo 结构和设备上下文调用 OnPrintOnPrint 将设备上下文传递给 OnDraw。重写 OnPrint,执行任何只应在打印而非屏幕显示期间完成的呈现。例如,打印页眉或页脚(有关更多信息,请参见一文)。然后,从 OnPrint 的重写调用 OnDraw 来进行屏幕显示和打印的共同呈现。

    OnDraw 既进行屏幕显示呈现又进行打印呈现的事实意味着您的应用程序是 WYSIWYG(所见即所得)。然而,假设您正在写的不是“所见即所得”应用程序。例如,一个文本编辑器使用粗体作为打印字体,但同时显示控制代码指示屏幕上粗体文本。对于这种情况,应严格使用 OnDraw 进行屏幕显示。当您重写 OnPrint 时,用一个对单独绘制函数的调用取代对 OnDraw 的调用。该函数使用未显示在屏幕上的属性,以文档显示在纸上的方式绘制文档。

    打印机页与文档页

    提到页码,有时必须得区分打印机页的概念和文档页的概念。从打印机的角度讲,一页是一张纸。但是,一张纸并不一定等于文档中的一页。例如,如果打印一份通讯稿,纸张将要折叠,一张纸可能同时含有文档的第一页和最后一页(它们是并排的)。同样,如果打印一份电子表格,文档根本不是由页组成的。相反,一张纸可能包含第一到第二十行,第六到第十列。

    所有

    CPrintInfo

    结构中的页码都是指打印机页。框架对通过打印机的每一页纸调用一次 OnPrepareDCOnPrint。当重写

    OnPreparePrinting

    函数来指定文档长度时,必须使用打印机页。如果存在一一对应关系(即,一个打印机页等于一个文档页),那么事情就简单了。反之,如果文档页与打印机页并非一一对应,则必须在两者之间进行转换。例如,打印一份电子表格。当重写 OnPreparePrinting 时,必须计算打印整个电子表格所需的纸张数,并在调用 CPrintInfoSetMaxPage 成员函数时使用该值。同样,当重写 OnPrepareDC 时,必须将 m_nCurPage 转换成会出现在特定纸张上的行和列的范围,然后相应调整视区原点。

    打印时分页

    有些情况下,您的视图类可能在文档实际打印之前并不会事先知道文档的长度。例如,如果您的应用程序不是“所见即所得”的,那么屏幕上的文档长度并不对应于其打印时的长度。

    当您为视图类重写

    OnPreparePrinting

    时,就会产生这样的问题:无法向

    CPrintInfo

    结构的 SetMaxPage 函数传递值,因为您不知道文档的长度。如果用户不使用“打印”对话框指定终止页码,框架就不知该在何时停止打印循环。唯一可以确定何时停止打印循环的方法是打印出全部文档并弄清其何时终止。您的视图类必须在文档打印期间检查是否到达文档末尾,并在到达时通知框架。

    框架依赖于您的视图类的

    OnPrepareDC

    函数来告知何时停止。在每次调用 OnPrepareDC 之后,框架检查 CPrintInfo 结构的一个名为 m_bContinuePrinting 的成员。该成员的默认值为 TRUE。只要它保持此默认值,框架就继续打印循环。如果它设置为 FALSE,框架就停止。若要执行打印时分页,请重写 OnPrepareDC 以检查是否已到达文档末尾,如果已经到达,则将 m_bContinuePrinting 设置为 FALSE

    如果当前页大于 1,OnPrepareDC 的默认实现将把 m_bContinuePrinting 设置为 FALSE。这意味着如果未指定文档长度,框架将假设文档的长度为一页。这样做的结果之一就是在调用 OnPrepareDC 的基类版本时必须谨慎。不要假定 m_bContinuePrinting 在调用基类版本之后将为 TRUE

    2:MSDN上的一段示例代码:

    // get the default printer
    CPrintDialog dlg(FALSE);
    dlg.GetDefaults();
    
    // is a default printer set up?
    HDC hdcPrinter = dlg.GetPrinterDC();
    if (hdcPrinter == NULL)
    {
       MessageBox(_T("Buy a printer!"));
    }
    else
    {
       // create a CDC and attach it to the default printer
       CDC dcPrinter;
       dcPrinter.Attach(hdcPrinter);
    
       // call StartDoc() to begin printing
       DOCINFO docinfo;
       memset(&docinfo, 0, sizeof(docinfo));
       docinfo.cbSize = sizeof(docinfo);
       docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");
    
       // if it fails, complain and exit gracefully
       if (dcPrinter.StartDoc(&docinfo) < 0)
       {
          MessageBox(_T("Printer wouldn't initalize"));
       }
       else
       {
          // start a page
          if (dcPrinter.StartPage() < 0)
          {
             MessageBox(_T("Could not start page"));
             dcPrinter.AbortDoc();
          }
          else
          {
             // actually do some printing
             CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);
    
             dcPrinter.TextOut(50, 50, _T("Hello World!"), 12);
    
             dcPrinter.EndPage();
             dcPrinter.EndDoc();
             dcPrinter.SelectObject(pOldFont);
          }
       }
    }

    前段时间需要将日志信息通过打印机打印出来。

    总结了一下其中的一些用法:

    1:用CPrintDialog 可以呼出窗口让用户选择打印机或者采用默认的打印机直接打印。

        StartPage…..EndPage  完成一页文档的打印。  如需改变DC设置,需要调用ReSetDC()

        多次调用这两个函数,可以实现打印多页

    2:TextOut坐标的确定。

         TextOut中的坐标是DC中的逻辑坐标。

         和实际的物理坐标需要转换。

        GetDeviceCpas();  //获取DC中的Device信息。

        GetTextMetrics(); //获取字体的信息。 字体高度和本身高度+行距。

    3:TextOut中的字体可以设置。

        关键代码如下:

         CFont myFont;

         myFont.CreatePontFont(….);

         oldFont = dc.SelectObject();

         myFont.DelectObject()’;

     

     

    附上

    1:转载相关文档:

    打印单位的转换

    这个的关键是我们要得到显示设备的DPI,即每英寸设备支持的点数。有了DPI我们就可以在我们习惯的单位和设备单位之间转换了,用到的API是GetDeviceCaps(),这个函数功能强大,具体可参考MSDN,在这里我们只用来得到设备DPI。看示例代码:

        //某些设备水平和垂直方向的DPI可能不同,所以要分别得到。
    
        //得到水平方向的转换比例
        float getXScale(HDC printDC)  //printDC: 打印机DC设备句柄
        {
            //得到打印机水平方向的DPI
            int xDPI = GetDeviceCaps(printDC, LOGPIXELSX);
    
            //254.0: 每英寸25.4毫米
            float xScale = (float)(254.0 / xDPI);
    
            return xScale;
        }
    
        //得到垂直方向的转换比例
        float getYScale(HDC printDC)  //printDC: 打印机DC设备句柄
        {
            //得到打印机垂直方向的DPI
            int yDPI = GetDeviceCaps(printDC, LOGPIXELSY);
    
            float yScale = (float)(254.0 / yDPI);
    
            return yScale;
        }
    
        //厘米转换为设备像素,水平方向
        double cm2Unit_W(float xScale, double w) //w单位为厘米
        {
            return w*100/xScale;
        }
    
        //厘米转换为设备像素,垂直方向
        double cm2Unit_H(float yScale, double h) //h单位为厘米
        {
            return h*100/yScale;
        }
    

    上面代码中,如果将printDC换为显示器设备DC句柄,即可得到厘米转换为显示器像素单位,打印预览时使用。得到显示器设备句柄可用::GetDC(NULL)得到。

    打印基本流程

    有了前面的知识,现在我们就可以打印了。Windows打印是有着固定的流程的,流程也比较简单。按照固定的顺序调用打印API即可:StartDoc() -> StartPage() -> 打印具体内容 -> EndPage() -> EndDoc()。如果要打印多页,循环StartPage()至EndPage()即可。

    示例代码:

        DOCINFO   doc;   
        ZeroMemory(&doc,sizeof(doc));   
        doc.cbSize = sizeof(doc);   
        doc.lpszDocName = (LPCTSTR)"Print Test File";
    
        StartDoc(printDC, &doc);  //准备打印
    
        StartPage(printDC);  //开始打印页
    
        //在(2.5cm, 2.5cm)处打印文本
        char* text = "打印测试文本";
    
        float xScale = getXScale(printDC);
        float yScale = getYScale(printDC);
    
        double x = cm2Unit_W(xScale, 2.5);
        double y = cm2Unit_H(yScale, 2.5);
    
        //在指定位置打印文本
        TextOut(printDC, (int)x, (int)y, (LPTSTR)text, strlen(text));
    
        EndPage(printDC);  //结束打印页
    
        EndDoc(printDC);  //结束打印
    
    打印字体的设置

    很多时候我们希望能控制打印字体,下面的代码可以创建你想要的字体格式:

        /*  创建自定义打印字体
            fontFace:字体名称,如果为NULL,默认采用“宋体”
            fontHeight:字体高度,单位为厘米
            isBold:是否加粗
            isItalic:是否斜体
            isUnderLine:是否下划线
            isStrikeOut:是否删除线
        */
        HFONT getFont(LPCTSTR fontFace, double fontHeight, bool isBold, bool isItalic, bool isUnderLine, bool isStrikeOut)
        {
            int width = 0; //字体宽度由系统决定
            int weight = FW_NORMAL;
            DWORD italic = 0;
            DWORD underLine = 0;
            DWORD strikeOut = 0;
            DWORD charSet = DEFAULT_CHARSET;
            LPCTSTR face = (LPCTSTR)"宋体";
    
            float height = cm2Unit_H(fontHeight);
    
            if(fontFace != 0)
            {
                face = fontFace;
            }
    
            if(isBold)
            {
                weight = FW_BOLD;
            }
    
            if(isItalic)
            {
                italic = 1;
            }
    
            if(isUnderLine)
            {
                underLine = 1;
            }
    
            if(isStrikeOut)
            {
                strikeOut = 1;
            }
    
            HFONT font = CreateFont((int)height, width, 0, 0, 
                                     weight, italic, underLine, strikeOut, charSet,
                                     OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, 
                                     DEFAULT_PITCH | FF_DONTCARE, face );
            return font;
        }
    
    小结

    以上就是我们在实现打印中遇到的常见问题,相信理解了这些,在我们自己的程序中实现打印就不再是什么困难的事情了。

     

     

     

    打印协议

    为打印多页文档,框架与视图以如下方式交互。首先,框架显示“打印”对话框,为打印机创建设备上下文,并调用

    CDC

    对象的

    StartDoc

    成员函数。然后,对于文档中的每一页,框架调用 CDC 对象的

    StartPage

    成员函数,指示视图对象打印页,并调用

    EndPage

    成员函数。如果在开始某个特定页之前必须更改打印机模式,视图将调用

    ResetDC

    ,它将更新含有新的打印机模式信息的 结构。全部文档打印完毕后,框架调用

    EndDoc

    成员函数。

    重写视图类函数

    CView

    类定义在打印过程中被框架调用的几个成员函数。通过在视图类中重写这些函数,提供框架打印逻辑与视图类打印逻辑之间的连接。下表列出了这些成员函数。

    用于打印的 CView 可重写函数

    名称
    重写原因

    OnPreparePrinting

    在“打印”对话框中插入值,尤其是文档的长度

    OnBeginPrinting

    分配字体或其他 GDI 资源

    OnPrepareDC

    调整给定页的设备上下文属性,或进行打印时分页

    OnPrint

    打印给定页

    OnEndPrinting

    解除分配 GDI 资源

    也可用其他函数执行打印相关处理,但这些函数是驱动打印过程的函数。

    下图阐释了打印过程所涉及的步骤,并显示了在何处调用 CView 的每个打印成员函数。本文其余部分是对大多数步骤更详细的解释。一文介绍了打印过程的其他部分。

    打印循环

    分页

    框架在

    CPrintInfo

    结构中存储许多关于打印作业的信息。CPrintInfo 中的几个值是关于分页的;这些值如下表所示。

    存储在 CPrintInfo 中的页码信息

    成员变量或函数名
    引用的页码

    GetMinPage/SetMinPage
    文档的第一页

    GetMaxPage/SetMaxPage
    文档的最后一页

    GetFromPage
    要打印的第一页

    GetToPage
    要打印的最后一页

    m_nCurPage
    当前正在打印的页

    页码从 1 开始,也就是说,第一页的编号为 1,而不是 0。有关上述及其他

    CPrintInfo

    成员的更多信息,请参见“MFC 参考”。

    在打印过程的开始,框架调用视图的

    OnPreparePrinting

    成员函数,向 CPrintInfo 结构传递一个指针。“应用程序向导”提供调用 CView 的另一个成员函数

    DoPreparePrinting

    OnPreparePrinting 实现。DoPreparePrinting 是显示“打印”对话框并创建打印机设备上下文的函数。

    这时,应用程序并不知道文档的页数。它对文档的第一页和最后一页的页码使用默认值 1 和 0xFFFF。如果您知道文档的页数,在将文档发送到 DoPreparePrinting 之前,请重写 OnPreparePrinting,并为 CPrintInfo 结构调用

    SetMaxPage

    。这使您得以指定文档的长度。

    接下来 DoPreparePrinting 显示“打印”对话框。当它返回时,CPrintInfo 结构包含用户指定的值。如果用户希望只打印选定页码范围内的文档,他或她可以在“打印”对话框中指定起始页码和终止页码。框架使用

    CPrintInfo

    GetFromPageGetToPage 函数检索这些值。如果用户未指定页码范围,框架将调用 GetMinPageGetMaxPage 并使用返回的值来打印整个文档。

    对于文档中将要打印的每一页,框架调用视图类中的两个成员函数(

    OnPrepareDC

    OnPrint

    ),并传递给每个函数两个参数:一个指向

    CDC

    对象的指针和一个指向 CPrintInfo 结构的指针。每次当框架调用 OnPrepareDCOnPrint 时,它都传递 CPrintInfo 结构的 m_nCurPage 成员中的不同值。框架通过这种方式通知视图要打印哪些页。

    OnPrepareDC

    成员函数也可用于屏幕显示。它在绘制之前调整设备上下文。OnPrepareDC 在打印中起同样的作用,但有两点不同:首先,CDC 对象表示打印机设备上下文而不是屏幕设备上下文;其次,CPrintInfo 对象作为第二个参数传递。(当为屏幕显示调用 OnPrepareDC 时,此参数为 NULL。)重写 OnPrepareDC 以便根据正在打印的页的不同来调整设备上下文。例如,可通过移动视区原点和剪辑区域,确保文档中的适当部分得到打印。

    OnPrint

    成员函数执行页的实际打印。一文显示了框架是如何用打印机设备上下文调用

    OnDraw

    来执行打印的。更确切地说,框架用 CPrintInfo 结构和设备上下文调用 OnPrintOnPrint 将设备上下文传递给 OnDraw。重写 OnPrint,执行任何只应在打印而非屏幕显示期间完成的呈现。例如,打印页眉或页脚(有关更多信息,请参见一文)。然后,从 OnPrint 的重写调用 OnDraw 来进行屏幕显示和打印的共同呈现。

    OnDraw 既进行屏幕显示呈现又进行打印呈现的事实意味着您的应用程序是 WYSIWYG(所见即所得)。然而,假设您正在写的不是“所见即所得”应用程序。例如,一个文本编辑器使用粗体作为打印字体,但同时显示控制代码指示屏幕上粗体文本。对于这种情况,应严格使用 OnDraw 进行屏幕显示。当您重写 OnPrint 时,用一个对单独绘制函数的调用取代对 OnDraw 的调用。该函数使用未显示在屏幕上的属性,以文档显示在纸上的方式绘制文档。

    打印机页与文档页

    提到页码,有时必须得区分打印机页的概念和文档页的概念。从打印机的角度讲,一页是一张纸。但是,一张纸并不一定等于文档中的一页。例如,如果打印一份通讯稿,纸张将要折叠,一张纸可能同时含有文档的第一页和最后一页(它们是并排的)。同样,如果打印一份电子表格,文档根本不是由页组成的。相反,一张纸可能包含第一到第二十行,第六到第十列。

    所有

    CPrintInfo

    结构中的页码都是指打印机页。框架对通过打印机的每一页纸调用一次 OnPrepareDCOnPrint。当重写

    OnPreparePrinting

    函数来指定文档长度时,必须使用打印机页。如果存在一一对应关系(即,一个打印机页等于一个文档页),那么事情就简单了。反之,如果文档页与打印机页并非一一对应,则必须在两者之间进行转换。例如,打印一份电子表格。当重写 OnPreparePrinting 时,必须计算打印整个电子表格所需的纸张数,并在调用 CPrintInfoSetMaxPage 成员函数时使用该值。同样,当重写 OnPrepareDC 时,必须将 m_nCurPage 转换成会出现在特定纸张上的行和列的范围,然后相应调整视区原点。

    打印时分页

    有些情况下,您的视图类可能在文档实际打印之前并不会事先知道文档的长度。例如,如果您的应用程序不是“所见即所得”的,那么屏幕上的文档长度并不对应于其打印时的长度。

    当您为视图类重写

    OnPreparePrinting

    时,就会产生这样的问题:无法向

    CPrintInfo

    结构的 SetMaxPage 函数传递值,因为您不知道文档的长度。如果用户不使用“打印”对话框指定终止页码,框架就不知该在何时停止打印循环。唯一可以确定何时停止打印循环的方法是打印出全部文档并弄清其何时终止。您的视图类必须在文档打印期间检查是否到达文档末尾,并在到达时通知框架。

    框架依赖于您的视图类的

    OnPrepareDC

    函数来告知何时停止。在每次调用 OnPrepareDC 之后,框架检查 CPrintInfo 结构的一个名为 m_bContinuePrinting 的成员。该成员的默认值为 TRUE。只要它保持此默认值,框架就继续打印循环。如果它设置为 FALSE,框架就停止。若要执行打印时分页,请重写 OnPrepareDC 以检查是否已到达文档末尾,如果已经到达,则将 m_bContinuePrinting 设置为 FALSE

    如果当前页大于 1,OnPrepareDC 的默认实现将把 m_bContinuePrinting 设置为 FALSE。这意味着如果未指定文档长度,框架将假设文档的长度为一页。这样做的结果之一就是在调用 OnPrepareDC 的基类版本时必须谨慎。不要假定 m_bContinuePrinting 在调用基类版本之后将为 TRUE

    2:MSDN上的一段示例代码:

    // get the default printer
    CPrintDialog dlg(FALSE);
    dlg.GetDefaults();
    
    // is a default printer set up?
    HDC hdcPrinter = dlg.GetPrinterDC();
    if (hdcPrinter == NULL)
    {
       MessageBox(_T("Buy a printer!"));
    }
    else
    {
       // create a CDC and attach it to the default printer
       CDC dcPrinter;
       dcPrinter.Attach(hdcPrinter);
    
       // call StartDoc() to begin printing
       DOCINFO docinfo;
       memset(&docinfo, 0, sizeof(docinfo));
       docinfo.cbSize = sizeof(docinfo);
       docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");
    
       // if it fails, complain and exit gracefully
       if (dcPrinter.StartDoc(&docinfo) < 0)
       {
          MessageBox(_T("Printer wouldn't initalize"));
       }
       else
       {
          // start a page
          if (dcPrinter.StartPage() < 0)
          {
             MessageBox(_T("Could not start page"));
             dcPrinter.AbortDoc();
          }
          else
          {
             // actually do some printing
             CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);
    
             dcPrinter.TextOut(50, 50, _T("Hello World!"), 12);
    
             dcPrinter.EndPage();
             dcPrinter.EndDoc();
             dcPrinter.SelectObject(pOldFont);
          }
       }
    }

    document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
        <div id="digg" articleid="8282420">
            <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">
    
                 <dt>顶</dt>
                <dd>0</dd>
            </dl>
    
    
            <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">
    
                  <dt>踩</dt>
                <dd>0</dd>               
            </dl>
    
        </div>
     <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
    <div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
    <script type="text/javascript">
                function btndigga() {
                    $(".tracking-ad[data-mod='popu_222'] a").click();
                }
                function btnburya() {
                    $(".tracking-ad[data-mod='popu_223'] a").click();
                }
            </script>
    

    <div style="clear:both; height:10px;"></div>
    

    展开全文
  • Odoo 打印预览

    千次阅读 2018-08-01 10:55:55
    Odoo 默认打印都是必须下载PDF 文件,然后手动打开才能查看或预览。 此模块可以在点击打印按钮后,直接预览PDF文件,进行打印。 有需要的,可以到以下网址进行下载: ... ......

    Odoo 默认打印都是必须下载PDF 文件,然后手动打开才能查看或预览。

    此模块可以在点击打印按钮后,直接预览PDF文件,进行打印。

    有需要的,可以到以下网址进行下载:

    https://apps.odoo.com/apps/modules/11.0/report_pdf_preview/

     

    需要支持的请联系:

    QQ: 54773801

    Odoo 打印 预览

    展开全文
  • JS实现浏览器打印、打印预览

    千次阅读 2019-05-10 17:39:19
    JS实现浏览器打印、打印预览 1.JS实现打印的方式方式一:window.print()window.print();会弹出打印对话框,打印的是window.document.body.innerHTML中的内容,下面是从网上摘到的一个局部打印的例子,该...

    JS实现浏览器打印、打印预览

    1.JS实现打印的方式
    方式一:window.print()
    window.print();会弹出打印对话框,打印的是window.document.body.innerHTML中的内容,下面是从网上摘到的一个局部打印的例子,该例子的不足是打印会修改页面的内容。

    复制代码
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>局部打印案例</title>
    <script type="text/javascript"> 
    function doPrint() { 

    if (confirm('确定打印吗?')){
    try{
    print.portrait = false ;//横向打印
    }catch(e){
    //alert("不支持此方法");
    }

    bdhtml=window.document.body.innerHTML; 

    sprnstr="<!--startprint-->"; 
    eprnstr="<!--endprint-->"; 
    prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); 
    prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); 
    window.document.body.innerHTML=prnhtml; 
    window.print(); 
    } 
    </script>
    </head>
    

    <body>
    <p>1不需要打印的地方</p>
    <p>2这里不要打印啊</p>
    <!–startprint–><!–注意要加上html里star和end的这两个标记–>
    <h1>打印标题</h1>
    <p>打印内容~~</p>
    <!–endprint–>
    <button type=“button” onclick=“doPrint()”>打印</button>
    <p>不打印的地方啊哈哈哈哈</p>
    <p>2</p>
    </body>
    </html>

    复制代码

    方式二:使用html 标签<object>引入Webbrowser控件
    这种方式是其只兼容IE,其他浏览器不可使用,同时IE10以下的浏览器才可以使用,调用方式如下:

    复制代码
    <body>
    <object id="WebBrowser" classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height="0" width="0"> </object>
    </body>
    <script>
    WebBrowser.ExecWB(1,1) //打开 
    WebBrowser.ExecWB(2,1) //关闭现在所有的IE窗口,并打开一个新窗口 
    WebBrowser.ExecWB(4,1) //保存网页
    //--------------- 常用 ---------------    
    WebBrowser.ExecWB(6,1) //打印 
    WebBrowser.ExecWB(7,1) //打印预览 
    WebBrowser.ExecWB(8,1) //打印页面设置 
    //-------------------------------------    
    WebBrowser.ExecWB(10,1) //查看页面属性 
    WebBrowser.ExecWB(15,1) //撤销 
    WebBrowser.ExecWB(17,1) //全选 
    WebBrowser.ExecWB(22,1) //刷新 
    WebBrowser.ExecWB(45,1) //关闭窗体无提示
    </script>
    复制代码

    这种方式优势是在IE下可以弹出打印预览,这是打印很人性化的功能,但是遗憾的是高版本的IE浏览器不支持WebBrowser了

    方式三:采用document.execCommand(”print”)
    该方式也兼容各个版本的浏览器,同window.print()一样,其启动的是打印对话框,chrome的打印对话框自带预览功能,但是IE、火狐仅仅只弹出打印设置对话框,没有预览功能。

    方式四:采用JQuery插件
    使用JQuery浏览插件可以很方便的进行局部打印,常用的插件有:

    1)jquery.print.js 下载地址:https://github.com/DoersGuild/jQuery.print

    2)jquery.print-preview.js 下载地址:https://github.com/etimbo/jquery-print-preview-plugin

    这两种方式使用都很简单,1)通过$("#id").print(/*options*/);调用;2)通过$('#id').printArea(/*options*/); 其中的option可选项可以在下载地址下载下来后看示例代码,一般options不用传即可,示例代码如下:

    复制代码
    <html>
    <head>
    <meta http-equiv=Content-Type content="text/html; charset=utf-8">
    <title>JQuery打印</title>
    <script type="text/javascript" src="./js/jquery-3.1.1.min.js"></script>
    <script language="javascript" src="./js/jquery.print.js"></script>
    </head>
    

    <body style=‘margin:0 auto;text-align:center;’>
    <button id=‘button_print’ name=‘button_print’ onclick=“javascript:printit()>打印</button>
    <div id=‘ganburenmianbaio’ class=“
    WordSection1” style=‘width:750px;margin:0 auto;text-align:center;vertical-align: middle;’>
    </div>
    </body>
    <script language=“javascript”>
    function printit(){
    $(”#ganburenmianbaio").print({iframe:true,prepend:’
    <br/>’});
    }
    </script>
    </html>

    复制代码

    方式五:采用浏览器打印第三方插件
    该方式需要用户浏览器安装相关的第三方插件,用户体验不好,故在此不细述了。

    2.打印预览
    chrome浏览器、win10自带的IE浏览器 调用打印弹出的打印设置界面中包含打印预览部分,故其通过上面的打印函数的调用即可实现。

    IE9以后的版本、火狐不支持webbrowser控件了,JS调用不了浏览器的打印预览的功能,我们只能用iframe模拟打印预览的对话框,将需要打印的内容显示在该对话框中,然后在调用打印的功能实现打印。

    1)jquery打印预览插件
    jquery.print-preview.js 下载地址:https://github.com/etimbo/jquery-print-preview-plugin

    其实现的效果如下图(其自动的示例代码)

     

    2)webbrowser控件打印预览
    IE8及以下版本可以调用WebBrowser.ExecWB(7,1) 函数弹出浏览器的打印预览对话框,采用该函数的好处是 用户可以在打印预览对话框中 调整页边距、页眉、页脚;

    下面贴出的是设置页边距、页眉、页脚的JS代码

    复制代码
    //取得页面打印设置的原参数数据 
    function PageSetup_temp(){ 
    try 
    { 
    var Wsh=new ActiveXObject("WScript.Shell"); 
    HKEY_Key="header"; 
    //取得页眉默认值 
    head = Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key); 
    HKEY_Key="footer"; 
    //取得页脚默认值 
    foot = Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key); 
    HKEY_Key="margin_bottom"; 
    //取得下页边距 
    bottom = Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key); 
    HKEY_Key="margin_left"; 
    //取得左页边距 
    left = Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key); 
    HKEY_Key="margin_right"; 
    //取得右页边距 
    right = Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key); 
    HKEY_Key="margin_top"; 
    //取得上页边距 
    top = Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key); 
    } 
    catch(e){ 
    //alert("不允许ActiveX控件"); 
    } 
    } 
    

    //设置网页打印的页眉页脚和页边距,注册表里的单位是英寸,打印设置中是毫米,1英寸=25.4毫米
    function PageSetup_Null(){
    try
    {
    var Wsh=new ActiveXObject(“WScript.Shell”);
    HKEY_Key=“header”;
    //设置页眉(为空)
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");
    HKEY_Key=“footer”;
    //设置页脚(为空)
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");
    HKEY_Key=“margin_bottom”;
    //设置下页边距(0)
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,“0.6”);
    HKEY_Key=“margin_left”;
    //设置左页边距(0)
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,“0.3”);
    HKEY_Key=“margin_right”;
    //设置右页边距(0)
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,“0.3”);
    HKEY_Key=“margin_top”;
    //设置上页边距(8)
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,“0.6”);
    }
    catch(e){
    //alert(“不允许ActiveX控件”);
    }
    }

    //设置网页打印的页眉页脚和页边距为默认值
    function PageSetup_Default(){
    try
    {
    var Wsh=new ActiveXObject(“WScript.Shell”);
    HKEY_Key=“header”;
    HKEY_Key=“header”;
    //还原页眉
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,head);
    HKEY_Key=“footer”;
    //还原页脚
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,foot);
    HKEY_Key=“margin_bottom”;
    //还原下页边距
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,bottom);
    HKEY_Key=“margin_left”;
    //还原左页边距
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,left);
    HKEY_Key=“margin_right”;
    //还原右页边距
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,right);
    HKEY_Key=“margin_top”;
    //还原上页边距
    Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,top);
    }
    catch(e){
    //alert(“不允许ActiveX控件”);
    }
    }

    复制代码

    使用该函数,会弹出

     

    通过网页修改activex安全设置,添加信任站点,禁用该弹出窗口提示,代码如下:

    复制代码
    function activeXControl(){
    try{
    var WshShell=new ActiveXObject("WScript.Shell");
    

    //添加信任站点(http://127.0.0.1)
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range100\”,"");
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range100\:Range”,“127.0.0.1”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range100\http”,“2”,“REG_DWORD”);

    //修改IE ActiveX安全设置: 1本地Intranet区域
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1\1001”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1\1004”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1\1200”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1\1201”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1\1405”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1\2201”,“0”,“REG_DWORD”);

    //修改IE ActiveX安全设置:2受信任的站点区域
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2\1001”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2\1004”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2\1200”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2\1201”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2\1405”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2\2201”,“0”,“REG_DWORD”);

    //修改IE ActiveX安全设置:3Internet区域
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1001”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1004”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1200”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1201”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1405”,“0”,“REG_DWORD”);
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\2201”,“0”,“REG_DWORD”);

    //禁用Winxp弹出窗口阻止程序
    WshShell.RegWrite(“HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\New Windows\PopupMgr”,“no”);
    }catch(e){
    //alert(“不允许ActiveX控件”);
    }
    }

    复制代码

    3.问题
    1)网页修改activex安全设置该段代码也是必须在启用ActiveX的条件下调用成功,是需要用户在Internet的配置项中设置的(如下图),如何才能自动启用该插件?

     

     

    2) chrome、火狐如何通过JS设置页边距、页眉、页脚?

    3) IE高版本浏览器、火狐如何通过JS弹出浏览器自己的打印预览?

    分类: web前端
    展开全文
  • 打印预览

    千次阅读 2010-08-18 15:55:00
    使用PrintPreviewDialog类 如下图所示的打印预览窗体,使用PrintPreviewDialog类可以轻松实现。 <br />这里所介绍的例子,是在「执行打印」中所介绍的方法追加的基础上,点击按钮(Button1)时,表示打印...

    使用PrintPreviewDialog类

    如下图所示的打印预览窗体,使用PrintPreviewDialog类可以轻松实现。

    这里所介绍的例子,是在「执行打印」中所介绍的方法追加的基础上,点击按钮(Button1)时,表示打印预览窗体。

    [C#]

    private void button1_Click(object sender, System.EventArgs e)
    {
    //PrintDocument对象作成
    System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
     //PrintPage事件处理器追加
    pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(pd_PrintPage);
    //PrintPreviewDialog对象作成
    PrintPreviewDialog ppd = new PrintPreviewDialog();
    //设定预览用的
    PrintDocument ppd.Document = pd;
     //表示打印预览用窗体
    ppd.ShowDialog();
    }
    private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    //读取图片
     Image img = Image.FromFile("c:/test.bmp");
    //描绘图片
    e.Graphics.DrawImage(img, e.MarginBounds);
     //没有时通知
    e.HasMorePages = false;
     //资源释放
    img.Dispose();
    }

    窗体的样式是在安全检查中追加PrintPreviewDialog组件所形成的。关于PrintPreviewDialog组件的使用方法,请参考「在 Windows 应用程序中显示打印预览」。

    相关:指定打印预览窗体位置、表示比率

    使用PrintPreviewControl类

    接下来介绍使用PrintPreviewControl控件表示打印预览窗体的方法。在不想常规窗体时,可以使用这个方法。

    下面的例子也一样,是在「执行打印」中所介绍的方法的基础上追加的,当点击按钮(Button1)时,打印预览窗体在PrintPreviewControl控件(PrintPreviewControl1)中表示。(Button1和PrintPreviewControl1在窗体中需要追加。)

    [C#]

    private void button1_Click(object sender, System.EventArgs e)
    {
    //PrintDocument对象作成
    System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
    //PrintPage事件处理器追加
    pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(pd_PrintPage);
    //设定预览用的
    PrintDocument PrintPreviewControl1.Document = pd;
    }
    private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
     //读取图片
     Image img = Image.FromFile("c:/test.bmp");
    //描绘图片
     e.Graphics.DrawImage(img, e.MarginBounds);
    //下一页没有时通知
    e.HasMorePages = false;
    //资源释放
     img.Dispose();
    }
    展开全文
  • 我在C# 中进入打印预览界面 我要如何获得打印预览中的打印事件呢? 我需要通过他来改变我 数据库中 是否打印的状态 求指教
  • MFC文档/视图的应用程序,向导给了打印及打印预览的标准支持。使这类应用程序打印及打印预览工作得以简化。另一类对话框程序却没有相应支持,从MFC打印及打印预览的标准支持入手,可以在对话框程序中,增加三个类以...
  • 打印预览和实际的打印不一致问题

    千次阅读 2019-12-17 14:05:25
    1打印预览和实际的打印的打印机不一致, 打印预览使用的是系统自带的各种虚拟的打印机,但实际打印时却是实际的打印机。 需要判断PrinterName是否一致 System.Drawing.Printing.PrintDocument对象的 string ...
  • js打印预览

    2018-06-05 17:17:07
    打印预览 之前在做打印预览的功能时,想着方便一点使用了document.execCommand('print') ,而在预览的时候发现打印按钮也在上面,不是纯表单,网上搜了一下发现了一个很简单的方法,在 &amp;lt;style type=&...
  • js打印预览功能

    2017-02-22 15:07:49
    js打印预览,并且打印自己要求的区域,简单的demo,自己写的,大家去下载吧
  • JS实现的打印、打印预览功能

    热门讨论 2011-06-02 09:32:06
    JS实现的打印、直接打印、打印预览功能,非常简单实用
  • ArcGIS 指定行列 批量打印 分页预览 打印预览
  • javascript 打印预览 打印

    千次阅读 2009-07-01 21:29:00
    function printpr() //预览函数{document.all("qingkongyema").click();... //打印之前先隐藏不想打印输出的元素(此例中隐藏“打印”和“打印预览”两个按钮)var OLECMDID = 7;var PROMPT = 1;var W
  • JS实现打印功能(包括打印预览、打印设置等) 绪 最近在进行项目开发时,需要实现后台管理端打印功能,遂在网上一阵搜索,搜到了很多相关的文章。其中绝大部分文章都是使用的Lodop5.0(Web打印和套打控件)控件,而且...
  • 打印预览&打印 样式

    2012-12-02 02:30:29
    这是一个可以帮助你实现 打印预览&打印 的样式. 几个月前的项目中遇到这样的需求时开发的, 这几天又遇到同样的需求. 就将这个整理了一下发到这里来. 别光看运行代码的效果页, 试试这个页面的打印或打印预览. ...
  • 在MFC中手动实现打印功能很麻烦,如果不需要打印预览功能,可以直接用office文件作为打印模板,在程序中直接打印文件,这样实现简单方便,这种方案对于经常需要更改模板内容的话,还是一个不错的选择。在Winform中...
  • 我用的jquery.print-preview.js插件,但是只能打印预览一张, 如果数据多的话,就预览两张,但是这个插件不能实现,求帮助
  • C# PrintDocument 打印 和 打印预览

    万次阅读 2017-09-13 11:08:35
    /// 打印,打印预览      ///      public   class  PrintHelper   {    //以下用户可自定义     //当前要打印文本的字体及字号     private   const   int  HeadHeight = ...
  • 因项目里要做页面打印预览以及打印功能,还要求兼容大部分主流浏览器 实现方式有很多最后决定用window.print();大部分浏览器都适用, window.print()方式ie浏览器不支持打印预览,针对ie浏览器的预览用ie自有打印...
  • JS 实现浏览器打印、打印预览

    千次阅读 2017-02-28 10:18:37
    目前正在做浏览器端采用JS方式实现打印这么一个功能,JS打印实现的方法很多,但是兼容各个浏览器实现打印预览的功能有些棘手,现将实现的内容及遇到的问题记录下来,希望有大牛看到所提的问题后可以给予解答,在此...
  • 在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是...3 打印预览 ...
  • ASP.net MVC ActiveReport 跳过打印预览直接打印
  • DELPHI 打印预览功能

    千次阅读 2013-05-16 13:43:53
    在很多应用程序中,都需要程序具有打印预览功能,以避免用户由于选择不当出现打印错误。  预览实现方式为通过创建一个Tpanel的派生类并公开它的canvas属性比例尺或视区范围,使用较为不方便,笔者通过实践实现了用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,991
精华内容 22,396
关键字:

对于打印预览