C # WinForm PrintPreviewDialog: предварительный просмотр для отображения нескольких меток на странице - PullRequest
1 голос
/ 28 апреля 2011

У меня есть WinForm для создания ярлыков.

Он вызывает PrintPreviewDialog и отображает информацию, используя PrintPageEventArgs в PrintDocument PrintPageEventHandler.

void Document_Printed(object sender, PrintPageEventArgs e) {
  // Code goes here
}

Если метка представляет собой небольшую метку адреса, идущую к букве 8,5х11, вместо того, чтобы видеть одну метку в PrintPreviewDialog, я хочу увидеть количество меток, подходящих для этой PageSettings.PaperSize.

Пример: скажем, четыре (4) элемента помещаются на выбранный носитель (этикетка принтера Avery или что-либо еще).

  • Если мой Конечный пользователь указывает от 1 до 4 копий для печати, я хочу, чтобы мойДиалоговое окно предварительного просмотра для отображения всех копий.

  • Если мой конечный пользователь указывает более четырех (4) элементов, диалоговое окно предварительного просмотра печати должно отображать несколько страниц (ранее я никогда не занимался несколькими страницами)).

Я могу измерить свои данные, чтобы они соответствовали размеру моего ярлыка, но я не знаю, как заставить мой PrintPageEventHandler отображать более 1 ярлыка на PrintPreviewDialog.

Может кто-нибудь показать мне, как это делается?Как отобразить и напечатать несколько ярлыков (документов?) На листе?

РЕДАКТИРОВАТЬ: Вот мой код, который основан на 2 объектах RectangleF: pageRect и LabelRect:

void Document_Printed(object sender, PrintPageEventArgs e) {
  if (printPreview == null) return;
  int labelSupport = 1;
  RectangleF pageRect = new RectangleF(0, 0, printPreview.Document.DefaultPageSettings.PaperSize.Width, printPreview.Document.DefaultPageSettings.PaperSize.Height);
  float fW = (pageRect.Width < LabelRect.Width) ? (pageRect.Width / LabelRect.Width) : (LabelRect.Width / pageRect.Width);
  float fH = (pageRect.Height < LabelRect.Height) ? (pageRect.Height / LabelRect.Height) : (LabelRect.Height / pageRect.Height);
  // START Portion I need HELP with!
  if (1 < LabelsPerPage) {
    if (Landscape) {
    } else {
    }
  } else {
    if (Landscape) {
    } else {
    }
  }
  // END (I think) Portion I need HELP with!
  SizeF ratio = new SizeF(fW, fH);
  Graphics G = e.Graphics;
  foreach (Label item in labelList) {
    Console.WriteLine(item.Name);
    using (SolidBrush b = new SolidBrush(Color.Black)) {
      using (Pen p = new Pen(b)) {
        float x = ratio.Width * (float)item.Location.X;
        float y = ratio.Height * (float)item.Location.Y;
        float w = ratio.Width * (float)item.Size.Width;
        float h = ratio.Height * (float)item.Size.Height;
        RectangleF r = new RectangleF(x, y, w, h);
        G.DrawString(item.Text, item.Font, b, r);
      }
    }
  }
}

РЕДАКТИРОВАТЬ 2: Мне нужен способ печати 2 или более документов на 1 странице.Ничто еще не решило этот ключевой момент.Это тот ответ, который мне нужен.

1 Ответ

1 голос
/ 28 апреля 2011

Печать страниц после первой действительно очень проста: просто установите для свойства PrintPageEventArgs HasMorePages значение true.

Хитрая часть знает, когда остановить это, установив для HasMorePages значение false. Я сделал это, сохранив данные для каждого задания на печать в Списке и используя индексное значение, чтобы отследить, где я нахожусь в этом списке.

Каждый раз, когда происходит событие PrintPage, я увеличиваю свой индекс, который я использую в своем Списке, чтобы передать событию PrintPage сведения о странице, которую я хочу распечатать, и если я нахожусь на последнем элементе, я устанавливаю значение HasMorePages в false. 1008 *

void Document_Printed(object sender, PrintPageEventArgs e) { 
   // Get data for this page.
   //xxx =  pageDataList[indexValue];

   // Code to print stuff.

   indexValue++;
   e.HasMorePages = (pageDataList.Length == indexValue);
}

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

...