Управление предварительным просмотром печати, используемое в пользовательском диалоге предварительного просмотра - PullRequest
1 голос
/ 25 марта 2010

Я успешно реализовал печать и предварительный просмотр для своего приложения с использованием классов .NET PrintDocument, PrintDialog и PrintPreviewDialog.

Однако мое приложение использует инструментарий для улучшения внешнего вида стандартных элементов управления .NET. В наборе инструментов есть версии большинства элементов управления .NET, но нет ни одного для элементов управления печатью.

Поэтому, чтобы убедиться, что внешний вид этих элементов управления соответствует остальной части приложения, я создаю собственный PrintPreviewDialog на основе формы набора инструментов и встраиваю в него .NET PrintPrewviewControl.

Моя проблема в том, что PrintPreviewControl всегда показывает «Нет страниц для отображения». У меня не было проблем, чтобы заставить это работать, используя .NET PrintPreviewDialog и не вижу, что я делаю неправильно.

Это .NET 2.0 PrintPreviewControl, и поэтому я знаю, что мне нужно вызвать InvalidatePreview () после назначения PrintDocument. Однако, кажется, не имеет значения, где я его размещаю, обработчик событий 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 Ответ

2 голосов
/ 25 марта 2010

Я немного озадачен этой строкой:

  m_printPreviewControl = new PrintPreviewControl();

Вы, кажется, не прикрепляете и не позиционируете этот элемент управления.

Если вы поместили его в Designer, эту строку следует удалить, и вы должны везде использовать имя элемента управления designtime.

Если вы хотите создать его вручную, вам нужно хотя бы что-то вроде this.Controls.Add(m_printPreviewControl );

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...