Makale numarası: 812425 - Son Gözden Geçirme: 13 Kasım 2007 Salı - Gözden geçirme: 3.4

RichTextBox denetiminin içeriği, Visual C# .NET veya Visual C# 2005 kullanarak yazdırma hakkında

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Bu makalenin Microsoft Visual Basic .NET sürümü için bkz: 811401  (http://support.microsoft.com/kb/811401/EN-US/ ) .

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu adım adım makalede, RichTextBox denetiminin içeriği yazdırmak açıklamaktadır. RichTextBox denetiminin RichTextBox içeriğini yazdırmak için başka bir yöntem sağlar. RichTextBox sınıfı EM_FORMATRANGE iletinin içeriği RichTextBox denetiminin yazıcı gibi bir çıktı aygıtına göndermek için kullanılacak genişletebilirsiniz.

RichTextBoxPrintCtrl denetim oluşturma

Aşağıdaki örnek, nasıl yapılır: RichTextBox sınıfını ve EM_FORMATRANGE RichTextBox denetiminin içeriği yazdırmak için nasıl kullanılacağını açıklar.
  1. Visual C# .NET veya Visual C# 2005 RichTextBoxPrintCtrl adlı yeni bir sınıf kitaplığı projesi oluşturun. Varsayılan olarak, Class1.cs oluşturulur.
  2. Class1.cs RichTextBoxPrintCtrl.cs için değiştirin.
  3. Solution Explorer'da (Çözüm Gezgini), Başvurular ' ı sağ tıklatın ve sonra Add Reference</a1>'ı tıklatın.
  4. Başvuru Ekle) iletişim kutusunda, System.Drawing.dll ve System.Windows.Forms.dll çift tıklatın ve sonra Tamam ' ı tıklatın.
  5. Replace the existing code in RichTextBoxPrintCtrl.cs with the following code:
    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Drawing.Printing;
    
    namespace RichTextBoxPrintCtrl
    {
    	public class RichTextBoxPrintCtrl:RichTextBox
    	{
    		//Convert the unit used by the .NET framework (1/100 inch) 
    		//and the unit used by Win32 API calls (twips 1/1440 inch)
    		private const double anInch = 14.4;
    
    		[StructLayout(LayoutKind.Sequential)] 
    			private struct RECT
    		{
    			public int Left;
    			public int Top;
    			public int Right;
    			public int Bottom;
    		}
    
    		[StructLayout(LayoutKind.Sequential)]
    			private struct CHARRANGE
    		{
    			public int cpMin;         //First character of range (0 for start of doc)
    			public int cpMax;           //Last character of range (-1 for end of doc)
    		}
    
    		[StructLayout(LayoutKind.Sequential)]
    			private struct FORMATRANGE
    		{
    			public IntPtr hdc;             //Actual DC to draw on
    			public IntPtr hdcTarget;       //Target DC for determining text formatting
    			public RECT rc;                //Region of the DC to draw to (in twips)
    			public RECT rcPage;            //Region of the whole DC (page size) (in twips)
    			public CHARRANGE chrg;         //Range of text to draw (see earlier declaration)
    		}
    
    		private const int WM_USER  = 0x0400;
    		private const int EM_FORMATRANGE  = WM_USER + 57;
    		
    		[DllImport("USER32.dll")]
    		private static extern IntPtr SendMessage (IntPtr hWnd , int msg , IntPtr wp, IntPtr lp); 
    
    		// Render the contents of the RichTextBox for printing
    		//	Return the last character printed + 1 (printing start from this point for next page)
    		public int Print( int charFrom, int charTo,PrintPageEventArgs e)
    		{
    			//Calculate the area to render and print
    			RECT rectToPrint; 
    			rectToPrint.Top = (int)(e.MarginBounds.Top * anInch);
    			rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch);
    			rectToPrint.Left = (int)(e.MarginBounds.Left * anInch);
    			rectToPrint.Right = (int)(e.MarginBounds.Right * anInch);
    
    			//Calculate the size of the page
    			RECT rectPage; 
    			rectPage.Top = (int)(e.PageBounds.Top * anInch);
    			rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch);
    			rectPage.Left = (int)(e.PageBounds.Left * anInch);
    			rectPage.Right = (int)(e.PageBounds.Right * anInch);
    
    			IntPtr hdc = e.Graphics.GetHdc();
    
    			FORMATRANGE fmtRange;
    			fmtRange.chrg.cpMax = charTo;				//Indicate character from to character to 
    			fmtRange.chrg.cpMin = charFrom;
    			fmtRange.hdc = hdc;                    //Use the same DC for measuring and rendering
    			fmtRange.hdcTarget = hdc;              //Point at printer hDC
    			fmtRange.rc = rectToPrint;             //Indicate the area on page to print
    			fmtRange.rcPage = rectPage;            //Indicate size of page
    
    			IntPtr res = IntPtr.Zero;
    
    			IntPtr wparam = IntPtr.Zero;
    			wparam = new IntPtr(1);
    
    			//Get the pointer to the FORMATRANGE structure in memory
    			IntPtr lparam= IntPtr.Zero;
    			lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange));
    			Marshal.StructureToPtr(fmtRange, lparam, false);
    
    			//Send the rendered data for printing 
    			res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam);
    
    			//Free the block of memory allocated
    			Marshal.FreeCoTaskMem(lparam);
    
    			//Release the device context handle obtained by a previous call
    			e.Graphics.ReleaseHdc(hdc);
    
    			//Return last + 1 character printer
    			return res.ToInt32();
    		}
    
    	}
    }
  6. Yapı) menüsünde tıklatın Build Solution RichTextBoxPrintCtrl.dll oluşturmak için.

