2013-09-05 3 views
0

Я хочу напечатать два изображения на одной странице. Я пробовал под кодом, но он печатает все изображения на разных страницах.печать двух изображений на одной странице C#

public void PD_PrintPage(object sender, PrintPageEventArgs e) 
    { 

     float W = e.MarginBounds.Width; 

     float H = e.MarginBounds.Height; 

     for (; FileCounter >= 0; FileCounter--) 
     { 

      try 
      { 

       Bitmap Bmp = new Bitmap(BmpFiles[FileCounter]); 

       if (Bmp.Width/W < Bmp.Height/H) 

        W = Bmp.Width * H/Bmp.Height; 

       else 
        H = Bmp.Height * W/Bmp.Width; 

       e.Graphics.DrawImage(Bmp, 0, 0, W, H); 

       break; 

      } 

      catch 
      { 

      } 

     } 

     FileCounter -= 1; 

     if (FileCounter > 0) 
     { 

      e.HasMorePages = true; 

     } 

     else 
     { 

      FileCounter = BmpFiles.Length - 1; 

     } 

    } 

это будет печатать все изображения в другой странице

Я хочу, чтобы некоторые функции, которые будут печатать одно изображение, оставить некоторое пространство и снова Прайн другое изображение в той же странице, если пространство осталось.

ответ

0

Работа с printDocument такова: Сначала программа достигает функции printPage, считывает весь код и в конце функции, если существует строка e.hasMorePages = true; , то программа снова вводит функцию с начала и снова считывает коды для ее печати на следующую страницу и продолжается до тех пор, пока не прочитает строку e.hasMorepages = false. Поэтому вам не нужно вводить цикл внутри функции. То, что вы должны сделать, это переменные внутри класса, и растет в цене или уменьшить переменную, чтобы условие, которое удовлетворяет e.hasMorePages = FALSE после вашего задания печати закончила ..

public void PD_PrintPage(object sender, PrintPageEventArgs e) 
{ 

    float W = e.MarginBounds.Width; 

    // if you are calculating the whole page margin, then split it to carry 2 images 

    float H = e.MarginBounds.Height/2; 

    // for space btwn images 

    H -= 5.0; 

    // First Image 
     try 
     { 

      Bitmap Bmp = new Bitmap(BmpFiles[FileCounter]); 

      if (Bmp.Width/W < Bmp.Height/H) 

       W = Bmp.Width * H/Bmp.Height; 

      else 
       H = Bmp.Height * W/Bmp.Width; 

      e.Graphics.DrawImage(Bmp, 0, 0, W, H); 

      break; 

     } 

     catch 
     { 

     } 

     FileCounter --; 
     if (FileCounter < 0) goto goDaddy; 

    //Second Img 
     try 
     { 

      Bitmap Bmp = new Bitmap(BmpFiles[FileCounter]); 

      if (Bmp.Width/W < Bmp.Height/H) 

       W = Bmp.Width * H/Bmp.Height; 

      else 
       H = Bmp.Height * W/Bmp.Width; 

      e.Graphics.DrawImage(Bmp, 0, H + 2.5, W, H); 

      break; 

     } 

     catch 
     { 

     }   

    FileCounter --; 

goDaddy:; 
    e.HasMorePages = (FileCounter >= 0) 


} 

Я не проверял код, но просто попробуйте показать вам концепцию.

1

В вашем коде вы печатаете только одно изображение на страницу, потому что вы оставите цикл с break-statement в конце try. Вместо того, чтобы использовать break без условия, вы должны выйти из цикла динамически на основе решения, если можно напечатать только одно изображение (не достаточное пространство для второго изображения), чтобы разделить два изображения (вы достигли того, что вы хотели).

//for-loop for printing maximum two images as long as there are files to print 
    for (int i = 0; i < 2 && FileCounter >= 0; i++) 
    { 

     //here comes your printing code just indicated with the draw-call 

     e.Graphics.DrawImage(Bmp, 0, 0, W, H); 

     //after a image was printed decrement your filecounter 
     FileCounter --; 

     //after a image was drawn check if there is enough space for the next image 
     //if there is not enough space leave the loop with break 
     if(condition) 
      break; 
    } 

На данный момент у меня не хватает репутации для комментирования что-то на этой странице ... так: никогда не использовать «Goto», как «Sayka» предлагает в своем ответе. Это действительно плохой стиль & кодирование

+0

Как проверить, достаточно места для следующего изображения – User5590

+0

У вас есть свойство PageBounds в EventArguments. Они представляют общую площадь страницы. Вы также знаете, каков ваш образ. Все остальное - всего лишь математика. Помните, что 0; 0 находится в верхнем левом углу! Используйте вершину (или y) свойства и вычитайте высоту изображения с некоторым смещением, чтобы иметь место между изображениями. Затем проверьте, достаточно ли высоты для оставшейся области для вашего изображения. Также вы, возможно, должны оставить некоторое пространство на границах страницы. – Onsokumaru

+0

Обычно создание методов печати приводит к попыткам, если все подходит по желанию. Это нехорошо, но единственный способ получить вещи правильно. Использование pdf-принтера (например, freepdf) помогает в этом;) – Onsokumaru

0

Я нашел, что это работает очень хорошо, не теряет качество изображения, которое я испытывал с использованием потоков памяти.

private void printBothGraphs_Click(object sender, EventArgs e) 
    { 
     PrintPreviewDialog custom = new PrintPreviewDialog(); 
     custom.ClientSize = new Size(1000, 750); 

     System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument(); 


     pd.DefaultPageSettings.Color = true; 

     pd.PrintPage += new PrintPageEventHandler(pd_PrintPageBoth); 

     custom.Document = pd; 


     custom.ShowDialog(); 
    } 
    private void pd_PrintPageBoth(object sender, PrintPageEventArgs ev) 
    { 
     // Create and initialize print font 
     System.Drawing.Font printFont = new System.Drawing.Font("Arial", 10); 
     ev.PageSettings.Color = true; 
     // Create Rectangle structure, used to set the position of the chart Rectangle 
     Rectangle myRec = new System.Drawing.Rectangle(ev.MarginBounds.X, ev.MarginBounds.Y, ev.MarginBounds.Width, ev.MarginBounds.Height/2); 
     Rectangle myRec2 = new System.Drawing.Rectangle(ev.MarginBounds.X, ev.MarginBounds.Height/2 + 90, ev.MarginBounds.Width, ev.MarginBounds.Height/2); 
     //dataChart and outputGraph are two mscharts in my form 
     dataChart.Printing.PrintPaint(ev.Graphics, myRec); 
     outputGraph.Printing.PrintPaint(ev.Graphics, myRec2); 
    } 
Смежные вопросы