none
求教 PrintController.CreatePrintPageEvent(PageSettings pageSettings) 中存在的一个错误! RRS feed

  • 问题

  • 我使用的打印机存在不可打印的边界,在使用 PrintPreviewDialog 时,发现总是忽略了不可打印边界,将打印内容放在最左上角。

    检查代码,发现PrintDocument.DefaultPageSettings 存在不为0 的 HardMarginX HardMarginY 两个参数,但是在 PrintController.CreatePrintPageEvent(PageSettings pageSettings) 方法中计算 MarginBounds 时,未计入此两参数,造成此错误现象。

    参见代码 PrintController.cs Line 153:

            private PrintPageEventArgs CreatePrintPageEvent(PageSettings pageSettings) {
                IntSecurity.AllPrintingAndUnmanagedCode.Assert();
    
                Debug.Assert(modeHandle != IntPtr.Zero, "modeHandle is null.  Someone must have forgot to call base.StartPrint"); 
    
     
                Rectangle pageBounds = pageSettings.GetBounds(modeHandle); 
                Rectangle marginBounds = new Rectangle(pageSettings.Margins.Left,
                                                       pageSettings.Margins.Top, 
                                                       pageBounds.Width - (pageSettings.Margins.Left + pageSettings.Margins.Right),
                                                       pageBounds.Height - (pageSettings.Margins.Top + pageSettings.Margins.Bottom));
    
                PrintPageEventArgs pageEvent = new PrintPageEventArgs(null, marginBounds, pageBounds, pageSettings); 
                return pageEvent;
            } 


    Charles


    2013年9月16日 9:12

全部回复

  • 我使用的打印机存在不可打印的边界,在使用 PrintPreviewDialog 时,发现总是忽略了不可打印边界,将打印内容放在最左上角。

    意思是页面边框在预览时不见了,同时打印内容跑到左上角了吧?

    请尝试设置 DefaultPageSettings.PaperSize 属性,请参考:

    http://www.cnblogs.com/smallsoftfox/archive/2012/06/27/2566443.html

    关于设置打印范围,请参考:

    http://blog.csdn.net/zhuzhao/article/details/3604731

    由于你没有提供完整代码,而且我这边硬件条件有限,不能对你的代码做测试。你可以照着这些网上的方法来修改下你的代码,多尝试一下,PrintDocument这个东西就是需要对页面设置微调才行。


    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2013年9月17日 7:35
    版主
  • 我想说的是存在如下图的现象:

    我在PrintPreview和Print都使用同样的创建PrintDocument对象的方法。在PrintPreviewDialog显示时被忽略了Hard Margin。这是否是PrintPreviewDialog的一个缺陷?如何解决?

    解决方案应区分PrintAction为PrintToPreview和PrintToPrinter。你给的第二个链接例子虽然能在Preview中将左上角置于PrintableArea内,但是在实际打印时会在左上角有多余Offiset,且丢弃右下角的内容。


    Charles

    2013年9月18日 10:22