Denetimi sınamak

  1. Visual C# .NET veya Visual C# 2005, yeni bir Windows uygulaması oluşturma proje. Varsayılan olarak, Form1.cs oluşturulur.

    Not Kod, Visual Studio 2005'te değiştirilmelidir. Windows Forms bir proje oluşturduğunuzda, Visual C# bir form projeye varsayılan olarak ekler. Bu formu Form1 ' dir. Form temsil eden iki dosya Form1.cs ve Form1.designer.cs olarak adlandırılır. Kodunuzu, Form1.cs içinde yazın. Burada Windows Form Designer denetimleri ekleyerek gerçekleştirilen tüm eylemleri gerçekleştiren kod yazma Designer.cs dosyasıdır. Visual C# 2005'te Windows Forms Tasarımcısı hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
    http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
  2. Araç kutusundan, bir Düğme denetimi Form1'e sürükleyin. Name özelliği, btnPageSetup ve Sayfa düzeni için <a2>Text</a2> özelliğini değiştirin.
  3. Araç kutusundan, başka bir Düğme denetimi Form1'e sürükleyin. Name özelliği, btnPrintPreview ve Baskı Önizleme için <a2>Text</a2> özelliğini değiştirin.
  4. Araç kutusundan, başka bir Düğme denetimi Form1'e sürükleyin. Name özelliği, btnPrint ve yazdırma için <a2>Text</a2> özelliğini değiştirin.
  5. Araç kutusunda, PrintDialogPrintPreviewDialog, PrintDocument ve PageSetupDialog'un bu denetimler Form1'e eklemek için çift tıklatın.
  6. PrintDialog1, PrintPreviewDialog1 ve PrintDocument1PageSetupDialog1 denetimlere belge özelliklerini değiştirin.
  7. Araçlar menüsünde Özelleştir araç.
  8. .NET Framework bileşenleri sekmesinde Gözat ' ı tıklatın, RichTextBoxPrintCtrl.dll seçmek için tıklatın ve sonra Tamam ' ı tıklatın.
  9. Araç kutusundan, RichTextBoxPrintCtrl Form1'e sürükleyin.
  10. Solution Explorer'da (Çözüm Gezgini), Form1.cs ' ı sağ tıklatın ve Kod Görüntüle</a1>'ı tıklatın.
  11. Aşağıdaki kod ınitializecomponent yöntemini ekleyin:
    		this.printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(this.printDocument1_BeginPrint);
    		this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);
    		this.btnPrint.Click += new System.EventHandler(this.btnPrint_Click);
    		this.btnPrintPreview.Click += new System.EventHandler(this.btnPrintPreview_Click);
    		this.btnPageSetup.Click += new System.EventHandler(this.btnPageSetup_Click);
  12. Form1 sınıfına aşağıdaki kodu ekleyin:
    		private int checkPrint;
    		private void btnPageSetup_Click(object sender, System.EventArgs e)
    		{
    			pageSetupDialog1.ShowDialog();
    		}
    
    		private void btnPrintPreview_Click(object sender, System.EventArgs e)
    		{
    			printPreviewDialog1.ShowDialog();
    		}
    
    		private void btnPrint_Click(object sender, System.EventArgs e)
    		{
    			if (printDialog1.ShowDialog() == DialogResult.OK)
    				printDocument1.Print();
    		}
    
    		private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
    		{
    			checkPrint = 0;
    		}
    
    		private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    		{
    			// Print the content of RichTextBox. Store the last character printed.
    			checkPrint = richTextBoxPrintCtrl1.Print(checkPrint, richTextBoxPrintCtrl1.TextLength, e);
    
    			// Check for more pages
    			if (checkPrint < richTextBoxPrintCtrl1.TextLength)
    				e.HasMorePages = true;
    			else
    				e.HasMorePages = false;
    		}
  13. Hata Ayıkla) menüsünde, uygulamayı çalıştırmak için Başlat ' ı tıklatın. Form1 görüntülenir.
  14. Bazı metinler RichTextBoxPrintCtrl içinde yazın.
  15. Sayfa ayarlarını ayarlamak için Sayfa Yapısı ' nı tıklatın.
  16. Sayfanın baskı önizlemeyi görüntülemek için Baskı Önizleme ' yi tıklatın.
  17. RichTextBoxPrintCtrl içeriğini yazdırmak için Yazdır ' ı tıklatın.

Referanslar

Ek bilgi için Microsoft .NET Framework SDK belgelerine de aşağıdaki konuya bakın:
RichTextBox sınıfı
http://msdn2.microsoft.com/en-us/library/system.windows.forms.richtextbox(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.richtextbox(vs.71).aspx)


Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
Anahtar Kelimeler: 
kbmt kbprint kbwindowsforms kbinheritance kbctrl kbcontrol kbhowtomaster kbhowto KB812425 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:812425  (http://support.microsoft.com/kb/812425/en-us/ )