C#RichTextBoxコントロールの内容を印刷する方法

8146 ワード


 

本タスクの内容

  • サマリ
  • RichTextBox PrintCtrlコントロールの作成
  • テストコントロール

  • リファレンス

  • 概要

    この手順では、印刷方法について説明します.
    RichTextBoxコントロールの内容.
    RichTextBoxコントロールには、RichTextBoxコンテンツを印刷する方法はありません.拡張可能
    RichTextBoxクラスEM_を使用FORMATRANGEメッセージは
    RichTextBoxコントロールの内容は、プリンタなどの出力デバイスに送信されます.
    先頭に戻る

    RichTextBox PrintCtrlコントロールの作成

    次の例では、拡張方法について説明します.
    RichTextBoxクラス、EMの使用方法FORMATRANGE印刷
    RichTextBoxコントロールの内容.
  • はVisual C#にあります.NETでは、RichTextBox PrintCtrlというクラスライブラリプロジェクトを新規作成します.デフォルトではClass 1が作成されます.cs.
  • Class 1.csの名前はRichTextBox PrintCtrlに変更されました.cs.
  • ソリューションエクスプローラで、「参照」を右クリックし、「参照の追加」をクリックします.
  • [参照を追加]ダイアログボックスで、[System.Drawing.dll]と[System.Windows.Forms.dll]をダブルクリックし、[OK]をクリックします.
  • RichTextBoxPrintCtl.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();
    		}
    
    	}
    }
  • のコードに置き換えられます.
  • [生成]メニューで[ソリューションを生成]をクリックしてRichTextBox PrintCtrlを作成する.dll.

  • 先頭に戻る

    テストコントロール

  • はVisual C#にあります.NETで新しいWindowsアプリケーションプロジェクトを作成します.デフォルトではForm 1が作成されます.cs.
  • ボタンコントロールをツールボックスからForm 1にドラッグします.NameプロパティをbtnPageSetupに変更し、Textプロパティをページ設定に変更します.
  • 別のボタンコントロールをツールボックスからForm 1にドラッグします.NameプロパティをbtnPrintPreviewに変更し、Textプロパティを印刷プレビューに変更します.
  • 別のボタンコントロールをツールボックスからForm 1にドラッグします.NameプロパティをbtnPrintに変更し、Textプロパティを印刷に変更します.
  • ツールボックスで、PrintDialog、PrintPreviewDialog、PrintDocument、PageSetup Dialogをダブルクリックして、これらのコントロールをForm 1に追加します.
  • PrintDialog 1、PrintPreviewDialog 1、PageSetup Dialog 1コントロールのDocumentプロパティをPrintDocument 1に変更します.
  • [ツール](Tools)メニューで[ツールボックスをカスタマイズ](Customize Tool Box)をクリックします.
  • 「.NET Frameworkコンポーネント」タブで、「参照」をクリックし、「RichTextBox PrintCtrl.dll」をクリックして選択し、「OK」をクリックします.
  • RichTextBox PrintCtrlをツールボックスからForm 1にドラッグします.
  • ソリューションエクスプローラでForm 1を右クリックします.csをクリックし、「コードの表示」をクリックします.
  • 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);
  • 次のコードをForm 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;
    		}
  • 「デバッグ」メニューで、「起動」をクリックしてアプリケーションを実行します.Form 1が表示されます.
  • RichTextBox PrintCtrlにテキストを入力します.
  • [ページ設定]をクリックしてページ設定を設定します.
  • [印刷プレビュー]をクリックして、ページの印刷プレビューを表示します.
  • [印刷]をクリックして[RichTextBox PrintCtrl]の内容を印刷します.