打印预览控件在自定义打印预览对话框中使用

时间:2010-03-25 11:02:28

标签: c# .net printing

我使用.NET的PrintDocument,PrintDialog和PrintPreviewDialog类成功地为我的应用程序实现了打印和打印预览。

但是我的应用程序使用工具包来改进标准.NET控件的外观。工具包中有大多数.NET控件的版本,但Print控件没有。

因此,为了确保这些控件的外观与应用程序的其余部分匹配,我将基于工具包表单创建自定义PrintPreviewDialog并在其中嵌入.NET PrintPrewviewControl。

我的问题是PrintPreviewControl始终显示“没有要显示的页面”。使用.NET PrintPreviewDialog让我无法正常工作,看不出我做错了什么。

这是一个.NET 2.0 PrintPreviewControl,因此我知道在分配PrintDocument后我需要调用InvalidatePreview()。但是,放置它的位置似乎并不重要,PrintPage事件处理程序永远不会被调用...

    public class PrintEngine
    {
          ...rest of class...

      public PrintEngine()
      {
         m_printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
      }

      public void PrintPreview()
      {
        //ORIGINAL CODE USING .NET DIALOG WORK OK
        //PrintPreviewDialog dlg1 = new PrintPreviewDialog();
        //dlg1.Document = m_printDoc;
        //PrepareImageForPrinting();
        //dlg1.ShowDialog();

        //CODE USING MY CUSTOM DIALOG DO NOT WORK?
        MyPrintPreviewDialog dlg2 = new MyPrintPreviewDialog();

        dlg2.Document = m_printDoc;

        PrepareImageForPrinting(); //Creates the m_printImage List

        dlg2.ShowDialog();
      }

      private void printDoc_PrintPage(object sender, PrintPageEventArgs e)
      {
        e.Graphics.DrawImage(m_printImages[m_currentPage], new Point(0, 0));

        m_currentPage++;

        e.HasMorePages = m_currentPage < m_pagesHigh;
      }

    }//end PrintEngine class

    public class MyPrintPreviewDialog : KryptonForm
    {
        public PrintDocument Document
        {
            get { return m_printPreviewControl.Document; }
            set
            { 
                m_printPreviewControl.Document = value;
                m_printPreviewControl.InvalidatePreview();
            }
        }

        public MyPrintPreviewDialog()
        {
          InitializeComponent();

          m_printPreviewControl = new PrintPreviewControl();

          m_printPreviewControl.StartPage = 0;
        }

        private void MyPrintPreviewDialog_Load(object sender, EventArgs e)
        {
          m_printPreviewControl.Document.DefaultPageSettings = new PageSettings();
          m_printPreviewControl.Document.PrinterSettings = new PrinterSettings();

          m_printPreviewControl.InvalidatePreview();
        }

    }//end MyPrintPreviewDialog class

1 个答案:

答案 0 :(得分:2)

我对这条线感到有些困惑:

  m_printPreviewControl = new PrintPreviewControl();

您似乎没有附加或定位此控件。

如果您使用Designer放置它,则应删除此行,并且您应该在任何地方使用设计时控件的名称。

如果您想手动创建它,则至少需要this.Controls.Add(m_printPreviewControl );