Αναγν. άρθρου: 812425 - Τελευταία αναθεώρηση: Τετάρτη, 22 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0

Με τον τρόπο εκτύπωσης του περιεχομένου ενός στοιχείου ελέγχου RichTextBox χρησιμοποιώντας το Visual C# .NET ή Visual C# 2005

Συμβουλή συστήματοςΑυτό το άρθρο ισχύει για διαφορετικό λειτουργικό σύστημα από αυτό που χρησιμοποιείτε. Το περιεχόμενο του άρθρου που ενδέχεται να μην σας αφορά έχει απενεργοποιηθεί.
Για την έκδοση Microsoft Visual Basic .NET αυτού του άρθρου, ανατρέξτε στην ενότητα811401  (http://support.microsoft.com/kb/811401/EN-US/ ) .

Σε αυτήν τη σελίδα

Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Αυτό το άρθρο βήμα προς βήμα περιγράφει τον τρόπο εκτύπωσης του περιεχομένου ενόςRichTextBoxControl. Για ναRichTextBoxστοιχείο ελέγχου δεν παρέχει μέθοδο για να εκτυπώσετε τα περιεχόμενα του RichTextBox. Μπορείτε να επεκτείνετε τοRichTextBoxκλάση για μήνυμα EM_FORMATRANGE την αποστολή του περιεχομένου ενόςRichTextBoxΈλεγχος σε μια συσκευή εξόδου, όπως εκτυπωτή.

Δημιουργία στοιχείου ελέγχου RichTextBoxPrintCtrl

Το ακόλουθο δείγμα περιγράφει πώς μπορείτε να επεκτείνετε τοRichTextBoxκλάση και τον τρόπο χρήσης EM_FORMATRANGE για την εκτύπωση του περιεχομένου τουRichTextBoxControl.
  1. Στη Visual C# .NET ή Visual C# 2005, δημιουργήστε ένα νέο έργο βιβλιοθήκη κλάσης που ονομάζεται RichTextBoxPrintCtrl. Από προεπιλογή, δημιουργείται Class1.cs.
  2. Αλλάξτε το όνομα του Class1.cs σε RichTextBoxPrintCtrl.cs.
  3. Στην Εξερεύνηση των λύσεων, κάντε δεξιό κλικΑναφορές, και στη συνέχεια κάντε κλικ στο κουμπίΠροσθήκη αναφοράς.
  4. ΣτοΠροσθήκη αναφοράςπαράθυρο διαλόγου, κάντε διπλό κλικSystem.drawing.dllANDSystem.windows.forms.dll, και στη συνέχεια κάντε κλικ στο κουμπίOk.
  5. Αντικατάσταση του υπάρχοντος κώδικα στο RichTextBoxPrintCtrl.cs με τον ακόλουθο κώδικα:
    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. Στο διακομιστήΔημιουργίαμενού, κάντε κλικ στο κουμπίΔημιουργία λύσεωνΓια να δημιουργήσετε RichTextBoxPrintCtrl.dll.

Δοκιμή του στοιχείου ελέγχου

  1. Στη Visual C# .NET ή Visual C# 2005, δημιουργήστε μια νέα εφαρμογή Windows έργου. Από προεπιλογή, δημιουργείται Form1.cs.

    ΣΗΜΕΙΩΣΗΟ κωδικός πρέπει να αλλάξει στο Visual Studio 2005. Όταν δημιουργείτε ένα έργο Windows Forms, Visual C# προσθέτει μία μορφή του έργου από προεπιλογή. Η φόρμα αυτή ονομάζεται Φόρμα1. Τα δύο αρχεία που αντιπροσωπεύει τη φόρμα ονομάζονται Form1.cs και Form1.designer.cs. Συντάξτε τον κώδικά σας στο Form1.cs. Το αρχείο Designer.cs είναι όπου η σχεδίαση φορμών του Windows εγγράφει τον κώδικα που υλοποιεί τις ενέργειες που εκτελέσατε, προσθέτοντας στοιχεία ελέγχου. Για περισσότερες πληροφορίες σχετικά με τη σχεδίαση φορμών Windows στο Visual C# 2005, επισκεφθείτε την ακόλουθη τοποθεσία της Microsoft στο Web:
    http://msdn2.Microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
  2. Σύρετε έναΚουμπίστοιχείο ελέγχου από την εργαλειοθήκη θα Φόρμα1. Αλλαγή τουNAMEη ιδιότητα ναbtnPageSetupκαι τοTextη ιδιότητα ναΔιαμόρφωση σελίδας.
  3. Σύρετε μια άλληΚουμπίστοιχείο ελέγχου από την εργαλειοθήκη θα Φόρμα1. Αλλαγή τουNAMEη ιδιότητα ναbtnPrintPreviewκαι τοTextη ιδιότητα ναΠροεπισκόπηση εκτύπωσης.
  4. Σύρετε μια άλληΚουμπίστοιχείο ελέγχου από την εργαλειοθήκη θα Φόρμα1. Αλλαγή τουNAMEη ιδιότητα ναbtnPrintκαι τοTextη ιδιότητα ναΕκτύπωση.
  5. Στην εργαλειοθήκη, κάντε διπλό κλικPrintDialog,PrintPreviewDialog,PrintDocumentANDPageSetupDialogΓια να προσθέσετε αυτά τα στοιχεία ελέγχου Φόρμα1.
  6. Τροποποίηση τουΈγγραφοΙδιότητες από τοPrintDialog1Για ναPrintPreviewDialog1και τοPageSetupDialog1τα στοιχεία ελέγχουPrintDocument1.
  7. Στο διακομιστήΕργαλείαμενού, κάντε κλικ στο κουμπίΠροσαρμογή εργαλειοθήκη στοιχείων ελέγχου.
  8. Στο διακομιστή.NET framework στοιχείωνκαρτέλα, κάντε κλικ στο κουμπίΑναζήτηση, κάντε κλικ για να επιλέξετεRichTextBoxPrintCtrl.dll, και στη συνέχεια κάντε κλικ στο κουμπίOk.
  9. Σύρετε το ποντίκιRichTextBoxPrintCtrlαπό την εργαλειοθήκη να Φόρμα1.
  10. Στην Εξερεύνηση των λύσεων, κάντε δεξιό κλικForm1.CS, και στη συνέχεια κάντε κλικ στο κουμπίΠροβολή κώδικα.
  11. Προσαρτήστε τον ακόλουθο κώδικα για τοInitializeComponentΗ μέθοδος:
    		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. Προσθέστε τον ακόλουθο κώδικα στην κλάση Φόρμα1:
    		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. Στο διακομιστήΟ εντοπισμός σφαλμάτωνμενού, κάντε κλικ στο κουμπίStartΓια να εκτελέσετε την εφαρμογή. Εμφανίζεται το παράθυρο Φόρμα1.
  14. Πληκτρολογήστε κείμενο στο RichTextBoxPrintCtrl.
  15. Κάντε κλικΔιαμόρφωση σελίδαςΓια να ορίσετε τις ρυθμίσεις της σελίδας.
  16. Κάντε κλικΠροεπισκόπηση εκτύπωσηςΓια να προβάλετε την προεπισκόπηση εκτύπωσης της σελίδας.
  17. Κάντε κλικΕκτύπωσηΓια να εκτυπώσετε το περιεχόμενο της RichTextBoxPrintCtrl.

Αναφορές

Για περισσότερες πληροφορίες, ανατρέξτε στο ακόλουθο θέμα με την τεκμηρίωση του Microsoft .NET Framework SDK:
Κλάση RichTextBox
.aspx http://msdn2.Microsoft.com/en-us/library/System.Windows.Forms.richtextbox (vs.71) (http://msdn2.microsoft.com/en-us/library/system.windows.forms.richtextbox(vs.71).aspx)


Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
Λέξεις-κλειδιά: 
kbprint kbwindowsforms kbinheritance kbctrl kbcontrol kbhowtomaster kbhowto kbmt KB812425 KbMtel
Μηχανικά μεταφρασμένοΜηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:812425  (http://support.microsoft.com/kb/812425/en-us/ )