Csharp/C Sharp by API/System.Windows.Forms/PrintDialog

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

new PrintDialog()

<source lang="csharp">

/* Code revised from chapter 7

GDI+ Custom Controls with Visual C# 2005 By Iulian Serban, Dragos Brezoi, Tiberiu Radu, Adam Ward Language English Paperback 272 pages [191mm x 235mm] Release date July 2006 ISBN 1904811604 Sample chapter http://www.packtpub.ru/files/1604_CustomControls_SampleChapter.pdf

For More info on GDI+ Custom Control with Microsoft Visual C# book visit website www.packtpub.ru

  • /

using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Drawing.Printing; namespace PrintingCustomControlApp1 {

   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       private void button1_Click(object sender, EventArgs e)
       {
           printableRichTextBox1.Print(false);
       }
       private System.ruponentModel.IContainer components = null;
       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
       protected override void Dispose(bool disposing)
       {
           if (disposing && (components != null))
           {
               components.Dispose();
           }
           base.Dispose(disposing);
       }
       #region Windows Form Designer generated code
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           this.printableRichTextBox1 = new PrintingCustomControlApp1.PrintableRichTextBox();
           this.button1 = new System.Windows.Forms.Button();
           this.SuspendLayout();
           // 
           // printableRichTextBox1
           // 
           this.printableRichTextBox1.Location = new System.Drawing.Point(77, 25);
           this.printableRichTextBox1.Name = "printableRichTextBox1";
           this.printableRichTextBox1.Size = new System.Drawing.Size(124, 117);
           this.printableRichTextBox1.TabIndex = 0;
           this.printableRichTextBox1.Text = "";
           // 
           // button1
           // 
           this.button1.Location = new System.Drawing.Point(63, 191);
           this.button1.Name = "button1";
           this.button1.Size = new System.Drawing.Size(126, 30);
           this.button1.TabIndex = 1;
           this.button1.Text = "Print the Control text";
           this.button1.UseVisualStyleBackColor = true;
           this.button1.Click += new System.EventHandler(this.button1_Click);
           // 
           // Form1
           // 
           this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
           this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
           this.ClientSize = new System.Drawing.Size(292, 266);
           this.Controls.Add(this.button1);
           this.Controls.Add(this.printableRichTextBox1);
           this.Name = "Form1";
           this.Text = "Form1";
           this.ResumeLayout(false);
       }
       #endregion
       private PrintableRichTextBox printableRichTextBox1;
       private System.Windows.Forms.Button button1;
       [STAThread]
       static void Main()
       {
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           Application.Run(new Form1());
       }
   }
   public partial class PrintableRichTextBox : RichTextBox
   {
       public PrintableRichTextBox()
       {
           InitializeComponent();
           _prtdoc = new PrintDocument();
           _prtdoc.PrintPage += new PrintPageEventHandler(_prtdoc_PrintPage);
       }
       string _text = null;
       int _pageNumber = 0;
       int _start = 0;
       PrintDocument _prtdoc = null;
       private bool DrawText(Graphics target, Graphics measurer, RectangleF r, Brush brsh)
       {
           if (r.Height < this.Font.Height)
               throw new ArgumentException("The rectangle is not tall enough to fit a single line of text inside.");
           int charsFit = 0;
           int linesFit = 0;
           int cut = 0;
           string temp = _text.Substring(_start);
           StringFormat format = new StringFormat(StringFormatFlags.FitBlackBox | StringFormatFlags.LineLimit);
           //measure how much of the string we can fit into the rectangle
           measurer.MeasureString(temp, this.Font, r.Size, format, out charsFit, out linesFit);
           cut = BreakText(temp, charsFit);
           if (cut != charsFit)
               temp = temp.Substring(0, cut);
           bool h = true;
           h &= true;
           target.DrawString(temp.Trim(" "), this.Font, brsh, r, format);
           _start += cut;
           if (_start == _text.Length)
           {
               _start = 0; //reset the location so we can repeat the document
               return true; //finished printing
           }
           else
               return false;
       }
       private static int BreakText(string text, int approx)
       {
           if (approx == 0)
               throw new ArgumentException();
           if (approx < text.Length)
           {
               //are we in the middle of a word?
               if (char.IsLetterOrDigit(text[approx]) && char.IsLetterOrDigit(text[approx - 1]))
               {
                   int temp = text.LastIndexOf(" ", approx, approx + 1);
                   if (temp >= 0)
                       return temp;
               }
           }
           return approx;
       }
       public void Print(bool hardcopy)
       {
           _text = this.Text;
           //create a PrintDialog based on the PrintDocument
           PrintDialog pdlg = new PrintDialog();
           pdlg.Document = _prtdoc;
           //show the PrintDialog
           if (pdlg.ShowDialog() == DialogResult.OK)
           {
               //create a PageSetupDialog based on the PrintDocument and PrintDialog
               PageSetupDialog psd = new PageSetupDialog();
               psd.EnableMetric = true; //Ensure all dialog measurements are in metric
               psd.Document = pdlg.Document;
               //show the PageSetupDialog
               if (psd.ShowDialog() == DialogResult.OK)
               {
                   //apply the settings of both dialogs
                   _prtdoc.DefaultPageSettings = psd.PageSettings;
                   //decide what action to take
                   if (hardcopy)
                   {
                       //actually print hardcopy
                       _prtdoc.Print();
                   }
                   else
                   {
                       //preview onscreen instead
                       PrintPreviewDialog prvw = new PrintPreviewDialog();
                       prvw.Document = _prtdoc;
                       prvw.ShowDialog();
                   }
               }
           }
       }
       private void _prtdoc_PrintPage(object sender, PrintPageEventArgs e)
       {
           e.Graphics.Clip = new Region(e.MarginBounds);
           //this method does all our printing work
           Single x = e.MarginBounds.Left;
           Single y = e.MarginBounds.Top;
           if (_pageNumber++ == 0)
               y += 30;
           RectangleF mainTextArea = RectangleF.FromLTRB(x, y, e.MarginBounds.Right, e.MarginBounds.Bottom);
           //draw the text
           if (DrawText(e.Graphics, e.PageSettings.PrinterSettings.CreateMeasurementGraphics(), mainTextArea, Brushes.Black))
           {
               e.HasMorePages = false; //the end has been reached
               _pageNumber = 0;
           }
           else
               e.HasMorePages = true;
       }
       private System.ruponentModel.IContainer components = null;
       /// <summary> 
       /// Clean up any resources being used.
       /// </summary>
       /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
       protected override void Dispose(bool disposing)
       {
           if (disposing && (components != null))
           {
               components.Dispose();
           }
           base.Dispose(disposing);
       }
       #region Component Designer generated code
       /// <summary> 
       /// Required method for Designer support - do not modify 
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       {
           components = new System.ruponentModel.Container();
           //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       }
       #endregion
   }
   

}


 </source>


PrintDialog.Document

<source lang="csharp"> using System; using System.Drawing; using System.Windows.Forms; using System.Drawing.Printing; public class PrintDialogPrint : Form {

   public PrintDialogPrint()
   {
       this.cmdPrint = new System.Windows.Forms.Button();
       this.SuspendLayout();
       // 
       this.cmdPrint.Location = new System.Drawing.Point(109, 122);
       this.cmdPrint.Size = new System.Drawing.Size(75, 23);
       this.cmdPrint.Text = "Print";
       this.cmdPrint.UseVisualStyleBackColor = true;
       this.cmdPrint.Click += new System.EventHandler(this.cmdPrint_Click);
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.ClientSize = new System.Drawing.Size(272, 260);
       this.Controls.Add(this.cmdPrint);
       this.Text = "Simple Print";
       this.ResumeLayout(false);
   }
   private void cmdPrint_Click(object sender, EventArgs e)
   {
       PrintDocument doc = new PrintDocument();
       doc.PrintPage += this.Doc_PrintPage;
       PrintDialog dlgSettings = new PrintDialog();
       dlgSettings.Document = doc;
       if (dlgSettings.ShowDialog() == DialogResult.OK)
       {
           doc.Print();
       }
   }
   private void Doc_PrintPage(object sender, PrintPageEventArgs e)
   {
       Font font = new Font("Arial", 30);
       
       float x = e.MarginBounds.Left;
       float y = e.MarginBounds.Top;
       float lineHeight = font.GetHeight(e.Graphics);
       for (int i = 0; i < 5; i++)
       {
           e.Graphics.DrawString("This is line " + i.ToString(),font, Brushes.Black, x, y);
           y += lineHeight;
       }
       y += lineHeight;
       e.Graphics.DrawImage(Image.FromFile("c:\\YourFile.bmp"), x, y);
       
   }
   [STAThread]
   static void Main()
   {
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
       Application.Run(new PrintDialogPrint());
   }
   private System.Windows.Forms.Button cmdPrint;
   

}

 </source>